Skip to content

Commit fc78491

Browse files
committed
Eliminate CXXExpansionInitListExpr
1 parent ce432df commit fc78491

File tree

2 files changed

+26
-13
lines changed

2 files changed

+26
-13
lines changed

clang/include/clang/Sema/Sema.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15659,9 +15659,8 @@ class Sema final : public SemaBase {
1565915659
SourceLocation ColonLoc,
1566015660
SourceLocation RParenLoc);
1566115661

15662-
ExprResult
15663-
BuildCXXExpansionInitListSelectExpr(CXXExpansionInitListExpr *Range,
15664-
Expr *Idx);
15662+
ExprResult BuildCXXExpansionInitListSelectExpr(InitListExpr *Range,
15663+
Expr *Idx);
1566515664

1566615665
std::optional<uint64_t>
1566715666
ComputeExpansionSize(CXXExpansionStmtPattern *Expansion);

clang/lib/Sema/SemaExpand.cpp

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,21 @@ static bool FinaliseExpansionVar(Sema &S, VarDecl *ExpansionVar,
4242
return ExpansionVar->isInvalidDecl();
4343
}
4444

45+
static auto InitListContainsPack(const InitListExpr *ILE) {
46+
return llvm::any_of(ArrayRef(ILE->getInits(), ILE->getNumInits()),
47+
[](const Expr *E) { return isa<PackExpansionExpr>(E); });
48+
}
49+
50+
static bool HasDependentSize(const CXXExpansionStmtPattern* pattern) {
51+
if (isa<CXXEnumeratingExpansionStmtPattern>(pattern)) {
52+
auto *SelectExpr = cast<CXXExpansionInitListSelectExpr>(
53+
pattern->getExpansionVariable()->getInit());
54+
return InitListContainsPack(SelectExpr->getRangeExpr());
55+
}
56+
57+
llvm_unreachable("Invalid expansion statement class");
58+
}
59+
4560
CXXExpansionStmtDecl *
4661
Sema::ActOnCXXExpansionStmtDecl(unsigned TemplateDepth,
4762
SourceLocation TemplateKWLoc) {
@@ -74,8 +89,7 @@ Sema::BuildCXXExpansionStmtDecl(DeclContext *Ctx, SourceLocation TemplateKWLoc,
7489
ExprResult Sema::ActOnCXXExpansionInitList(MultiExprArg SubExprs,
7590
SourceLocation LBraceLoc,
7691
SourceLocation RBraceLoc) {
77-
return CXXExpansionInitListExpr::Create(Context, SubExprs, LBraceLoc,
78-
RBraceLoc);
92+
return new (Context) InitListExpr(Context, LBraceLoc, SubExprs, RBraceLoc);
7993
}
8094

8195
StmtResult Sema::ActOnCXXExpansionStmtPattern(
@@ -99,7 +113,8 @@ StmtResult Sema::ActOnCXXExpansionStmtPattern(
99113
return StmtError();
100114

101115
// This is an enumerating expansion statement.
102-
if (auto *ILE = dyn_cast<CXXExpansionInitListExpr>(ExpansionInitializer)) {
116+
if (auto *ILE = dyn_cast<InitListExpr>(ExpansionInitializer)) {
117+
assert(ILE->isSyntacticForm());
103118
ExprResult Initializer =
104119
BuildCXXExpansionInitListSelectExpr(ILE, BuildIndexDRE(*this, ESD));
105120
if (FinaliseExpansionVar(*this, ExpansionVar, Initializer))
@@ -133,7 +148,7 @@ StmtResult Sema::FinishCXXExpansionStmt(Stmt *Exp, Stmt *Body) {
133148
"should not rebuild expansion statement after instantiation");
134149

135150
Expansion->setBody(Body);
136-
if (Expansion->hasDependentSize())
151+
if (HasDependentSize(Expansion))
137152
return Expansion;
138153

139154
// This can fail if this is an iterating expansion statement.
@@ -199,9 +214,9 @@ StmtResult Sema::FinishCXXExpansionStmt(Stmt *Exp, Stmt *Body) {
199214
}
200215

201216
ExprResult
202-
Sema::BuildCXXExpansionInitListSelectExpr(CXXExpansionInitListExpr *Range,
217+
Sema::BuildCXXExpansionInitListSelectExpr(InitListExpr *Range,
203218
Expr *Idx) {
204-
if (Range->containsPackExpansion() || Idx->isValueDependent())
219+
if (Idx->isValueDependent() || InitListContainsPack(Range))
205220
return new (Context) CXXExpansionInitListSelectExpr(Context, Range, Idx);
206221

207222
// The index is a DRE to a template parameter; we should never
@@ -211,19 +226,18 @@ Sema::BuildCXXExpansionInitListSelectExpr(CXXExpansionInitListExpr *Range,
211226
llvm_unreachable("Failed to evaluate expansion index");
212227

213228
uint64_t I = ER.Val.getInt().getZExtValue();
214-
return Range->getExprs()[I];
229+
return Range->getInit(I);
215230
}
216231

217232
std::optional<uint64_t>
218233
Sema::ComputeExpansionSize(CXXExpansionStmtPattern *Expansion) {
219-
assert(!Expansion->hasDependentSize());
234+
assert(!HasDependentSize(Expansion));
220235

221236
if (isa<CXXEnumeratingExpansionStmtPattern>(Expansion))
222237
return cast<CXXExpansionInitListSelectExpr>(
223238
Expansion->getExpansionVariable()->getInit())
224239
->getRangeExpr()
225-
->getExprs()
226-
.size();
240+
->getNumInits();
227241

228242
llvm_unreachable("TODO");
229243
}

0 commit comments

Comments
 (0)