Skip to content

Commit cc3fd19

Browse files
authored
[clang] Remove CXXNewInitializationStyle::Implicit (#78793)
This is a follow up to #71417 , which aims to resolve concerns brought up there. Namely, this patch replaces `CXXNewInitializationStyle::Implicit` with a dedicated `HasInitializer` flag. This makes `CXXNewInitializationStyle` to model syntax again. This patch also renames `Call` and `List` to less confusing `Parens` and `Braces`.
1 parent 5518a9d commit cc3fd19

File tree

10 files changed

+32
-54
lines changed

10 files changed

+32
-54
lines changed

clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -323,8 +323,7 @@ bool MakeSmartPtrCheck::replaceNew(DiagnosticBuilder &Diag,
323323
return false;
324324
};
325325
switch (New->getInitializationStyle()) {
326-
case CXXNewInitializationStyle::None:
327-
case CXXNewInitializationStyle::Implicit: {
326+
case CXXNewInitializationStyle::None: {
328327
if (ArraySizeExpr.empty()) {
329328
Diag << FixItHint::CreateRemoval(SourceRange(NewStart, NewEnd));
330329
} else {
@@ -335,7 +334,7 @@ bool MakeSmartPtrCheck::replaceNew(DiagnosticBuilder &Diag,
335334
}
336335
break;
337336
}
338-
case CXXNewInitializationStyle::Call: {
337+
case CXXNewInitializationStyle::Parens: {
339338
// FIXME: Add fixes for constructors with parameters that can be created
340339
// with a C++11 braced-init-list (e.g. std::vector, std::map).
341340
// Unlike ordinal cases, braced list can not be deduced in
@@ -372,7 +371,7 @@ bool MakeSmartPtrCheck::replaceNew(DiagnosticBuilder &Diag,
372371
}
373372
break;
374373
}
375-
case CXXNewInitializationStyle::List: {
374+
case CXXNewInitializationStyle::Braces: {
376375
// Range of the substring that we do not want to remove.
377376
SourceRange InitRange;
378377
if (const auto *NewConstruct = New->getConstructExpr()) {

clang/include/clang/AST/ExprCXX.h

+3-16
Original file line numberDiff line numberDiff line change
@@ -2210,14 +2210,11 @@ enum class CXXNewInitializationStyle {
22102210
/// New-expression has no initializer as written.
22112211
None,
22122212

2213-
/// New-expression has no written initializer, but has an implicit one.
2214-
Implicit,
2215-
22162213
/// New-expression has a C++98 paren-delimited initializer.
2217-
Call,
2214+
Parens,
22182215

22192216
/// New-expression has a C++11 list-initializer.
2220-
List
2217+
Braces
22212218
};
22222219

22232220
/// Represents a new-expression for memory allocation and constructor
@@ -2388,17 +2385,7 @@ class CXXNewExpr final
23882385
bool isGlobalNew() const { return CXXNewExprBits.IsGlobalNew; }
23892386

23902387
/// Whether this new-expression has any initializer at all.
2391-
bool hasInitializer() const {
2392-
switch (getInitializationStyle()) {
2393-
case CXXNewInitializationStyle::None:
2394-
return false;
2395-
case CXXNewInitializationStyle::Implicit:
2396-
case CXXNewInitializationStyle::Call:
2397-
case CXXNewInitializationStyle::List:
2398-
return true;
2399-
}
2400-
llvm_unreachable("Unknown initializer");
2401-
}
2388+
bool hasInitializer() const { return CXXNewExprBits.HasInitializer; }
24022389

24032390
/// The kind of initializer this new-expression has.
24042391
CXXNewInitializationStyle getInitializationStyle() const {

clang/include/clang/AST/Stmt.h

+5-3
Original file line numberDiff line numberDiff line change
@@ -868,9 +868,11 @@ class alignas(void *) Stmt {
868868
LLVM_PREFERRED_TYPE(bool)
869869
unsigned UsualArrayDeleteWantsSize : 1;
870870

871-
/// What kind of initializer do we have? Could be none, parens, or braces.
872-
/// In storage, we distinguish between "none, and no initializer expr", and
873-
/// "none, but an implicit initializer expr".
871+
// Is initializer expr present?
872+
LLVM_PREFERRED_TYPE(bool)
873+
unsigned HasInitializer : 1;
874+
875+
/// What kind of initializer syntax used? Could be none, parens, or braces.
874876
LLVM_PREFERRED_TYPE(CXXNewInitializationStyle)
875877
unsigned StoredInitializationStyle : 2;
876878

clang/lib/AST/ExprCXX.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,14 @@ CXXNewExpr::CXXNewExpr(bool IsGlobalNew, FunctionDecl *OperatorNew,
194194
DirectInitRange(DirectInitRange) {
195195

196196
assert((Initializer != nullptr ||
197-
InitializationStyle == CXXNewInitializationStyle::None ||
198-
InitializationStyle == CXXNewInitializationStyle::Implicit) &&
199-
"Only NoInit can have no initializer!");
197+
InitializationStyle == CXXNewInitializationStyle::None) &&
198+
"Only CXXNewInitializationStyle::None can have no initializer!");
200199

201200
CXXNewExprBits.IsGlobalNew = IsGlobalNew;
202201
CXXNewExprBits.IsArray = ArraySize.has_value();
203202
CXXNewExprBits.ShouldPassAlignment = ShouldPassAlignment;
204203
CXXNewExprBits.UsualArrayDeleteWantsSize = UsualArrayDeleteWantsSize;
204+
CXXNewExprBits.HasInitializer = Initializer != nullptr;
205205
CXXNewExprBits.StoredInitializationStyle =
206206
llvm::to_underlying(InitializationStyle);
207207
bool IsParenTypeId = TypeIdParens.isValid();
@@ -219,10 +219,10 @@ CXXNewExpr::CXXNewExpr(bool IsGlobalNew, FunctionDecl *OperatorNew,
219219
getTrailingObjects<SourceRange>()[0] = TypeIdParens;
220220

221221
switch (getInitializationStyle()) {
222-
case CXXNewInitializationStyle::Call:
222+
case CXXNewInitializationStyle::Parens:
223223
this->Range.setEnd(DirectInitRange.getEnd());
224224
break;
225-
case CXXNewInitializationStyle::List:
225+
case CXXNewInitializationStyle::Braces:
226226
this->Range.setEnd(getInitializer()->getSourceRange().getEnd());
227227
break;
228228
default:

clang/lib/AST/ItaniumMangle.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -4897,7 +4897,7 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
48974897
Out << '_';
48984898
mangleType(New->getAllocatedType());
48994899
if (New->hasInitializer()) {
4900-
if (New->getInitializationStyle() == CXXNewInitializationStyle::List)
4900+
if (New->getInitializationStyle() == CXXNewInitializationStyle::Braces)
49014901
Out << "il";
49024902
else
49034903
Out << "pi";
@@ -4912,7 +4912,7 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
49124912
for (unsigned i = 0, e = PLE->getNumExprs(); i != e; ++i)
49134913
mangleExpression(PLE->getExpr(i));
49144914
} else if (New->getInitializationStyle() ==
4915-
CXXNewInitializationStyle::List &&
4915+
CXXNewInitializationStyle::Braces &&
49164916
isa<InitListExpr>(Init)) {
49174917
// Only take InitListExprs apart for list-initialization.
49184918
mangleInitListElements(cast<InitListExpr>(Init));

clang/lib/AST/JSONNodeDumper.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -1356,12 +1356,11 @@ void JSONNodeDumper::VisitCXXNewExpr(const CXXNewExpr *NE) {
13561356
attributeOnlyIfTrue("isPlacement", NE->getNumPlacementArgs() != 0);
13571357
switch (NE->getInitializationStyle()) {
13581358
case CXXNewInitializationStyle::None:
1359-
case CXXNewInitializationStyle::Implicit:
13601359
break;
1361-
case CXXNewInitializationStyle::Call:
1360+
case CXXNewInitializationStyle::Parens:
13621361
JOS.attribute("initStyle", "call");
13631362
break;
1364-
case CXXNewInitializationStyle::List:
1363+
case CXXNewInitializationStyle::Braces:
13651364
JOS.attribute("initStyle", "list");
13661365
break;
13671366
}

clang/lib/AST/StmtPrinter.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -2300,9 +2300,8 @@ void StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) {
23002300
OS << ")";
23012301

23022302
CXXNewInitializationStyle InitStyle = E->getInitializationStyle();
2303-
if (InitStyle != CXXNewInitializationStyle::None &&
2304-
InitStyle != CXXNewInitializationStyle::Implicit) {
2305-
bool Bare = InitStyle == CXXNewInitializationStyle::Call &&
2303+
if (InitStyle != CXXNewInitializationStyle::None) {
2304+
bool Bare = InitStyle == CXXNewInitializationStyle::Parens &&
23062305
!isa<ParenListExpr>(E->getInitializer());
23072306
if (Bare)
23082307
OS << "(";

clang/lib/Sema/SemaExprCXX.cpp

+8-18
Original file line numberDiff line numberDiff line change
@@ -1957,7 +1957,7 @@ static bool isLegalArrayNewInitializer(CXXNewInitializationStyle Style,
19571957
else if (CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(Init))
19581958
return !CCE->isListInitialization() &&
19591959
CCE->getConstructor()->isDefaultConstructor();
1960-
else if (Style == CXXNewInitializationStyle::List) {
1960+
else if (Style == CXXNewInitializationStyle::Braces) {
19611961
assert(isa<InitListExpr>(Init) &&
19621962
"Shouldn't create list CXXConstructExprs for arrays.");
19631963
return true;
@@ -2011,9 +2011,9 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal,
20112011
CXXNewInitializationStyle InitStyle;
20122012
if (DirectInitRange.isValid()) {
20132013
assert(Initializer && "Have parens but no initializer.");
2014-
InitStyle = CXXNewInitializationStyle::Call;
2014+
InitStyle = CXXNewInitializationStyle::Parens;
20152015
} else if (Initializer && isa<InitListExpr>(Initializer))
2016-
InitStyle = CXXNewInitializationStyle::List;
2016+
InitStyle = CXXNewInitializationStyle::Braces;
20172017
else {
20182018
assert((!Initializer || isa<ImplicitValueInitExpr>(Initializer) ||
20192019
isa<CXXConstructExpr>(Initializer)) &&
@@ -2023,7 +2023,7 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal,
20232023

20242024
MultiExprArg Exprs(&Initializer, Initializer ? 1 : 0);
20252025
if (ParenListExpr *List = dyn_cast_or_null<ParenListExpr>(Initializer)) {
2026-
assert(InitStyle == CXXNewInitializationStyle::Call &&
2026+
assert(InitStyle == CXXNewInitializationStyle::Parens &&
20272027
"paren init for non-call init");
20282028
Exprs = MultiExprArg(List->getExprs(), List->getNumExprs());
20292029
}
@@ -2037,15 +2037,14 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal,
20372037
// initialized (8.5); if no initialization is performed,
20382038
// the object has indeterminate value
20392039
case CXXNewInitializationStyle::None:
2040-
case CXXNewInitializationStyle::Implicit:
20412040
return InitializationKind::CreateDefault(TypeRange.getBegin());
20422041
// - Otherwise, the new-initializer is interpreted according to the
20432042
// initialization rules of 8.5 for direct-initialization.
2044-
case CXXNewInitializationStyle::Call:
2043+
case CXXNewInitializationStyle::Parens:
20452044
return InitializationKind::CreateDirect(TypeRange.getBegin(),
20462045
DirectInitRange.getBegin(),
20472046
DirectInitRange.getEnd());
2048-
case CXXNewInitializationStyle::List:
2047+
case CXXNewInitializationStyle::Braces:
20492048
return InitializationKind::CreateDirectList(TypeRange.getBegin(),
20502049
Initializer->getBeginLoc(),
20512050
Initializer->getEndLoc());
@@ -2072,14 +2071,13 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal,
20722071
return ExprError();
20732072
} else if (Deduced && !Deduced->isDeduced()) {
20742073
MultiExprArg Inits = Exprs;
2075-
bool Braced = (InitStyle == CXXNewInitializationStyle::List);
2074+
bool Braced = (InitStyle == CXXNewInitializationStyle::Braces);
20762075
if (Braced) {
20772076
auto *ILE = cast<InitListExpr>(Exprs[0]);
20782077
Inits = MultiExprArg(ILE->getInits(), ILE->getNumInits());
20792078
}
20802079

2081-
if (InitStyle == CXXNewInitializationStyle::None ||
2082-
InitStyle == CXXNewInitializationStyle::Implicit || Inits.empty())
2080+
if (InitStyle == CXXNewInitializationStyle::None || Inits.empty())
20832081
return ExprError(Diag(StartLoc, diag::err_auto_new_requires_ctor_arg)
20842082
<< AllocType << TypeRange);
20852083
if (Inits.size() > 1) {
@@ -2447,14 +2445,6 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal,
24472445
FullInit = Binder->getSubExpr();
24482446

24492447
Initializer = FullInit.get();
2450-
// We don't know that we're generating an implicit initializer until now, so
2451-
// we have to update the initialization style as well.
2452-
//
2453-
// FIXME: it would be nice to determine the correct initialization style
2454-
// earlier so InitStyle doesn't need adjusting.
2455-
if (InitStyle == CXXNewInitializationStyle::None && Initializer) {
2456-
InitStyle = CXXNewInitializationStyle::Implicit;
2457-
}
24582448

24592449
// FIXME: If we have a KnownArraySize, check that the array bound of the
24602450
// initializer is no greater than that constant value.

clang/lib/Serialization/ASTReaderStmt.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1901,6 +1901,7 @@ void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {
19011901
E->CXXNewExprBits.IsGlobalNew = Record.readInt();
19021902
E->CXXNewExprBits.ShouldPassAlignment = Record.readInt();
19031903
E->CXXNewExprBits.UsualArrayDeleteWantsSize = Record.readInt();
1904+
E->CXXNewExprBits.HasInitializer = Record.readInt();
19041905
E->CXXNewExprBits.StoredInitializationStyle = Record.readInt();
19051906

19061907
assert((IsArray == E->isArray()) && "Wrong IsArray!");

clang/lib/Serialization/ASTWriterStmt.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1901,6 +1901,7 @@ void ASTStmtWriter::VisitCXXNewExpr(CXXNewExpr *E) {
19011901
Record.push_back(E->isGlobalNew());
19021902
Record.push_back(E->passAlignment());
19031903
Record.push_back(E->doesUsualArrayDeleteWantSize());
1904+
Record.push_back(E->CXXNewExprBits.HasInitializer);
19041905
Record.push_back(E->CXXNewExprBits.StoredInitializationStyle);
19051906

19061907
Record.AddDeclRef(E->getOperatorNew());

0 commit comments

Comments
 (0)