[clang] Initial implementation of P2719 (PR #113510)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 23 17:29:22 PDT 2024
github-actions[bot] wrote:
<!--LLVM CODE FORMAT COMMENT: {clang-format}-->
:warning: C/C++ code formatter, clang-format found issues in your code. :warning:
<details>
<summary>
You can test this locally with the following command:
</summary>
``````````bash
git-clang-format --diff 2deb3a26fa47a4640962489e5473726d7a8bf12b 2da55a9d9db62e80cddd83f86e26d31537e571b5 --extensions h,cpp -- clang/test/SemaCXX/type-aware-new-constexpr.cpp clang/test/SemaCXX/type-aware-new-delete-arrays.cpp clang/test/SemaCXX/type-aware-new-delete-basic-free-declarations.cpp clang/test/SemaCXX/type-aware-new-delete-basic-in-class-declarations.cpp clang/test/SemaCXX/type-aware-new-delete-basic-resolution.cpp clang/include/clang/AST/Decl.h clang/include/clang/AST/ExprCXX.h clang/include/clang/AST/Stmt.h clang/include/clang/AST/Type.h clang/include/clang/Sema/Sema.h clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h clang/lib/AST/ASTImporter.cpp clang/lib/AST/Decl.cpp clang/lib/AST/DeclCXX.cpp clang/lib/AST/ExprCXX.cpp clang/lib/AST/Type.cpp clang/lib/CodeGen/CGExprCXX.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/lib/Sema/SemaCoroutine.cpp clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaDeclCXX.cpp clang/lib/Sema/SemaExprCXX.cpp clang/lib/Sema/SemaTemplate.cpp clang/lib/Serialization/ASTReaderStmt.cpp clang/lib/Serialization/ASTWriterStmt.cpp clang/test/CodeGenCXX/new.cpp clang/test/CodeGenCoroutines/coro-alloc-2.cpp clang/test/CodeGenCoroutines/coro-alloc.cpp clang/test/Modules/new-delete.cpp clang/test/SemaCXX/coroutine-alloc-4.cpp clang/test/SemaCXX/coroutine-allocs.cpp clang/test/SemaCXX/delete.cpp
``````````
</details>
<details>
<summary>
View the diff from clang-format here.
</summary>
``````````diff
diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h
index 0c2ada9a3d..4a269ecc92 100644
--- a/clang/include/clang/AST/ExprCXX.h
+++ b/clang/include/clang/AST/ExprCXX.h
@@ -2304,8 +2304,8 @@ class CXXNewExpr final
bool UsualArrayDeleteWantsSize, ArrayRef<Expr *> PlacementArgs,
SourceRange TypeIdParens, std::optional<Expr *> ArraySize,
CXXNewInitializationStyle InitializationStyle, Expr *Initializer,
- QualType Ty, TypeSourceInfo *AllocatedTypeInfo,
- SourceRange Range, SourceRange DirectInitRange);
+ QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range,
+ SourceRange DirectInitRange);
/// Build an empty c++ new expression.
CXXNewExpr(EmptyShell Empty, bool IsArray, unsigned NumPlacementArgs,
@@ -2451,7 +2451,9 @@ public:
/// Indicates whether a type_identity tag should be implicitly passed to
/// the allocation function.
- bool passTypeIdentity() const { return CXXNewExprBits.ShouldPassTypeIdentity; }
+ bool passTypeIdentity() const {
+ return CXXNewExprBits.ShouldPassTypeIdentity;
+ }
/// Answers whether the usual array deallocation function for the
/// allocated type expects the size of the allocation as a
@@ -2463,10 +2465,8 @@ public:
/// Provides the full set of information about expected implicit
/// parameters in this call
ImplicitAllocationParameters implicitAllocationParameters() const {
- return ImplicitAllocationParameters {
- .PassTypeIdentity = passTypeIdentity(),
- .PassAlignment = passAlignment()
- };
+ return ImplicitAllocationParameters{.PassTypeIdentity = passTypeIdentity(),
+ .PassAlignment = passAlignment()};
}
using arg_iterator = ExprIterator;
diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h
index 7d8bd7b70a..ad7dfe44ce 100644
--- a/clang/include/clang/AST/Type.h
+++ b/clang/include/clang/AST/Type.h
@@ -2635,8 +2635,8 @@ public:
// C++14 decltype(auto)
bool isTypedefNameType() const; // typedef or alias template
- bool isTypeIdentitySpecialization() const; // std::type_identity<X> for any X
- bool isDestroyingDeleteT() const; // std::destroying_delete_t
+ bool isTypeIdentitySpecialization() const; // std::type_identity<X> for any X
+ bool isDestroyingDeleteT() const; // std::destroying_delete_t
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
bool is##Id##Type() const;
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index 501fc0ecb2..bd54d81255 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -4759,7 +4759,9 @@ public:
bool IsTypeAwareOperatorNewOrDelete(const FunctionDecl *FnDecl) const;
bool IsTypeAwareOperatorNewOrDelete(const FunctionTemplateDecl *FnDecl) const;
bool IsTypeAwareOperatorNewOrDelete(const NamedDecl *FnDecl) const;
- std::optional<FunctionDecl*> InstantiateTypeAwareUsualDelete(FunctionTemplateDecl *FnDecl, QualType AllocType);
+ std::optional<FunctionDecl *>
+ InstantiateTypeAwareUsualDelete(FunctionTemplateDecl *FnDecl,
+ QualType AllocType);
ValueDecl *tryLookupUnambiguousFieldDecl(RecordDecl *ClassDecl,
const IdentifierInfo *MemberOrBase);
@@ -8153,14 +8155,12 @@ public:
/// Finds the overloads of operator new and delete that are appropriate
/// for the allocation.
- bool FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
- AllocationFunctionScope NewScope,
- AllocationFunctionScope DeleteScope,
- QualType AllocType, bool IsArray,
- ImplicitAllocationParameters &IAP, MultiExprArg PlaceArgs,
- FunctionDecl *&OperatorNew,
- FunctionDecl *&OperatorDelete,
- bool Diagnose = true);
+ bool FindAllocationFunctions(
+ SourceLocation StartLoc, SourceRange Range,
+ AllocationFunctionScope NewScope, AllocationFunctionScope DeleteScope,
+ QualType AllocType, bool IsArray, ImplicitAllocationParameters &IAP,
+ MultiExprArg PlaceArgs, FunctionDecl *&OperatorNew,
+ FunctionDecl *&OperatorDelete, bool Diagnose = true);
/// DeclareGlobalNewDelete - Declare the global forms of operator new and
/// delete. These are:
@@ -8190,10 +8190,11 @@ public:
ArrayRef<QualType> Params);
bool FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD,
- DeclarationName Name, FunctionDecl *&Operator, QualType DeallocType,
- ImplicitDeallocationParameters, bool Diagnose = true);
- FunctionDecl *FindUsualDeallocationFunction(QualType,
- SourceLocation StartLoc,
+ DeclarationName Name, FunctionDecl *&Operator,
+ QualType DeallocType,
+ ImplicitDeallocationParameters,
+ bool Diagnose = true);
+ FunctionDecl *FindUsualDeallocationFunction(QualType, SourceLocation StartLoc,
ImplicitDeallocationParameters,
DeclarationName Name);
FunctionDecl *FindDeallocationFunctionForDestructor(SourceLocation StartLoc,
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index 84a1018c58..5bddd0741b 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -8313,10 +8313,10 @@ ExpectedStmt ASTNodeImporter::VisitCXXNewExpr(CXXNewExpr *E) {
return CXXNewExpr::Create(
Importer.getToContext(), E->isGlobalNew(), ToOperatorNew,
- ToOperatorDelete, E->implicitAllocationParameters(), E->doesUsualArrayDeleteWantSize(),
- ToPlacementArgs, ToTypeIdParens, ToArraySize, E->getInitializationStyle(),
- ToInitializer, ToType, ToAllocatedTypeSourceInfo, ToSourceRange,
- ToDirectInitRange);
+ ToOperatorDelete, E->implicitAllocationParameters(),
+ E->doesUsualArrayDeleteWantSize(), ToPlacementArgs, ToTypeIdParens,
+ ToArraySize, E->getInitializationStyle(), ToInitializer, ToType,
+ ToAllocatedTypeSourceInfo, ToSourceRange, ToDirectInitRange);
}
ExpectedStmt ASTNodeImporter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index d594783ba2..08618f6b38 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -3360,7 +3360,8 @@ bool FunctionDecl::isReservedGlobalPlacementOperator() const {
const auto *proto = getType()->castAs<FunctionProtoType>();
if (proto->getNumParams() < 2)
return false;
- bool IsTypeAwareAllocator = proto->getParamType(0)->isTypeIdentitySpecialization();
+ bool IsTypeAwareAllocator =
+ proto->getParamType(0)->isTypeIdentitySpecialization();
if (IsTypeAwareAllocator)
return false;
if (proto->getNumParams() != 2 || proto->isVariadic())
@@ -3503,7 +3504,8 @@ bool FunctionDecl::isDestroyingOperatorDelete() const {
if (getNumParams() <= DestroyingDeleteTagParam)
return false;
- auto *RD = getParamDecl(DestroyingDeleteTagParam)->getType()->getAsCXXRecordDecl();
+ auto *RD =
+ getParamDecl(DestroyingDeleteTagParam)->getType()->getAsCXXRecordDecl();
return RD && RD->isInStdNamespace() && RD->getIdentifier() &&
RD->getIdentifier()->isStr("destroying_delete_t");
}
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp
index aa14241acd..464f59928d 100644
--- a/clang/lib/AST/DeclCXX.cpp
+++ b/clang/lib/AST/DeclCXX.cpp
@@ -2476,7 +2476,8 @@ bool CXXMethodDecl::isUsualDeallocationFunction(
if (auto *PrimaryTemplate = getPrimaryTemplate()) {
// Addendum: a template instance is a usual deallocation function if there
// is a single template parameter, that parameter is a type, only the first
- // parameter is dependent, and that parameter is a specialization of std::type_identity
+ // parameter is dependent, and that parameter is a specialization of
+ // std::type_identity
if (!IsTypeAware) {
// Stop early on if the specialization is not explicitly type aware
return false;
diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp
index d10b28e494..22307912ec 100644
--- a/clang/lib/AST/ExprCXX.cpp
+++ b/clang/lib/AST/ExprCXX.cpp
@@ -227,7 +227,8 @@ SourceLocation CXXScalarValueInitExpr::getBeginLoc() const {
// CXXNewExpr
CXXNewExpr::CXXNewExpr(bool IsGlobalNew, FunctionDecl *OperatorNew,
- FunctionDecl *OperatorDelete, ImplicitAllocationParameters IAP,
+ FunctionDecl *OperatorDelete,
+ ImplicitAllocationParameters IAP,
bool UsualArrayDeleteWantsSize,
ArrayRef<Expr *> PlacementArgs, SourceRange TypeIdParens,
std::optional<Expr *> ArraySize,
@@ -292,7 +293,8 @@ CXXNewExpr::CXXNewExpr(EmptyShell Empty, bool IsArray,
CXXNewExpr *CXXNewExpr::Create(
const ASTContext &Ctx, bool IsGlobalNew, FunctionDecl *OperatorNew,
- FunctionDecl *OperatorDelete, ImplicitAllocationParameters IAP, bool UsualArrayDeleteWantsSize, ArrayRef<Expr *> PlacementArgs,
+ FunctionDecl *OperatorDelete, ImplicitAllocationParameters IAP,
+ bool UsualArrayDeleteWantsSize, ArrayRef<Expr *> PlacementArgs,
SourceRange TypeIdParens, std::optional<Expr *> ArraySize,
CXXNewInitializationStyle InitializationStyle, Expr *Initializer,
QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range,
@@ -305,10 +307,10 @@ CXXNewExpr *CXXNewExpr::Create(
Ctx.Allocate(totalSizeToAlloc<Stmt *, SourceRange>(
IsArray + HasInit + NumPlacementArgs, IsParenTypeId),
alignof(CXXNewExpr));
- return new (Mem)
- CXXNewExpr(IsGlobalNew, OperatorNew, OperatorDelete, IAP, UsualArrayDeleteWantsSize,
- PlacementArgs, TypeIdParens, ArraySize, InitializationStyle, Initializer,
- Ty, AllocatedTypeInfo, Range, DirectInitRange);
+ return new (Mem) CXXNewExpr(
+ IsGlobalNew, OperatorNew, OperatorDelete, IAP, UsualArrayDeleteWantsSize,
+ PlacementArgs, TypeIdParens, ArraySize, InitializationStyle, Initializer,
+ Ty, AllocatedTypeInfo, Range, DirectInitRange);
}
CXXNewExpr *CXXNewExpr::CreateEmpty(const ASTContext &Ctx, bool IsArray,
diff --git a/clang/lib/CodeGen/CGExprCXX.cpp b/clang/lib/CodeGen/CGExprCXX.cpp
index 238272b79f..fa4695e0e4 100644
--- a/clang/lib/CodeGen/CGExprCXX.cpp
+++ b/clang/lib/CodeGen/CGExprCXX.cpp
@@ -1549,7 +1549,8 @@ static void EnterNewDeleteCleanup(CodeGenFunction &CGF,
DirectCleanup *Cleanup = CGF.EHStack.pushCleanupWithExtra<DirectCleanup>(
EHCleanup, E->getNumPlacementArgs(), E->getOperatorDelete(),
- NewPtr.emitRawPointer(CGF), AllocSize, E->passTypeIdentity(), E->passAlignment(), AllocAlign);
+ NewPtr.emitRawPointer(CGF), AllocSize, E->passTypeIdentity(),
+ E->passAlignment(), AllocAlign);
for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
auto &Arg = NewArgs[I + NumNonPlacementArgs];
Cleanup->setPlacementArg(I, Arg.getRValue(CGF), Arg.Ty);
@@ -1573,15 +1574,11 @@ static void EnterNewDeleteCleanup(CodeGenFunction &CGF,
};
typedef CallDeleteDuringNew<ConditionalCleanupTraits> ConditionalCleanup;
- ConditionalCleanup *Cleanup = CGF.EHStack
- .pushCleanupWithExtra<ConditionalCleanup>(EHCleanup,
- E->getNumPlacementArgs(),
- E->getOperatorDelete(),
- SavedNewPtr,
- SavedAllocSize,
- E->passTypeIdentity(),
- E->passAlignment(),
- AllocAlign);
+ ConditionalCleanup *Cleanup =
+ CGF.EHStack.pushCleanupWithExtra<ConditionalCleanup>(
+ EHCleanup, E->getNumPlacementArgs(), E->getOperatorDelete(),
+ SavedNewPtr, SavedAllocSize, E->passTypeIdentity(),
+ E->passAlignment(), AllocAlign);
for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
auto &Arg = NewArgs[I + NumNonPlacementArgs];
Cleanup->setPlacementArg(
@@ -1655,8 +1652,10 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
unsigned ParamsToSkip = 0;
if (E->passTypeIdentity()) {
QualType SpecializedTypeIdentity = allocatorType->getParamType(0);
- CXXScalarValueInitExpr TypeIdentityParam(SpecializedTypeIdentity, nullptr, SourceLocation());
- allocatorArgs.add(EmitAnyExprToTemp(&TypeIdentityParam), SpecializedTypeIdentity);
+ CXXScalarValueInitExpr TypeIdentityParam(SpecializedTypeIdentity, nullptr,
+ SourceLocation());
+ allocatorArgs.add(EmitAnyExprToTemp(&TypeIdentityParam),
+ SpecializedTypeIdentity);
++ParamsToSkip;
++IndexOfAlignArg;
}
@@ -1833,8 +1832,10 @@ void CodeGenFunction::EmitDeleteCall(const FunctionDecl *DeleteFD,
llvm::AllocaInst *TypeIdentityag = nullptr;
if (Params.TypedAwareDelete) {
QualType SpecializedTypeIdentity = *ParamTypeIt++;
- CXXScalarValueInitExpr TypeIdentityParam(SpecializedTypeIdentity, nullptr, SourceLocation());
- DeleteArgs.add(EmitAnyExprToTemp(&TypeIdentityParam), SpecializedTypeIdentity);
+ CXXScalarValueInitExpr TypeIdentityParam(SpecializedTypeIdentity, nullptr,
+ SourceLocation());
+ DeleteArgs.add(EmitAnyExprToTemp(&TypeIdentityParam),
+ SpecializedTypeIdentity);
}
// Pass the pointer itself.
diff --git a/clang/lib/Sema/SemaCoroutine.cpp b/clang/lib/Sema/SemaCoroutine.cpp
index 84d642436b..f8dad348b7 100644
--- a/clang/lib/Sema/SemaCoroutine.cpp
+++ b/clang/lib/Sema/SemaCoroutine.cpp
@@ -1112,13 +1112,12 @@ static bool findDeleteForPromise(Sema &S, SourceLocation Loc, QualType PromiseTy
// The deallocation function's name is looked up by searching for it in the
// scope of the promise type. If nothing is found, a search is performed in
// the global scope.
- ImplicitDeallocationParameters IDP = {
- .PassTypeIdentity = S.AllowTypeAwareAllocators(),
- .PassAlignment = Overaligned,
- .PassSize = true
- };
- if (S.FindDeallocationFunction(Loc, PointeeRD, DeleteName, OperatorDelete, PromiseType,
- IDP, /*Diagnose*/ true))
+ ImplicitDeallocationParameters IDP = {.PassTypeIdentity =
+ S.AllowTypeAwareAllocators(),
+ .PassAlignment = Overaligned,
+ .PassSize = true};
+ if (S.FindDeallocationFunction(Loc, PointeeRD, DeleteName, OperatorDelete,
+ PromiseType, IDP, /*Diagnose*/ true))
return false;
// [dcl.fct.def.coroutine]p12
@@ -1135,7 +1134,8 @@ static bool findDeleteForPromise(Sema &S, SourceLocation Loc, QualType PromiseTy
// parameters first. It will return the deallocation function with one
// parameter if failed.
IDP.PassSize = CanProvideSize;
- OperatorDelete = S.FindUsualDeallocationFunction(PromiseType, Loc, IDP, DeleteName);
+ OperatorDelete =
+ S.FindUsualDeallocationFunction(PromiseType, Loc, IDP, DeleteName);
if (!OperatorDelete)
return false;
@@ -1426,36 +1426,35 @@ bool CoroutineStmtBuilder::makeNewAndDeleteExpr() {
// Helper function to indicate whether the last lookup found the aligned
// allocation function.
ImplicitAllocationParameters IAP = {
- .PassTypeIdentity = S.AllowTypeAwareAllocators(),
- .PassAlignment = S.getLangOpts().CoroAlignedAllocation != 0
- };
- auto LookupAllocationFunction = [&](Sema::AllocationFunctionScope NewScope =
- Sema::AFS_Both,
- bool WithoutPlacementArgs = false,
- bool ForceNonAligned = false) {
- // [dcl.fct.def.coroutine]p9
- // The allocation function's name is looked up by searching for it in the
- // scope of the promise type.
- // - If any declarations are found, ...
- // - If no declarations are found in the scope of the promise type, a search
- // is performed in the global scope or via ADL for typed allocation.
- if (NewScope == Sema::AFS_Both)
- NewScope = PromiseContainsNew ? Sema::AFS_Class : Sema::AFS_Global;
-
- IAP = {
.PassTypeIdentity = S.AllowTypeAwareAllocators(),
- .PassAlignment = !ForceNonAligned && S.getLangOpts().CoroAlignedAllocation
- };
-
- FunctionDecl *UnusedResult = nullptr;
-
- S.FindAllocationFunctions(Loc, SourceRange(), NewScope,
- /*DeleteScope*/ Sema::AFS_Both, PromiseType,
- /*isArray*/ false, IAP,
- WithoutPlacementArgs ? MultiExprArg{}
- : PlacementArgs,
- OperatorNew, UnusedResult, /*Diagnose*/ false);
- };
+ .PassAlignment = S.getLangOpts().CoroAlignedAllocation != 0};
+ auto LookupAllocationFunction =
+ [&](Sema::AllocationFunctionScope NewScope = Sema::AFS_Both,
+ bool WithoutPlacementArgs = false, bool ForceNonAligned = false) {
+ // [dcl.fct.def.coroutine]p9
+ // The allocation function's name is looked up by searching for it in
+ // the
+ // scope of the promise type.
+ // - If any declarations are found, ...
+ // - If no declarations are found in the scope of the promise type, a
+ // search is performed in the global scope or via ADL for typed
+ // allocation.
+ if (NewScope == Sema::AFS_Both)
+ NewScope = PromiseContainsNew ? Sema::AFS_Class : Sema::AFS_Global;
+
+ IAP = {.PassTypeIdentity = S.AllowTypeAwareAllocators(),
+ .PassAlignment =
+ !ForceNonAligned && S.getLangOpts().CoroAlignedAllocation};
+
+ FunctionDecl *UnusedResult = nullptr;
+
+ S.FindAllocationFunctions(
+ Loc, SourceRange(), NewScope,
+ /*DeleteScope*/ Sema::AFS_Both, PromiseType,
+ /*isArray*/ false, IAP,
+ WithoutPlacementArgs ? MultiExprArg{} : PlacementArgs, OperatorNew,
+ UnusedResult, /*Diagnose*/ false);
+ };
// We don't expect to call to global operator new with (size, p0, …, pn).
// So if we choose to lookup the allocation function in global scope, we
@@ -1600,14 +1599,17 @@ bool CoroutineStmtBuilder::makeNewAndDeleteExpr() {
SmallVector<Expr *, 3> NewArgs;
if (IAP.PassTypeIdentity) {
- auto SpecializedTypeIdentity = S.InstantiateSpecializedTypeIdentity(PromiseType);
- if (!SpecializedTypeIdentity)
- return false;
- auto *SpecializedTypeInfo = S.Context.getTrivialTypeSourceInfo(*SpecializedTypeIdentity, Loc);
- auto TypeIdentity = S.BuildCXXTypeConstructExpr(SpecializedTypeInfo, Loc, {}, Loc, false);
- if (TypeIdentity.isInvalid())
- return false;
- NewArgs.push_back(TypeIdentity.get());
+ auto SpecializedTypeIdentity =
+ S.InstantiateSpecializedTypeIdentity(PromiseType);
+ if (!SpecializedTypeIdentity)
+ return false;
+ auto *SpecializedTypeInfo =
+ S.Context.getTrivialTypeSourceInfo(*SpecializedTypeIdentity, Loc);
+ auto TypeIdentity =
+ S.BuildCXXTypeConstructExpr(SpecializedTypeInfo, Loc, {}, Loc, false);
+ if (TypeIdentity.isInvalid())
+ return false;
+ NewArgs.push_back(TypeIdentity.get());
}
NewArgs.push_back(FrameSize);
if (S.getLangOpts().CoroAlignedAllocation && IAP.PassAlignment)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index b6fdfcd571..ad5372495b 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -17395,7 +17395,7 @@ Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc,
// e.g. something like
// namespace std { struct align_val_t { explicit align_val_t(size_t); } };
// can result in an operator new/delete decl picking up this specified
- // align_val_t struct, but the align_val_t constructed implicitly has the
+ // align_val_t struct, but the align_val_t constructed implicitly has the
// mismatching internal definition.
//
// The correct course of action is probably to perform this logic at the point
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 2a0de5dc59..bdaec80a62 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -9715,13 +9715,13 @@ bool Sema::ShouldDeleteSpecialMember(CXXMethodDecl *MD,
auto DeallocType = Context.getRecordType(RD);
DeclarationName Name =
Context.DeclarationNames.getCXXOperatorName(OO_Delete);
- ImplicitDeallocationParameters IDP = {
- .PassTypeIdentity = AllowTypeAwareAllocators(),
- .PassAlignment = false,
- .PassSize = false
- };
+ ImplicitDeallocationParameters IDP = {.PassTypeIdentity =
+ AllowTypeAwareAllocators(),
+ .PassAlignment = false,
+ .PassSize = false};
if (FindDeallocationFunction(MD->getLocation(), MD->getParent(), Name,
- OperatorDelete, DeallocType, IDP, /*Diagnose*/false)) {
+ OperatorDelete, DeallocType, IDP,
+ /*Diagnose*/ false)) {
if (Diagnose)
Diag(RD->getLocation(), diag::note_deleted_dtor_no_operator_delete);
return true;
@@ -10876,14 +10876,15 @@ bool Sema::CheckDestructor(CXXDestructorDecl *Destructor) {
if (IsTypeAwareOperatorNewOrDelete(OperatorDelete)) {
++PointerParam;
}
- QualType ParamType = OperatorDelete->getParamDecl(PointerParam)->getType();
+ QualType ParamType =
+ OperatorDelete->getParamDecl(PointerParam)->getType();
if (!declaresSameEntity(ParamType->getAsCXXRecordDecl(), RD)) {
// C++ [class.dtor]p13:
// ... as if for the expression 'delete this' appearing in a
// non-virtual destructor of the destructor's class.
ContextRAII SwitchContext(*this, Destructor);
- ExprResult This =
- ActOnCXXThis(OperatorDelete->getParamDecl(PointerParam)->getLocation());
+ ExprResult This = ActOnCXXThis(
+ OperatorDelete->getParamDecl(PointerParam)->getLocation());
assert(!This.isInvalid() && "couldn't form 'this' expr in dtor?");
This = PerformImplicitConversion(This.get(), ParamType,
AssignmentAction::Passing);
@@ -11742,7 +11743,8 @@ NamespaceDecl *Sema::getStdNamespace() const {
}
ClassTemplateDecl *Sema::getStdTypeIdentity() const {
- return cast_or_null<ClassTemplateDecl>(StdTypeIdentity.get(Context.getExternalSource()));
+ return cast_or_null<ClassTemplateDecl>(
+ StdTypeIdentity.get(Context.getExternalSource()));
}
namespace {
@@ -16135,7 +16137,7 @@ bool Sema::IsTypeIdentitySpecialization(QualType Type) const {
}
bool Sema::IsTypeAwareOperatorNewOrDelete(const FunctionDecl *FnDecl) const {
- // Type aware operators
+ // Type aware operators
if (FnDecl->getNumParams() < 2)
return false;
const auto *ParamDecl = FnDecl->getParamDecl(0);
@@ -16155,8 +16157,9 @@ bool Sema::IsTypeAwareOperatorNewOrDelete(const NamedDecl *ND) const {
return false;
}
-std::optional<FunctionDecl*>
-Sema::InstantiateTypeAwareUsualDelete(FunctionTemplateDecl *FnTemplateDecl, QualType DeallocType) {
+std::optional<FunctionDecl *>
+Sema::InstantiateTypeAwareUsualDelete(FunctionTemplateDecl *FnTemplateDecl,
+ QualType DeallocType) {
if (!AllowTypeAwareAllocators())
return std::nullopt;
@@ -16176,14 +16179,15 @@ Sema::InstantiateTypeAwareUsualDelete(FunctionTemplateDecl *FnTemplateDecl, Qual
return std::nullopt;
for (size_t Idx = 1; Idx < NumParams; ++Idx) {
- // A type aware allocation is only usual if the only dependent parameter is the
- // first parameter
+ // A type aware allocation is only usual if the only dependent parameter is
+ // the first parameter
const auto *ParamDecl = FnDecl->getParamDecl(Idx);
if (ParamDecl->getType()->isDependentType())
return std::nullopt;
}
- auto SpecializedTypeIdentity = InstantiateSpecializedTypeIdentity(DeallocType);
+ auto SpecializedTypeIdentity =
+ InstantiateSpecializedTypeIdentity(DeallocType);
if (!SpecializedTypeIdentity)
return std::nullopt;
SmallVector<QualType, 4> ArgTypes;
@@ -16217,17 +16221,19 @@ Sema::InstantiateTypeAwareUsualDelete(FunctionTemplateDecl *FnTemplateDecl, Qual
return std::nullopt;
FunctionProtoType::ExtProtoInfo EPI;
- auto ExpectedFunctionType = Context.getFunctionType(Context.VoidTy, ArgTypes, EPI);
+ auto ExpectedFunctionType =
+ Context.getFunctionType(Context.VoidTy, ArgTypes, EPI);
SourceLocation Loc;
sema::TemplateDeductionInfo Info(Loc);
FunctionDecl *Result;
- if (DeduceTemplateArguments(FnTemplateDecl, nullptr, ExpectedFunctionType, Result,
- Info) != TemplateDeductionResult::Success)
+ if (DeduceTemplateArguments(FnTemplateDecl, nullptr, ExpectedFunctionType,
+ Result, Info) != TemplateDeductionResult::Success)
return std::nullopt;
return Result;
}
-std::optional<QualType> Sema::InstantiateSpecializedTypeIdentity(QualType Subject) {
+std::optional<QualType>
+Sema::InstantiateSpecializedTypeIdentity(QualType Subject) {
assert(AllowTypeAwareAllocators());
auto *TypeIdentity = getStdTypeIdentity();
if (!TypeIdentity) {
@@ -16235,7 +16241,8 @@ std::optional<QualType> Sema::InstantiateSpecializedTypeIdentity(QualType Subjec
}
auto TN = TemplateName(TypeIdentity);
TemplateArgumentListInfo Arguments;
- Arguments.addArgument(getTrivialTemplateArgumentLoc(TemplateArgument(Subject), QualType(), SourceLocation()));
+ Arguments.addArgument(getTrivialTemplateArgumentLoc(
+ TemplateArgument(Subject), QualType(), SourceLocation()));
auto Result = CheckTemplateIdType(TN, SourceLocation(), Arguments);
if (Result.isNull())
return std::nullopt;
@@ -16271,13 +16278,10 @@ static CanQualType RemoveAddressSpaceFromPtr(Sema &SemaRef,
PtrTy->getPointeeType().getUnqualifiedType(), PtrQuals)));
}
-static inline bool
-CheckOperatorNewDeleteTypes(Sema &SemaRef, const FunctionDecl *FnDecl,
- CanQualType ExpectedResultType,
- CanQualType ExpectedFirstParamType,
- unsigned DependentParamTypeDiag,
- unsigned InvalidParamTypeDiag,
- unsigned *MinimumNonDefaultArgs) {
+static inline bool CheckOperatorNewDeleteTypes(
+ Sema &SemaRef, const FunctionDecl *FnDecl, CanQualType ExpectedResultType,
+ CanQualType ExpectedFirstParamType, unsigned DependentParamTypeDiag,
+ unsigned InvalidParamTypeDiag, unsigned *MinimumNonDefaultArgs) {
auto NormalizeType = [&SemaRef](QualType T) {
if (SemaRef.getLangOpts().OpenCLCPlusPlus) {
// The operator is valid on any address space for OpenCL.
@@ -16313,8 +16317,8 @@ CheckOperatorNewDeleteTypes(Sema &SemaRef, const FunctionDecl *FnDecl,
unsigned FirstNonTypeParam = 0;
if (FnDecl->IsTypeAwareOperatorNewOrDelete()) {
if (!SemaRef.getLangOpts().TypeAwareAllocators) {
- return SemaRef.Diag(FnDecl->getLocation(),
- diag::err_unsupported_type_aware_allocator);
+ return SemaRef.Diag(FnDecl->getLocation(),
+ diag::err_unsupported_type_aware_allocator);
}
++FirstNonTypeParam;
}
@@ -16325,7 +16329,8 @@ CheckOperatorNewDeleteTypes(Sema &SemaRef, const FunctionDecl *FnDecl,
diag::err_operator_new_delete_too_few_parameters)
<< FnDecl->getDeclName();
- QualType FirstParamType = NormalizeType(FnDecl->getParamDecl(FirstNonTypeParam)->getType());
+ QualType FirstParamType =
+ NormalizeType(FnDecl->getParamDecl(FirstNonTypeParam)->getType());
// Check that the first parameter type is what we expect.
if (FirstParamType.getUnqualifiedType() != CanExpectedFirstParamType) {
@@ -16358,11 +16363,10 @@ CheckOperatorNewDeclaration(Sema &SemaRef, const FunctionDecl *FnDecl) {
// C++ [basic.stc.dynamic.allocation]p1:
// The return type shall be void*. The first parameter shall have type
// std::size_t.
- if (CheckOperatorNewDeleteTypes(SemaRef, FnDecl, SemaRef.Context.VoidPtrTy,
- SizeTy,
- diag::err_operator_new_dependent_param_type,
- diag::err_operator_new_param_type,
- &MinimumNonDefaultArgs))
+ if (CheckOperatorNewDeleteTypes(
+ SemaRef, FnDecl, SemaRef.Context.VoidPtrTy, SizeTy,
+ diag::err_operator_new_dependent_param_type,
+ diag::err_operator_new_param_type, &MinimumNonDefaultArgs))
return true;
assert(MinimumNonDefaultArgs > 0);
// C++ [basic.stc.dynamic.allocation]p1:
@@ -16372,7 +16376,7 @@ CheckOperatorNewDeclaration(Sema &SemaRef, const FunctionDecl *FnDecl) {
if (ParamDecl->hasDefaultArg()) {
return SemaRef.Diag(FnDecl->getLocation(),
diag::err_operator_new_default_arg)
- << FnDecl->getDeclName() << ParamDecl->getDefaultArgRange();
+ << FnDecl->getDeclName() << ParamDecl->getDefaultArgRange();
}
}
return false;
@@ -16405,8 +16409,7 @@ CheckOperatorDeleteDeclaration(Sema &SemaRef, FunctionDecl *FnDecl) {
if (CheckOperatorNewDeleteTypes(
SemaRef, FnDecl, SemaRef.Context.VoidTy, ExpectedFirstParamType,
diag::err_operator_delete_dependent_param_type,
- diag::err_operator_delete_param_type,
- &MinimumNonDefaultArgs))
+ diag::err_operator_delete_param_type, &MinimumNonDefaultArgs))
return true;
assert(MinimumNonDefaultArgs > 0);
@@ -16419,7 +16422,8 @@ CheckOperatorDeleteDeclaration(Sema &SemaRef, FunctionDecl *FnDecl) {
diag::err_destroying_operator_delete_not_usual);
return true;
}
- if (MD->IsTypeAwareOperatorNewOrDelete() && !SemaRef.getLangOpts().TypeAwareDestroyingDelete) {
+ if (MD->IsTypeAwareOperatorNewOrDelete() &&
+ !SemaRef.getLangOpts().TypeAwareDestroyingDelete) {
SemaRef.Diag(MD->getLocation(),
diag::err_type_aware_destroying_operator_delete);
return true;
@@ -16430,7 +16434,7 @@ CheckOperatorDeleteDeclaration(Sema &SemaRef, FunctionDecl *FnDecl) {
if (ParamDecl->hasDefaultArg()) {
return SemaRef.Diag(FnDecl->getLocation(),
diag::err_operator_new_default_arg)
- << FnDecl->getDeclName() << ParamDecl->getDefaultArgRange();
+ << FnDecl->getDeclName() << ParamDecl->getDefaultArgRange();
}
}
return false;
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index c59ef76a70..19a6b424a6 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -1778,21 +1778,23 @@ namespace {
UsualDeallocFnInfo() : Found(), FD(nullptr) {}
UsualDeallocFnInfo(Sema &S, DeclAccessPair Found, QualType AllocType)
: Found(Found), FD(dyn_cast<FunctionDecl>(Found->getUnderlyingDecl())),
- Destroying(false), HasSizeT(false), HasAlignValT(false), HasTypeIdentity(false),
- CUDAPref(SemaCUDA::CFP_Native) {
- // A function template declaration is only a usual deallocation function if it is
- // a typed delete
+ Destroying(false), HasSizeT(false), HasAlignValT(false),
+ HasTypeIdentity(false), CUDAPref(SemaCUDA::CFP_Native) {
+ // A function template declaration is only a usual deallocation function
+ // if it is a typed delete
if (!FD) {
auto *FTD = dyn_cast<FunctionTemplateDecl>(Found->getUnderlyingDecl());
if (!FTD)
return;
- auto InstantiatedDecl = S.InstantiateTypeAwareUsualDelete(FTD, AllocType);
+ auto InstantiatedDecl =
+ S.InstantiateTypeAwareUsualDelete(FTD, AllocType);
if (!InstantiatedDecl)
return;
FD = *InstantiatedDecl;
}
unsigned NumBaseParams = 1;
- if (S.IsTypeAwareOperatorNewOrDelete(FD) && S.AllowTypeAwareAllocators()) {
+ if (S.IsTypeAwareOperatorNewOrDelete(FD) &&
+ S.AllowTypeAwareAllocators()) {
auto TypeIdentityTag = FD->getParamDecl(0)->getType();
auto ExpectedTypeIdentityTag =
S.InstantiateSpecializedTypeIdentity(AllocType);
@@ -1835,7 +1837,8 @@ namespace {
explicit operator bool() const { return FD; }
- int Compare(Sema& S, const UsualDeallocFnInfo &Other, ImplicitDeallocationParameters IDP) const {
+ int Compare(Sema &S, const UsualDeallocFnInfo &Other,
+ ImplicitDeallocationParameters IDP) const {
// C++ P0722:
// A destroying operator delete is preferred over a non-destroying
// operator delete.
@@ -1865,23 +1868,17 @@ namespace {
return OtherPrimaryTemplate ? 1 : -1;
if (PrimaryTemplate && OtherPrimaryTemplate) {
- const auto * DC =
- dyn_cast<CXXRecordDecl>(Found->getDeclContext());
- const auto * OtherDC =
+ const auto *DC = dyn_cast<CXXRecordDecl>(Found->getDeclContext());
+ const auto *OtherDC =
dyn_cast<CXXRecordDecl>(Other.Found->getDeclContext());
unsigned ImplicitArgCount =
1 + Destroying + HasTypeIdentity + HasAlignValT + HasSizeT;
- if (FunctionTemplateDecl *Best =
- S.getMoreSpecializedTemplate(
- PrimaryTemplate, OtherPrimaryTemplate,
- SourceLocation(), TPOC_Call,
- ImplicitArgCount,
- DC ? QualType(DC->getTypeForDecl(), 0)
- : QualType{},
- OtherDC
- ? QualType(OtherDC->getTypeForDecl(), 0)
- : QualType{},
- false)) {
+ if (FunctionTemplateDecl *Best = S.getMoreSpecializedTemplate(
+ PrimaryTemplate, OtherPrimaryTemplate, SourceLocation(),
+ TPOC_Call, ImplicitArgCount,
+ DC ? QualType(DC->getTypeForDecl(), 0) : QualType{},
+ OtherDC ? QualType(OtherDC->getTypeForDecl(), 0) : QualType{},
+ false)) {
return Best == PrimaryTemplate ? 1 : -1;
}
}
@@ -1912,8 +1909,10 @@ static bool hasNewExtendedAlignment(Sema &S, QualType AllocType) {
S.getASTContext().getTargetInfo().getNewAlign();
}
-
-static bool CheckDeleteOperator(Sema &S, SourceLocation StartLoc, SourceRange Range, bool Diagnose, CXXRecordDecl *NamingClass, DeclAccessPair Decl, FunctionDecl* Operator) {
+static bool CheckDeleteOperator(Sema &S, SourceLocation StartLoc,
+ SourceRange Range, bool Diagnose,
+ CXXRecordDecl *NamingClass, DeclAccessPair Decl,
+ FunctionDecl *Operator) {
if (S.IsTypeAwareOperatorNewOrDelete(Operator)) {
auto SelectedTypeIdentityParameter = Operator->getParamDecl(0)->getType();
if (S.RequireCompleteType(StartLoc, SelectedTypeIdentityParameter,
@@ -1921,24 +1920,25 @@ static bool CheckDeleteOperator(Sema &S, SourceLocation StartLoc, SourceRange Ra
return true;
}
- // FIXME: DiagnoseUseOfDecl?
- if (Operator->isDeleted()) {
- if (Diagnose) {
- StringLiteral *Msg = Operator->getDeletedMessage();
- S.Diag(StartLoc, diag::err_deleted_function_use)
- << (Msg != nullptr) << (Msg ? Msg->getString() : StringRef());
- S.NoteDeletedFunction(Operator);
- }
- return true;
+ // FIXME: DiagnoseUseOfDecl?
+ if (Operator->isDeleted()) {
+ if (Diagnose) {
+ StringLiteral *Msg = Operator->getDeletedMessage();
+ S.Diag(StartLoc, diag::err_deleted_function_use)
+ << (Msg != nullptr) << (Msg ? Msg->getString() : StringRef());
+ S.NoteDeletedFunction(Operator);
}
+ return true;
+ }
- return S.CheckAllocationAccess(StartLoc, Range, NamingClass, Decl, Diagnose);
+ return S.CheckAllocationAccess(StartLoc, Range, NamingClass, Decl, Diagnose);
}
/// Select the correct "usual" deallocation function to use from a selection of
/// deallocation functions (either global or class-scope).
static UsualDeallocFnInfo resolveDeallocationOverload(
- Sema &S, LookupResult &R, ImplicitDeallocationParameters IDP, QualType DeallocType,
+ Sema &S, LookupResult &R, ImplicitDeallocationParameters IDP,
+ QualType DeallocType,
llvm::SmallVectorImpl<UsualDeallocFnInfo> *BestFns = nullptr) {
UsualDeallocFnInfo Best;
@@ -1975,8 +1975,8 @@ static UsualDeallocFnInfo resolveDeallocationOverload(
/// a member 'operator delete[]' with a 'size_t' parameter. This implies that
/// we need to store the array size (even if the type is
/// trivially-destructible).
-static bool doesUsualArrayDeleteWantSize(Sema &S, SourceLocation loc, bool PassType,
- QualType allocType) {
+static bool doesUsualArrayDeleteWantSize(Sema &S, SourceLocation loc,
+ bool PassType, QualType allocType) {
const RecordType *record =
allocType->getBaseElementTypeUnsafe()->getAs<RecordType>();
if (!record) return false;
@@ -2002,10 +2002,9 @@ static bool doesUsualArrayDeleteWantSize(Sema &S, SourceLocation loc, bool PassT
// If the deallocation functions have class scope, the one without a
// parameter of type std::size_t is selected.
ImplicitDeallocationParameters IDP = {
- .PassTypeIdentity = PassType,
- .PassAlignment = hasNewExtendedAlignment(S, allocType),
- .PassSize = false
- };
+ .PassTypeIdentity = PassType,
+ .PassAlignment = hasNewExtendedAlignment(S, allocType),
+ .PassSize = false};
auto Best = resolveDeallocationOverload(S, ops, IDP, allocType);
return Best && Best.HasSizeT;
}
@@ -2420,9 +2419,9 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal,
AllocType->isDependentType() ? 0 : Context.getTypeAlign(AllocType);
unsigned NewAlignment = Context.getTargetInfo().getNewAlign();
ImplicitAllocationParameters IAP = {
- .PassTypeIdentity = AllowTypeAwareAllocators(),
- .PassAlignment = getLangOpts().AlignedAllocation && Alignment > NewAlignment
- };
+ .PassTypeIdentity = AllowTypeAwareAllocators(),
+ .PassAlignment =
+ getLangOpts().AlignedAllocation && Alignment > NewAlignment};
if (CheckArgsForPlaceholders(PlacementArgs))
return ExprError();
@@ -2430,18 +2429,18 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal,
AllocationFunctionScope Scope = UseGlobal ? AFS_Global : AFS_Both;
if (!AllocType->isDependentType() &&
!Expr::hasAnyTypeDependentArguments(PlacementArgs) &&
- FindAllocationFunctions(
- StartLoc, SourceRange(PlacementLParen, PlacementRParen), Scope, Scope,
- AllocType, ArraySize.has_value(), IAP, PlacementArgs,
- OperatorNew, OperatorDelete))
+ FindAllocationFunctions(StartLoc,
+ SourceRange(PlacementLParen, PlacementRParen),
+ Scope, Scope, AllocType, ArraySize.has_value(),
+ IAP, PlacementArgs, OperatorNew, OperatorDelete))
return ExprError();
// If this is an array allocation, compute whether the usual array
// deallocation function for the type has a size_t parameter.
bool UsualArrayDeleteWantsSize = false;
if (ArraySize && !AllocType->isDependentType())
- UsualArrayDeleteWantsSize =
- doesUsualArrayDeleteWantSize(*this, StartLoc, IAP.PassTypeIdentity, AllocType);
+ UsualArrayDeleteWantsSize = doesUsualArrayDeleteWantSize(
+ *this, StartLoc, IAP.PassTypeIdentity, AllocType);
SmallVector<Expr *, 8> AllPlaceArgs;
if (OperatorNew) {
@@ -2622,10 +2621,9 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal,
}
return CXXNewExpr::Create(Context, UseGlobal, OperatorNew, OperatorDelete,
- IAP, UsualArrayDeleteWantsSize,
- PlacementArgs, TypeIdParens, ArraySize, InitStyle,
- Initializer, ResultType, AllocTypeInfo, Range,
- DirectInitRange);
+ IAP, UsualArrayDeleteWantsSize, PlacementArgs,
+ TypeIdParens, ArraySize, InitStyle, Initializer,
+ ResultType, AllocTypeInfo, Range, DirectInitRange);
}
bool Sema::CheckAllocatedType(QualType AllocType, SourceLocation Loc,
@@ -2668,8 +2666,8 @@ bool Sema::CheckAllocatedType(QualType AllocType, SourceLocation Loc,
enum class ResolveMode { Typed, Untyped };
static bool resolveAllocationOverloadInterior(
- Sema &S, LookupResult &R, SourceRange Range, ResolveMode Mode, SmallVectorImpl<Expr *> &Args,
- bool &PassAlignment, FunctionDecl *&Operator,
+ Sema &S, LookupResult &R, SourceRange Range, ResolveMode Mode,
+ SmallVectorImpl<Expr *> &Args, bool &PassAlignment, FunctionDecl *&Operator,
OverloadCandidateSet *AlignedCandidates, Expr *AlignArg, bool Diagnose) {
unsigned NonTypeArgumentOffset = 0;
if (Mode == ResolveMode::Typed)
@@ -2721,9 +2719,9 @@ static bool resolveAllocationOverloadInterior(
PassAlignment = false;
AlignArg = Args[NonTypeArgumentOffset + 1];
Args.erase(Args.begin() + NonTypeArgumentOffset + 1);
- return resolveAllocationOverloadInterior(S, R, Range, Mode, Args, PassAlignment,
- Operator, &Candidates, AlignArg,
- Diagnose);
+ return resolveAllocationOverloadInterior(S, R, Range, Mode, Args,
+ PassAlignment, Operator,
+ &Candidates, AlignArg, Diagnose);
}
// MSVC will fall back on trying to find a matching global operator new
@@ -2738,9 +2736,10 @@ static bool resolveAllocationOverloadInterior(
R.setLookupName(S.Context.DeclarationNames.getCXXOperatorName(OO_New));
S.LookupQualifiedName(R, S.Context.getTranslationUnitDecl());
// FIXME: This will give bad diagnostics pointing at the wrong functions.
- return resolveAllocationOverloadInterior(S, R, Range, Mode, Args, PassAlignment,
- Operator, /*Candidates=*/nullptr,
- /*AlignArg=*/nullptr, Diagnose);
+ return resolveAllocationOverloadInterior(S, R, Range, Mode, Args,
+ PassAlignment, Operator,
+ /*Candidates=*/nullptr,
+ /*AlignArg=*/nullptr, Diagnose);
}
if (Mode == ResolveMode::Typed) {
// If we can't find a matching typed we don't consider this a failure.
@@ -2773,7 +2772,9 @@ static bool resolveAllocationOverloadInterior(
auto IsAligned = [NonTypeArgumentOffset](OverloadCandidate &C) {
auto AlignArgOffset = NonTypeArgumentOffset + 1;
return C.Function->getNumParams() > AlignArgOffset &&
- C.Function->getParamDecl(AlignArgOffset)->getType()->isAlignValT();
+ C.Function->getParamDecl(AlignArgOffset)
+ ->getType()
+ ->isAlignValT();
};
auto IsUnaligned = [&](OverloadCandidate &C) { return !IsAligned(C); };
@@ -2781,7 +2782,8 @@ static bool resolveAllocationOverloadInterior(
for (unsigned Idx = 0; Idx < NonTypeArgumentOffset + 1; ++Idx)
AlignedArgs.push_back(Args[Idx]);
AlignedArgs.push_back(AlignArg);
- AlignedArgs.append(Args.begin() + NonTypeArgumentOffset + 1, Args.end());
+ AlignedArgs.append(Args.begin() + NonTypeArgumentOffset + 1,
+ Args.end());
AlignedCands = AlignedCandidates->CompleteCandidates(
S, OCD_AllCandidates, AlignedArgs, R.getNameLoc(), IsAligned);
@@ -2821,12 +2823,7 @@ static bool resolveAllocationOverloadInterior(
llvm_unreachable("Unreachable, bad result from BestViableFunction");
}
-
-enum class DeallocLookupMode {
- Untyped,
- OptionallyTyped,
- RequireTyped
-};
+enum class DeallocLookupMode { Untyped, OptionallyTyped, RequireTyped };
static void LookupGlobalDeallocationFunctions(Sema &S, SourceLocation Loc,
LookupResult &FoundDelete,
@@ -2849,7 +2846,7 @@ static void LookupGlobalDeallocationFunctions(Sema &S, SourceLocation Loc,
static bool resolveAllocationOverload(
Sema &S, LookupResult &R, SourceRange Range, SmallVectorImpl<Expr *> &Args,
- ImplicitAllocationParameters& IAP, FunctionDecl *&Operator,
+ ImplicitAllocationParameters &IAP, FunctionDecl *&Operator,
OverloadCandidateSet *AlignedCandidates, Expr *AlignArg, bool Diagnose) {
Operator = nullptr;
if (IAP.PassTypeIdentity) {
@@ -2858,8 +2855,9 @@ static bool resolveAllocationOverload(
UntypedParameters.reserve(Args.size() - 1);
UntypedParameters.append(Args.begin() + 1, Args.end());
bool InitialAlignmentMode = IAP.PassAlignment;
- if (resolveAllocationOverloadInterior(S, R, Range, ResolveMode::Typed, Args, IAP.PassAlignment,
- Operator, AlignedCandidates, AlignArg, Diagnose))
+ if (resolveAllocationOverloadInterior(
+ S, R, Range, ResolveMode::Typed, Args, IAP.PassAlignment, Operator,
+ AlignedCandidates, AlignArg, Diagnose))
return true;
if (Operator)
return false;
@@ -2871,18 +2869,17 @@ static bool resolveAllocationOverload(
Args = UntypedParameters;
}
assert(!Args[0]->getType()->isTypeIdentitySpecialization());
- return resolveAllocationOverloadInterior(S, R, Range, ResolveMode::Untyped, Args, IAP.PassAlignment,
- Operator, AlignedCandidates, AlignArg, Diagnose);
-}
-
-bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
- AllocationFunctionScope NewScope,
- AllocationFunctionScope DeleteScope,
- QualType AllocType, bool IsArray,
- ImplicitAllocationParameters& IAP, MultiExprArg PlaceArgs,
- FunctionDecl *&OperatorNew,
- FunctionDecl *&OperatorDelete,
- bool Diagnose) {
+ return resolveAllocationOverloadInterior(
+ S, R, Range, ResolveMode::Untyped, Args, IAP.PassAlignment, Operator,
+ AlignedCandidates, AlignArg, Diagnose);
+}
+
+bool Sema::FindAllocationFunctions(
+ SourceLocation StartLoc, SourceRange Range,
+ AllocationFunctionScope NewScope, AllocationFunctionScope DeleteScope,
+ QualType AllocType, bool IsArray, ImplicitAllocationParameters &IAP,
+ MultiExprArg PlaceArgs, FunctionDecl *&OperatorNew,
+ FunctionDecl *&OperatorDelete, bool Diagnose) {
// --- Choosing an allocation function ---
// C++ 5.3.4p8 - 14 & 18
// 1) If looking in AFS_Global scope for allocation functions, only look in
@@ -2897,7 +2894,6 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
unsigned ImplicitArgCount = 1 + IAP.PassAlignment + IAP.PassTypeIdentity;
AllocArgs.reserve(ImplicitArgCount + PlaceArgs.size());
-
// C++ [expr.new]p8:
// If the allocated type is a non-array type, the allocation
// function's name is operator new and the deallocation function's
@@ -2918,7 +2914,8 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
// expr on the stack
QualType TypeIdentity = Context.getSizeType();
if (IAP.PassTypeIdentity) {
- if (auto SpecializedTypeIdentity = InstantiateSpecializedTypeIdentity(AllocElemType)) {
+ if (auto SpecializedTypeIdentity =
+ InstantiateSpecializedTypeIdentity(AllocElemType)) {
TypeIdentity = *SpecializedTypeIdentity;
} else {
IAP.PassTypeIdentity = false;
@@ -2929,11 +2926,11 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
CXXScalarValueInitExpr TypeIdentityParam(TypeIdentity, nullptr, StartLoc);
if (IAP.PassTypeIdentity)
AllocArgs.push_back(&TypeIdentityParam);
-
+
QualType SizeTy = Context.getSizeType();
unsigned SizeTyWidth = Context.getTypeSize(SizeTy);
IntegerLiteral Size(Context, llvm::APInt::getZero(SizeTyWidth), SizeTy,
- SourceLocation());
+ SourceLocation());
AllocArgs.push_back(&Size);
QualType AlignValT = Context.VoidTy;
@@ -2987,10 +2984,10 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
// We do our own custom access checks below.
R.suppressDiagnostics();
- if (resolveAllocationOverload(*this, R, Range, AllocArgs, IAP,
- OperatorNew, /*Candidates=*/nullptr,
+ if (resolveAllocationOverload(*this, R, Range, AllocArgs, IAP, OperatorNew,
+ /*Candidates=*/nullptr,
/*AlignArg=*/nullptr, Diagnose))
- return true;
+ return true;
}
// We don't need an operator delete if we're running under -fno-exceptions.
@@ -3046,7 +3043,9 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
return true;
DeclareGlobalNewDelete();
- auto LookupMode = OriginalTypeAwareState ? DeallocLookupMode::OptionallyTyped : DeallocLookupMode::Untyped;
+ auto LookupMode = OriginalTypeAwareState
+ ? DeallocLookupMode::OptionallyTyped
+ : DeallocLookupMode::Untyped;
LookupGlobalDeallocationFunctions(*this, StartLoc, FoundDelete, LookupMode,
DeleteName, AllocElemType);
}
@@ -3072,7 +3071,8 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
unsigned NonPlacementNewArgCount = 1; // size parameter
if (IAP.PassTypeIdentity)
++NonPlacementNewArgCount;
- bool isPlacementNew = !PlaceArgs.empty() || OperatorNew->param_size() != NonPlacementNewArgCount ||
+ bool isPlacementNew = !PlaceArgs.empty() ||
+ OperatorNew->param_size() != NonPlacementNewArgCount ||
OperatorNew->isVariadic();
if (isPlacementNew) {
@@ -3106,8 +3106,8 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
}
for (LookupResult::iterator D = FoundDelete.begin(),
- DEnd = FoundDelete.end();
- D != DEnd; ++D) {
+ DEnd = FoundDelete.end();
+ D != DEnd; ++D) {
FunctionDecl *Fn = nullptr;
if (FunctionTemplateDecl *FnTmpl =
dyn_cast<FunctionTemplateDecl>((*D)->getUnderlyingDecl())) {
@@ -3140,11 +3140,11 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
// with a size_t where possible (which it always is in this case).
llvm::SmallVector<UsualDeallocFnInfo, 4> BestDeallocFns;
ImplicitDeallocationParameters IDP = {
- .PassTypeIdentity = OriginalTypeAwareState,
- .PassAlignment = hasNewExtendedAlignment(*this, AllocElemType),
- .PassSize = FoundGlobalDelete
- };
- UsualDeallocFnInfo Selected = resolveDeallocationOverload(*this, FoundDelete, IDP, AllocElemType, &BestDeallocFns);
+ .PassTypeIdentity = OriginalTypeAwareState,
+ .PassAlignment = hasNewExtendedAlignment(*this, AllocElemType),
+ .PassSize = FoundGlobalDelete};
+ UsualDeallocFnInfo Selected = resolveDeallocationOverload(
+ *this, FoundDelete, IDP, AllocElemType, &BestDeallocFns);
if (Selected && BestDeallocFns.empty())
Matches.push_back(std::make_pair(Selected.Found, Selected.FD));
else {
@@ -3153,7 +3153,6 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
for (auto Fn : BestDeallocFns)
Matches.push_back(std::make_pair(Fn.Found, Fn.FD));
}
-
}
// C++ [expr.new]p20:
@@ -3162,17 +3161,28 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
// deallocation function will be called.
if (Matches.size() == 1) {
OperatorDelete = Matches[0].second;
- if (IsTypeAwareOperatorNewOrDelete(OperatorDelete) != IAP.PassTypeIdentity) {
+ if (IsTypeAwareOperatorNewOrDelete(OperatorDelete) !=
+ IAP.PassTypeIdentity) {
Diag(StartLoc, diag::warn_mismatching_type_aware_cleanup_deallocator);
int NewDiagIndex = IsTypeAwareOperatorNewOrDelete(OperatorNew) ? 0 : 1;
- int DeleteDiagIndex = IsTypeAwareOperatorNewOrDelete(OperatorDelete) ? 0 : 1;
- Diag(OperatorNew->getLocation(), diag::note_type_aware_operator_declared) << NewDiagIndex << OperatorNew->getDeclName();
- Diag(OperatorDelete->getLocation(), diag::note_type_aware_operator_declared) << DeleteDiagIndex << OperatorDelete->getDeclName();
- }
- if (IAP.PassTypeIdentity && OperatorDelete->getDeclContext() != OperatorNew->getDeclContext()) {
- Diag(StartLoc, diag::err_no_matching_type_aware_cleanup_deallocator_mismatch) << OperatorNew->getDeclName() << DeleteName << OperatorNew->getDeclContext();
- Diag(OperatorNew->getLocation(), diag::err_type_aware_operator_found) << OperatorNew->getDeclName() << OperatorNew->getDeclContext();
- Diag(OperatorDelete->getLocation(), diag::err_type_aware_operator_found) << OperatorDelete->getDeclName() << OperatorDelete->getDeclContext();
+ int DeleteDiagIndex =
+ IsTypeAwareOperatorNewOrDelete(OperatorDelete) ? 0 : 1;
+ Diag(OperatorNew->getLocation(), diag::note_type_aware_operator_declared)
+ << NewDiagIndex << OperatorNew->getDeclName();
+ Diag(OperatorDelete->getLocation(),
+ diag::note_type_aware_operator_declared)
+ << DeleteDiagIndex << OperatorDelete->getDeclName();
+ }
+ if (IAP.PassTypeIdentity &&
+ OperatorDelete->getDeclContext() != OperatorNew->getDeclContext()) {
+ Diag(StartLoc,
+ diag::err_no_matching_type_aware_cleanup_deallocator_mismatch)
+ << OperatorNew->getDeclName() << DeleteName
+ << OperatorNew->getDeclContext();
+ Diag(OperatorNew->getLocation(), diag::err_type_aware_operator_found)
+ << OperatorNew->getDeclName() << OperatorNew->getDeclContext();
+ Diag(OperatorDelete->getLocation(), diag::err_type_aware_operator_found)
+ << OperatorDelete->getDeclName() << OperatorDelete->getDeclContext();
}
// C++1z [expr.new]p23:
@@ -3184,7 +3194,8 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
if (getLangOpts().CPlusPlus11 && isPlacementNew &&
isNonPlacementDeallocationFunction(*this, OperatorDelete)) {
UsualDeallocFnInfo Info(*this,
- DeclAccessPair::make(OperatorDelete, AS_public), AllocElemType);
+ DeclAccessPair::make(OperatorDelete, AS_public),
+ AllocElemType);
// Core issue, per mail to core reflector, 2016-10-09:
// If this is a member operator delete, and there is a corresponding
// non-sized member operator delete, this isn't /really/ a sized
@@ -3192,12 +3203,11 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
bool IsSizedDelete = Info.HasSizeT;
if (IsSizedDelete && !FoundGlobalDelete) {
ImplicitDeallocationParameters SizeTestingIDP = {
- .PassTypeIdentity = Info.HasTypeIdentity,
- .PassAlignment = Info.HasAlignValT,
- .PassSize = false
- };
- auto NonSizedDelete =
- resolveDeallocationOverload(*this, FoundDelete, SizeTestingIDP, AllocElemType);
+ .PassTypeIdentity = Info.HasTypeIdentity,
+ .PassAlignment = Info.HasAlignValT,
+ .PassSize = false};
+ auto NonSizedDelete = resolveDeallocationOverload(
+ *this, FoundDelete, SizeTestingIDP, AllocElemType);
if (NonSizedDelete && !NonSizedDelete.HasSizeT &&
NonSizedDelete.HasAlignValT == Info.HasAlignValT)
IsSizedDelete = false;
@@ -3214,7 +3224,9 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
<< DeleteName;
}
}
- if (CheckDeleteOperator(*this, StartLoc, Range, /* Diagnose */ true, FoundDelete.getNamingClass(), Matches[0].first, Matches[0].second))
+ if (CheckDeleteOperator(*this, StartLoc, Range, /* Diagnose */ true,
+ FoundDelete.getNamingClass(), Matches[0].first,
+ Matches[0].second))
return true;
} else if (!Matches.empty()) {
@@ -3477,14 +3489,15 @@ void Sema::DeclareGlobalAllocationFunction(DeclarationName Name,
}
}
-FunctionDecl *Sema::FindUsualDeallocationFunction(QualType DeallocType,
- SourceLocation StartLoc,
- ImplicitDeallocationParameters IDP,
- DeclarationName Name) {
+FunctionDecl *Sema::FindUsualDeallocationFunction(
+ QualType DeallocType, SourceLocation StartLoc,
+ ImplicitDeallocationParameters IDP, DeclarationName Name) {
DeclareGlobalNewDelete();
LookupResult FoundDelete(*this, Name, StartLoc, LookupOrdinaryName);
- auto LookupMode = AllowTypeAwareAllocators() ? DeallocLookupMode::OptionallyTyped : DeallocLookupMode::Untyped;
+ auto LookupMode = AllowTypeAwareAllocators()
+ ? DeallocLookupMode::OptionallyTyped
+ : DeallocLookupMode::Untyped;
LookupGlobalDeallocationFunctions(*this, StartLoc, FoundDelete, LookupMode,
Name, DeallocType);
@@ -3492,11 +3505,14 @@ FunctionDecl *Sema::FindUsualDeallocationFunction(QualType DeallocType,
// user-declared variadic operator delete or the enable_if attribute. We
// should probably not consider those cases to be usual deallocation
// functions. But for now we just make an arbitrary choice in that case.
- auto Result = resolveDeallocationOverload(*this, FoundDelete, IDP, DeallocType);
+ auto Result =
+ resolveDeallocationOverload(*this, FoundDelete, IDP, DeallocType);
if (!Result)
return nullptr;
- if (CheckDeleteOperator(*this, StartLoc, StartLoc, /* Diagnose */ true, FoundDelete.getNamingClass(), Result.Found, Result.FD))
+ if (CheckDeleteOperator(*this, StartLoc, StartLoc, /* Diagnose */ true,
+ FoundDelete.getNamingClass(), Result.Found,
+ Result.FD))
return nullptr;
assert(Result.FD && "operator delete missing from global scope?");
@@ -3509,11 +3525,10 @@ FunctionDecl *Sema::FindDeallocationFunctionForDestructor(SourceLocation Loc,
FunctionDecl *OperatorDelete = nullptr;
auto DeallocType = Context.getRecordType(RD);
- ImplicitDeallocationParameters IDP = {
- .PassTypeIdentity = AllowTypeAwareAllocators(),
- .PassAlignment = false,
- .PassSize = false
- };
+ ImplicitDeallocationParameters IDP = {.PassTypeIdentity =
+ AllowTypeAwareAllocators(),
+ .PassAlignment = false,
+ .PassSize = false};
if (FindDeallocationFunction(Loc, RD, Name, OperatorDelete, DeallocType, IDP))
return nullptr;
@@ -3531,7 +3546,9 @@ FunctionDecl *Sema::FindDeallocationFunctionForDestructor(SourceLocation Loc,
bool Sema::FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD,
DeclarationName Name,
- FunctionDecl *&Operator, QualType DeallocType, ImplicitDeallocationParameters IDP,
+ FunctionDecl *&Operator,
+ QualType DeallocType,
+ ImplicitDeallocationParameters IDP,
bool Diagnose) {
LookupResult Found(*this, Name, StartLoc, LookupOrdinaryName);
// Try to find operator delete/operator delete[] in class scope.
@@ -3542,7 +3559,8 @@ bool Sema::FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD,
Found.suppressDiagnostics();
- IDP.PassAlignment |= hasNewExtendedAlignment(*this, Context.getRecordType(RD));
+ IDP.PassAlignment |=
+ hasNewExtendedAlignment(*this, Context.getRecordType(RD));
// C++17 [expr.delete]p10:
// If the deallocation functions have class scope, the one without a
@@ -3553,7 +3571,9 @@ bool Sema::FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD,
// If we could find an overload, use it.
if (Matches.size() == 1) {
Operator = cast<CXXMethodDecl>(Matches[0].FD);
- return CheckDeleteOperator(*this, StartLoc, StartLoc, Diagnose, Found.getNamingClass(), Matches[0].Found, Operator);
+ return CheckDeleteOperator(*this, StartLoc, StartLoc, Diagnose,
+ Found.getNamingClass(), Matches[0].Found,
+ Operator);
}
// We found multiple suitable operators; complain about the ambiguity.
@@ -3976,13 +3996,13 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
ArrayForm ? OO_Array_Delete : OO_Delete);
if (PointeeRD) {
- ImplicitDeallocationParameters IDP = {
- .PassTypeIdentity = AllowTypeAwareAllocators(),
- .PassAlignment = false,
- .PassSize = false
- };
+ ImplicitDeallocationParameters IDP = {.PassTypeIdentity =
+ AllowTypeAwareAllocators(),
+ .PassAlignment = false,
+ .PassSize = false};
if (!UseGlobal &&
- FindDeallocationFunction(StartLoc, PointeeRD, DeleteName, OperatorDelete, Pointee, IDP))
+ FindDeallocationFunction(StartLoc, PointeeRD, DeleteName,
+ OperatorDelete, Pointee, IDP))
return ExprError();
// If we're allocating an array of records, check whether the
@@ -3991,16 +4011,17 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
// If the user specifically asked to use the global allocator,
// we'll need to do the lookup into the class.
if (UseGlobal)
- UsualArrayDeleteWantsSize =
- doesUsualArrayDeleteWantSize(*this, StartLoc, IDP.PassTypeIdentity, PointeeElem);
+ UsualArrayDeleteWantsSize = doesUsualArrayDeleteWantSize(
+ *this, StartLoc, IDP.PassTypeIdentity, PointeeElem);
// Otherwise, the usual operator delete[] should be the
// function we just found.
else if (isa_and_nonnull<CXXMethodDecl>(OperatorDelete))
UsualArrayDeleteWantsSize =
- UsualDeallocFnInfo(*this,
- DeclAccessPair::make(OperatorDelete, AS_public), Pointee)
- .HasSizeT;
+ UsualDeallocFnInfo(
+ *this, DeclAccessPair::make(OperatorDelete, AS_public),
+ Pointee)
+ .HasSizeT;
}
if (!PointeeRD->hasIrrelevantDestructor())
@@ -4030,12 +4051,12 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
bool Overaligned = hasNewExtendedAlignment(*this, Pointee);
// Look for a global declaration.
- ImplicitDeallocationParameters IDP = {
- .PassTypeIdentity = AllowTypeAwareAllocators(),
- .PassAlignment = Overaligned,
- .PassSize = CanProvideSize
- };
- OperatorDelete = FindUsualDeallocationFunction(Pointee, StartLoc, IDP, DeleteName);
+ ImplicitDeallocationParameters IDP = {.PassTypeIdentity =
+ AllowTypeAwareAllocators(),
+ .PassAlignment = Overaligned,
+ .PassSize = CanProvideSize};
+ OperatorDelete =
+ FindUsualDeallocationFunction(Pointee, StartLoc, IDP, DeleteName);
if (!OperatorDelete)
return ExprError();
}
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index 0b3dee8298..c0cad6f933 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -2065,7 +2065,8 @@ DeclResult Sema::CheckClassTemplate(
if (ShouldAddRedecl)
NewTemplate->setPreviousDecl(PrevClassTemplate);
- if (isStdTypeIdentity && (!StdTypeIdentity || getStdTypeIdentity()->isImplicit()))
+ if (isStdTypeIdentity &&
+ (!StdTypeIdentity || getStdTypeIdentity()->isImplicit()))
StdTypeIdentity = NewTemplate;
NewClass->setDescribedClassTemplate(NewTemplate);
``````````
</details>
https://github.com/llvm/llvm-project/pull/113510
More information about the cfe-commits
mailing list