https://github.com/Endilll updated https://github.com/llvm/llvm-project/pull/71322
>From 40d25b8009f1c8734a99fd1350adaced6884cc7f Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Sun, 5 Nov 2023 18:53:48 +0300 Subject: [PATCH 1/3] [clang][NFC] Refacator `CXXNewExpr::InitializationStyle` This patch converts `CXXNewExpr::InitializationStyle` into a scoped enum at namespace scope. It also affirms the status quo by adding a new enumerator to represent implicit initializer. --- .../modernize/MakeSmartPtrCheck.cpp | 7 +-- clang/include/clang/AST/ExprCXX.h | 48 +++++++++++-------- clang/lib/AST/ExprCXX.cpp | 12 ++--- clang/lib/AST/ItaniumMangle.cpp | 4 +- clang/lib/AST/JSONNodeDumper.cpp | 7 +-- clang/lib/AST/StmtPrinter.cpp | 6 +-- clang/lib/AST/StmtProfile.cpp | 2 +- clang/lib/Sema/SemaExprCXX.cpp | 22 ++++----- 8 files changed, 58 insertions(+), 50 deletions(-) diff --git a/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp b/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp index 71fd8eca300c1b2..616e57efa76ded5 100644 --- a/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp @@ -323,7 +323,8 @@ bool MakeSmartPtrCheck::replaceNew(DiagnosticBuilder &Diag, return false; }; switch (New->getInitializationStyle()) { - case CXXNewExpr::NoInit: { + case CXXNewInitializationStyle::None: + case CXXNewInitializationStyle::Implicit: { if (ArraySizeExpr.empty()) { Diag << FixItHint::CreateRemoval(SourceRange(NewStart, NewEnd)); } else { @@ -334,7 +335,7 @@ bool MakeSmartPtrCheck::replaceNew(DiagnosticBuilder &Diag, } break; } - case CXXNewExpr::CallInit: { + case CXXNewInitializationStyle::Call: { // FIXME: Add fixes for constructors with parameters that can be created // with a C++11 braced-init-list (e.g. std::vector, std::map). // Unlike ordinal cases, braced list can not be deduced in @@ -371,7 +372,7 @@ bool MakeSmartPtrCheck::replaceNew(DiagnosticBuilder &Diag, } break; } - case CXXNewExpr::ListInit: { + case CXXNewInitializationStyle::List: { // Range of the substring that we do not want to remove. SourceRange InitRange; if (const auto *NewConstruct = New->getConstructExpr()) { diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index a106bafcfa3e021..d713bcf8eb70258 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -2206,6 +2206,20 @@ class CXXScalarValueInitExpr : public Expr { } }; +enum class CXXNewInitializationStyle { + /// New-expression has no initializer as written. + None, + + /// New-expression has no written initializer, but has an implicit one. + Implicit, + + /// New-expression has a C++98 paren-delimited initializer. + Call, + + /// New-expression has a C++11 list-initializer. + List +}; + /// Represents a new-expression for memory allocation and constructor /// calls, e.g: "new CXXNewExpr(foo)". class CXXNewExpr final @@ -2259,25 +2273,12 @@ class CXXNewExpr final return isParenTypeId(); } -public: - enum InitializationStyle { - /// New-expression has no initializer as written. - NoInit, - - /// New-expression has a C++98 paren-delimited initializer. - CallInit, - - /// New-expression has a C++11 list-initializer. - ListInit - }; - -private: /// Build a c++ new expression. CXXNewExpr(bool IsGlobalNew, FunctionDecl *OperatorNew, FunctionDecl *OperatorDelete, bool ShouldPassAlignment, bool UsualArrayDeleteWantsSize, ArrayRef<Expr *> PlacementArgs, SourceRange TypeIdParens, std::optional<Expr *> ArraySize, - InitializationStyle InitializationStyle, Expr *Initializer, + CXXNewInitializationStyle InitializationStyle, Expr *Initializer, QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range, SourceRange DirectInitRange); @@ -2292,7 +2293,7 @@ class CXXNewExpr final FunctionDecl *OperatorDelete, bool ShouldPassAlignment, bool UsualArrayDeleteWantsSize, ArrayRef<Expr *> PlacementArgs, SourceRange TypeIdParens, std::optional<Expr *> ArraySize, - InitializationStyle InitializationStyle, Expr *Initializer, + CXXNewInitializationStyle InitializationStyle, Expr *Initializer, QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range, SourceRange DirectInitRange); @@ -2388,15 +2389,20 @@ class CXXNewExpr final /// Whether this new-expression has any initializer at all. bool hasInitializer() const { - return CXXNewExprBits.StoredInitializationStyle > 0; + switch(getInitializationStyle()) { + case CXXNewInitializationStyle::None: + return true; + case CXXNewInitializationStyle::Implicit: + case CXXNewInitializationStyle::Call: + case CXXNewInitializationStyle::List: + return false; + } } /// The kind of initializer this new-expression has. - InitializationStyle getInitializationStyle() const { - if (CXXNewExprBits.StoredInitializationStyle == 0) - return NoInit; - return static_cast<InitializationStyle>( - CXXNewExprBits.StoredInitializationStyle - 1); + CXXNewInitializationStyle getInitializationStyle() const { + return static_cast<CXXNewInitializationStyle>( + CXXNewExprBits.StoredInitializationStyle); } /// The initializer of this new-expression. diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index 4d2e0e9a945a781..4451f341f5722aa 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -184,7 +184,7 @@ CXXNewExpr::CXXNewExpr(bool IsGlobalNew, FunctionDecl *OperatorNew, bool UsualArrayDeleteWantsSize, ArrayRef<Expr *> PlacementArgs, SourceRange TypeIdParens, std::optional<Expr *> ArraySize, - InitializationStyle InitializationStyle, + CXXNewInitializationStyle InitializationStyle, Expr *Initializer, QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range, SourceRange DirectInitRange) @@ -193,7 +193,7 @@ CXXNewExpr::CXXNewExpr(bool IsGlobalNew, FunctionDecl *OperatorNew, AllocatedTypeInfo(AllocatedTypeInfo), Range(Range), DirectInitRange(DirectInitRange) { - assert((Initializer != nullptr || InitializationStyle == NoInit) && + assert((Initializer != nullptr || InitializationStyle == CXXNewInitializationStyle::None || InitializationStyle == CXXNewInitializationStyle::Implicit) && "Only NoInit can have no initializer!"); CXXNewExprBits.IsGlobalNew = IsGlobalNew; @@ -201,7 +201,7 @@ CXXNewExpr::CXXNewExpr(bool IsGlobalNew, FunctionDecl *OperatorNew, CXXNewExprBits.ShouldPassAlignment = ShouldPassAlignment; CXXNewExprBits.UsualArrayDeleteWantsSize = UsualArrayDeleteWantsSize; CXXNewExprBits.StoredInitializationStyle = - Initializer ? InitializationStyle + 1 : 0; + llvm::to_underlying(InitializationStyle); bool IsParenTypeId = TypeIdParens.isValid(); CXXNewExprBits.IsParenTypeId = IsParenTypeId; CXXNewExprBits.NumPlacementArgs = PlacementArgs.size(); @@ -217,10 +217,10 @@ CXXNewExpr::CXXNewExpr(bool IsGlobalNew, FunctionDecl *OperatorNew, getTrailingObjects<SourceRange>()[0] = TypeIdParens; switch (getInitializationStyle()) { - case CallInit: + case CXXNewInitializationStyle::Call: this->Range.setEnd(DirectInitRange.getEnd()); break; - case ListInit: + case CXXNewInitializationStyle::List: this->Range.setEnd(getInitializer()->getSourceRange().getEnd()); break; default: @@ -246,7 +246,7 @@ CXXNewExpr::Create(const ASTContext &Ctx, bool IsGlobalNew, bool ShouldPassAlignment, bool UsualArrayDeleteWantsSize, ArrayRef<Expr *> PlacementArgs, SourceRange TypeIdParens, std::optional<Expr *> ArraySize, - InitializationStyle InitializationStyle, Expr *Initializer, + CXXNewInitializationStyle InitializationStyle, Expr *Initializer, QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range, SourceRange DirectInitRange) { bool IsArray = ArraySize.has_value(); diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 8530675ca2a1ce2..a68945ba0cf9e96 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -4826,7 +4826,7 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity, Out << '_'; mangleType(New->getAllocatedType()); if (New->hasInitializer()) { - if (New->getInitializationStyle() == CXXNewExpr::ListInit) + if (New->getInitializationStyle() == CXXNewInitializationStyle::List) Out << "il"; else Out << "pi"; @@ -4840,7 +4840,7 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity, } else if (const ParenListExpr *PLE = dyn_cast<ParenListExpr>(Init)) { for (unsigned i = 0, e = PLE->getNumExprs(); i != e; ++i) mangleExpression(PLE->getExpr(i)); - } else if (New->getInitializationStyle() == CXXNewExpr::ListInit && + } else if (New->getInitializationStyle() == CXXNewInitializationStyle::List && isa<InitListExpr>(Init)) { // Only take InitListExprs apart for list-initialization. mangleInitListElements(cast<InitListExpr>(Init)); diff --git a/clang/lib/AST/JSONNodeDumper.cpp b/clang/lib/AST/JSONNodeDumper.cpp index 1a013b45c615d1b..aa3cf623d3d0296 100644 --- a/clang/lib/AST/JSONNodeDumper.cpp +++ b/clang/lib/AST/JSONNodeDumper.cpp @@ -1351,9 +1351,10 @@ void JSONNodeDumper::VisitCXXNewExpr(const CXXNewExpr *NE) { attributeOnlyIfTrue("isArray", NE->isArray()); attributeOnlyIfTrue("isPlacement", NE->getNumPlacementArgs() != 0); switch (NE->getInitializationStyle()) { - case CXXNewExpr::NoInit: break; - case CXXNewExpr::CallInit: JOS.attribute("initStyle", "call"); break; - case CXXNewExpr::ListInit: JOS.attribute("initStyle", "list"); break; + case CXXNewInitializationStyle::None: break; + case CXXNewInitializationStyle::Implicit: break; + case CXXNewInitializationStyle::Call: JOS.attribute("initStyle", "call"); break; + case CXXNewInitializationStyle::List: JOS.attribute("initStyle", "list"); break; } if (const FunctionDecl *FD = NE->getOperatorNew()) JOS.attribute("operatorNewDecl", createBareDeclRef(FD)); diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index a31aa0cfeeed8de..276413322b1b2d4 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -2298,9 +2298,9 @@ void StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) { if (E->isParenTypeId()) OS << ")"; - CXXNewExpr::InitializationStyle InitStyle = E->getInitializationStyle(); - if (InitStyle != CXXNewExpr::NoInit) { - bool Bare = InitStyle == CXXNewExpr::CallInit && + CXXNewInitializationStyle InitStyle = E->getInitializationStyle(); + if (InitStyle != CXXNewInitializationStyle::None && InitStyle != CXXNewInitializationStyle::Implicit) { + bool Bare = InitStyle == CXXNewInitializationStyle::Call && !isa<ParenListExpr>(E->getInitializer()); if (Bare) OS << "("; diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp index 6510fa369d78eb6..8128219dd6f63c9 100644 --- a/clang/lib/AST/StmtProfile.cpp +++ b/clang/lib/AST/StmtProfile.cpp @@ -2096,7 +2096,7 @@ void StmtProfiler::VisitCXXNewExpr(const CXXNewExpr *S) { ID.AddInteger(S->getNumPlacementArgs()); ID.AddBoolean(S->isGlobalNew()); ID.AddBoolean(S->isParenTypeId()); - ID.AddInteger(S->getInitializationStyle()); + ID.AddInteger(llvm::to_underlying(S->getInitializationStyle())); } void diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 25d7759cc168dd4..695d45e262978ff 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -1946,7 +1946,7 @@ Sema::ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal, Initializer); } -static bool isLegalArrayNewInitializer(CXXNewExpr::InitializationStyle Style, +static bool isLegalArrayNewInitializer(CXXNewInitializationStyle Style, Expr *Init) { if (!Init) return true; @@ -1957,7 +1957,7 @@ static bool isLegalArrayNewInitializer(CXXNewExpr::InitializationStyle Style, else if (CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(Init)) return !CCE->isListInitialization() && CCE->getConstructor()->isDefaultConstructor(); - else if (Style == CXXNewExpr::ListInit) { + else if (Style == CXXNewInitializationStyle::List) { assert(isa<InitListExpr>(Init) && "Shouldn't create list CXXConstructExprs for arrays."); return true; @@ -2008,22 +2008,22 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal, SourceRange TypeRange = AllocTypeInfo->getTypeLoc().getSourceRange(); SourceLocation StartLoc = Range.getBegin(); - CXXNewExpr::InitializationStyle initStyle; + CXXNewInitializationStyle initStyle; if (DirectInitRange.isValid()) { assert(Initializer && "Have parens but no initializer."); - initStyle = CXXNewExpr::CallInit; + initStyle = CXXNewInitializationStyle::Call; } else if (Initializer && isa<InitListExpr>(Initializer)) - initStyle = CXXNewExpr::ListInit; + initStyle = CXXNewInitializationStyle::List; else { assert((!Initializer || isa<ImplicitValueInitExpr>(Initializer) || isa<CXXConstructExpr>(Initializer)) && "Initializer expression that cannot have been implicitly created."); - initStyle = CXXNewExpr::NoInit; + initStyle = CXXNewInitializationStyle::None; } MultiExprArg Exprs(&Initializer, Initializer ? 1 : 0); if (ParenListExpr *List = dyn_cast_or_null<ParenListExpr>(Initializer)) { - assert(initStyle == CXXNewExpr::CallInit && "paren init for non-call init"); + assert(initStyle == CXXNewInitializationStyle::Call && "paren init for non-call init"); Exprs = MultiExprArg(List->getExprs(), List->getNumExprs()); } @@ -2034,12 +2034,12 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal, // - If the new-initializer is omitted, the object is default- // initialized (8.5); if no initialization is performed, // the object has indeterminate value - = initStyle == CXXNewExpr::NoInit + = initStyle == CXXNewInitializationStyle::None || initStyle == CXXNewInitializationStyle::Implicit ? InitializationKind::CreateDefault(TypeRange.getBegin()) // - Otherwise, the new-initializer is interpreted according to // the // initialization rules of 8.5 for direct-initialization. - : initStyle == CXXNewExpr::ListInit + : initStyle == CXXNewInitializationStyle::List ? InitializationKind::CreateDirectList( TypeRange.getBegin(), Initializer->getBeginLoc(), Initializer->getEndLoc()) @@ -2066,13 +2066,13 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal, return ExprError(); } else if (Deduced && !Deduced->isDeduced()) { MultiExprArg Inits = Exprs; - bool Braced = (initStyle == CXXNewExpr::ListInit); + bool Braced = (initStyle == CXXNewInitializationStyle::List); if (Braced) { auto *ILE = cast<InitListExpr>(Exprs[0]); Inits = MultiExprArg(ILE->getInits(), ILE->getNumInits()); } - if (initStyle == CXXNewExpr::NoInit || Inits.empty()) + if (initStyle == CXXNewInitializationStyle::None || initStyle == CXXNewInitializationStyle::Implicit || Inits.empty()) return ExprError(Diag(StartLoc, diag::err_auto_new_requires_ctor_arg) << AllocType << TypeRange); if (Inits.size() > 1) { >From cb37e34fb1fb770847fe04945868393f55bc5f7f Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Sun, 5 Nov 2023 18:59:55 +0300 Subject: [PATCH 2/3] Run clang-format --- clang/include/clang/AST/ExprCXX.h | 2 +- clang/lib/AST/ExprCXX.cpp | 21 +++++++++++---------- clang/lib/AST/ItaniumMangle.cpp | 3 ++- clang/lib/AST/JSONNodeDumper.cpp | 13 +++++++++---- clang/lib/AST/StmtPrinter.cpp | 3 ++- clang/lib/Sema/SemaExprCXX.cpp | 29 ++++++++++++++++------------- 6 files changed, 41 insertions(+), 30 deletions(-) diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index d713bcf8eb70258..86c72f61b4e141e 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -2389,7 +2389,7 @@ class CXXNewExpr final /// Whether this new-expression has any initializer at all. bool hasInitializer() const { - switch(getInitializationStyle()) { + switch (getInitializationStyle()) { case CXXNewInitializationStyle::None: return true; case CXXNewInitializationStyle::Implicit: diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index 4451f341f5722aa..83af7998f683382 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -193,7 +193,9 @@ CXXNewExpr::CXXNewExpr(bool IsGlobalNew, FunctionDecl *OperatorNew, AllocatedTypeInfo(AllocatedTypeInfo), Range(Range), DirectInitRange(DirectInitRange) { - assert((Initializer != nullptr || InitializationStyle == CXXNewInitializationStyle::None || InitializationStyle == CXXNewInitializationStyle::Implicit) && + assert((Initializer != nullptr || + InitializationStyle == CXXNewInitializationStyle::None || + InitializationStyle == CXXNewInitializationStyle::Implicit) && "Only NoInit can have no initializer!"); CXXNewExprBits.IsGlobalNew = IsGlobalNew; @@ -240,15 +242,14 @@ CXXNewExpr::CXXNewExpr(EmptyShell Empty, bool IsArray, CXXNewExprBits.IsParenTypeId = IsParenTypeId; } -CXXNewExpr * -CXXNewExpr::Create(const ASTContext &Ctx, bool IsGlobalNew, - FunctionDecl *OperatorNew, FunctionDecl *OperatorDelete, - bool ShouldPassAlignment, bool UsualArrayDeleteWantsSize, - ArrayRef<Expr *> PlacementArgs, SourceRange TypeIdParens, - std::optional<Expr *> ArraySize, - CXXNewInitializationStyle InitializationStyle, Expr *Initializer, - QualType Ty, TypeSourceInfo *AllocatedTypeInfo, - SourceRange Range, SourceRange DirectInitRange) { +CXXNewExpr *CXXNewExpr::Create( + const ASTContext &Ctx, bool IsGlobalNew, FunctionDecl *OperatorNew, + FunctionDecl *OperatorDelete, bool ShouldPassAlignment, + bool UsualArrayDeleteWantsSize, ArrayRef<Expr *> PlacementArgs, + SourceRange TypeIdParens, std::optional<Expr *> ArraySize, + CXXNewInitializationStyle InitializationStyle, Expr *Initializer, + QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range, + SourceRange DirectInitRange) { bool IsArray = ArraySize.has_value(); bool HasInit = Initializer != nullptr; unsigned NumPlacementArgs = PlacementArgs.size(); diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index a68945ba0cf9e96..5ac8c2e447cdb5a 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -4840,7 +4840,8 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity, } else if (const ParenListExpr *PLE = dyn_cast<ParenListExpr>(Init)) { for (unsigned i = 0, e = PLE->getNumExprs(); i != e; ++i) mangleExpression(PLE->getExpr(i)); - } else if (New->getInitializationStyle() == CXXNewInitializationStyle::List && + } else if (New->getInitializationStyle() == + CXXNewInitializationStyle::List && isa<InitListExpr>(Init)) { // Only take InitListExprs apart for list-initialization. mangleInitListElements(cast<InitListExpr>(Init)); diff --git a/clang/lib/AST/JSONNodeDumper.cpp b/clang/lib/AST/JSONNodeDumper.cpp index aa3cf623d3d0296..bc7bc7337b15e92 100644 --- a/clang/lib/AST/JSONNodeDumper.cpp +++ b/clang/lib/AST/JSONNodeDumper.cpp @@ -1351,10 +1351,15 @@ void JSONNodeDumper::VisitCXXNewExpr(const CXXNewExpr *NE) { attributeOnlyIfTrue("isArray", NE->isArray()); attributeOnlyIfTrue("isPlacement", NE->getNumPlacementArgs() != 0); switch (NE->getInitializationStyle()) { - case CXXNewInitializationStyle::None: break; - case CXXNewInitializationStyle::Implicit: break; - case CXXNewInitializationStyle::Call: JOS.attribute("initStyle", "call"); break; - case CXXNewInitializationStyle::List: JOS.attribute("initStyle", "list"); break; + case CXXNewInitializationStyle::None: + case CXXNewInitializationStyle::Implicit: + break; + case CXXNewInitializationStyle::Call: + JOS.attribute("initStyle", "call"); + break; + case CXXNewInitializationStyle::List: + JOS.attribute("initStyle", "list"); + break; } if (const FunctionDecl *FD = NE->getOperatorNew()) JOS.attribute("operatorNewDecl", createBareDeclRef(FD)); diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index 276413322b1b2d4..1e04bfdbab32445 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -2299,7 +2299,8 @@ void StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) { OS << ")"; CXXNewInitializationStyle InitStyle = E->getInitializationStyle(); - if (InitStyle != CXXNewInitializationStyle::None && InitStyle != CXXNewInitializationStyle::Implicit) { + if (InitStyle != CXXNewInitializationStyle::None && + InitStyle != CXXNewInitializationStyle::Implicit) { bool Bare = InitStyle == CXXNewInitializationStyle::Call && !isa<ParenListExpr>(E->getInitializer()); if (Bare) diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 695d45e262978ff..6a427800377727f 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -2023,7 +2023,8 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal, MultiExprArg Exprs(&Initializer, Initializer ? 1 : 0); if (ParenListExpr *List = dyn_cast_or_null<ParenListExpr>(Initializer)) { - assert(initStyle == CXXNewInitializationStyle::Call && "paren init for non-call init"); + assert(initStyle == CXXNewInitializationStyle::Call && + "paren init for non-call init"); Exprs = MultiExprArg(List->getExprs(), List->getNumExprs()); } @@ -2034,18 +2035,19 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal, // - If the new-initializer is omitted, the object is default- // initialized (8.5); if no initialization is performed, // the object has indeterminate value - = initStyle == CXXNewInitializationStyle::None || initStyle == CXXNewInitializationStyle::Implicit + = initStyle == CXXNewInitializationStyle::None || + initStyle == CXXNewInitializationStyle::Implicit ? InitializationKind::CreateDefault(TypeRange.getBegin()) - // - Otherwise, the new-initializer is interpreted according to - // the - // initialization rules of 8.5 for direct-initialization. - : initStyle == CXXNewInitializationStyle::List - ? InitializationKind::CreateDirectList( - TypeRange.getBegin(), Initializer->getBeginLoc(), - Initializer->getEndLoc()) - : InitializationKind::CreateDirect(TypeRange.getBegin(), - DirectInitRange.getBegin(), - DirectInitRange.getEnd()); + // - Otherwise, the new-initializer is interpreted according to + // the + // initialization rules of 8.5 for direct-initialization. + : initStyle == CXXNewInitializationStyle::List + ? InitializationKind::CreateDirectList(TypeRange.getBegin(), + Initializer->getBeginLoc(), + Initializer->getEndLoc()) + : InitializationKind::CreateDirect(TypeRange.getBegin(), + DirectInitRange.getBegin(), + DirectInitRange.getEnd()); // C++11 [dcl.spec.auto]p6. Deduce the type which 'auto' stands in for. auto *Deduced = AllocType->getContainedDeducedType(); @@ -2072,7 +2074,8 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal, Inits = MultiExprArg(ILE->getInits(), ILE->getNumInits()); } - if (initStyle == CXXNewInitializationStyle::None || initStyle == CXXNewInitializationStyle::Implicit || Inits.empty()) + if (initStyle == CXXNewInitializationStyle::None || + initStyle == CXXNewInitializationStyle::Implicit || Inits.empty()) return ExprError(Diag(StartLoc, diag::err_auto_new_requires_ctor_arg) << AllocType << TypeRange); if (Inits.size() > 1) { >From c96dff772f826928bfc3ee6bcde0c82ebbcbc07d Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Sun, 5 Nov 2023 22:25:39 +0300 Subject: [PATCH 3/3] Fix hasInitializer() --- clang/include/clang/AST/ExprCXX.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index 86c72f61b4e141e..37d310ef967d9c0 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -2391,11 +2391,11 @@ class CXXNewExpr final bool hasInitializer() const { switch (getInitializationStyle()) { case CXXNewInitializationStyle::None: - return true; + return false; case CXXNewInitializationStyle::Implicit: case CXXNewInitializationStyle::Call: case CXXNewInitializationStyle::List: - return false; + return true; } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits