@@ -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+
4560CXXExpansionStmtDecl *
4661Sema::ActOnCXXExpansionStmtDecl (unsigned TemplateDepth,
4762 SourceLocation TemplateKWLoc) {
@@ -74,8 +89,7 @@ Sema::BuildCXXExpansionStmtDecl(DeclContext *Ctx, SourceLocation TemplateKWLoc,
7489ExprResult 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
8195StmtResult 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
201216ExprResult
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
217232std::optional<uint64_t >
218233Sema::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