@@ -47,14 +47,21 @@ static auto InitListContainsPack(const InitListExpr *ILE) {
4747 [](const Expr *E) { return isa<PackExpansionExpr>(E); });
4848}
4949
50- static bool HasDependentSize (const CXXExpansionStmtPattern* pattern) {
51- if (isa<CXXEnumeratingExpansionStmtPattern>(pattern)) {
50+ static bool HasDependentSize (const CXXExpansionStmtPattern *Pattern) {
51+ switch (Pattern->getKind ()) {
52+ case CXXExpansionStmtPattern::ExpansionStmtKind::Enumerating: {
5253 auto *SelectExpr = cast<CXXExpansionInitListSelectExpr>(
53- pattern ->getExpansionVariable ()->getInit ());
54+ Pattern ->getExpansionVariable ()->getInit ());
5455 return InitListContainsPack (SelectExpr->getRangeExpr ());
5556 }
5657
57- llvm_unreachable (" Invalid expansion statement class" );
58+ case CXXExpansionStmtPattern::ExpansionStmtKind::Iterating:
59+ case CXXExpansionStmtPattern::ExpansionStmtKind::Destructuring:
60+ case CXXExpansionStmtPattern::ExpansionStmtKind::Dependent:
61+ llvm_unreachable (" TODO" );
62+ }
63+
64+ llvm_unreachable (" invalid pattern kind" );
5865}
5966
6067CXXExpansionStmtDecl *
@@ -134,9 +141,9 @@ StmtResult Sema::ActOnCXXExpansionStmtPattern(
134141StmtResult Sema::BuildCXXEnumeratingExpansionStmtPattern (
135142 Decl *ESD, Stmt *Init, Stmt *ExpansionVar, SourceLocation LParenLoc,
136143 SourceLocation ColonLoc, SourceLocation RParenLoc) {
137- return new (Context) CXXEnumeratingExpansionStmtPattern (
138- cast<CXXExpansionStmtDecl>(ESD), Init, cast<DeclStmt>(ExpansionVar) ,
139- LParenLoc, ColonLoc, RParenLoc);
144+ return CXXExpansionStmtPattern::CreateEnumerating (
145+ Context, cast<CXXExpansionStmtDecl>(ESD), Init,
146+ cast<DeclStmt>(ExpansionVar), LParenLoc, ColonLoc, RParenLoc);
140147}
141148
142149StmtResult Sema::FinishCXXExpansionStmt (Stmt *Exp, Stmt *Body) {
@@ -161,15 +168,14 @@ StmtResult Sema::FinishCXXExpansionStmt(Stmt *Exp, Stmt *Body) {
161168 if (Expansion->getInit ())
162169 Shared.push_back (Expansion->getInit ());
163170
164- assert (isa<CXXEnumeratingExpansionStmtPattern>(Expansion ) && " TODO" );
171+ assert (Expansion-> isEnumerating ( ) && " TODO" );
165172
166173 // Return an empty statement if the range is empty.
167174 if (*NumInstantiations == 0 ) {
168175 Expansion->getDecl ()->setInstantiations (
169176 CXXExpansionStmtInstantiation::Create (
170177 Context, Expansion->getBeginLoc (), Expansion->getEndLoc (),
171- /* Instantiations=*/ {}, Shared,
172- isa<CXXDestructuringExpansionStmtPattern>(Expansion)));
178+ /* Instantiations=*/ {}, Shared, Expansion->isDestructuring ()));
173179 return Expansion;
174180 }
175181
@@ -207,7 +213,7 @@ StmtResult Sema::FinishCXXExpansionStmt(Stmt *Exp, Stmt *Body) {
207213
208214 auto *InstantiationsStmt = CXXExpansionStmtInstantiation::Create (
209215 Context, Expansion->getBeginLoc (), Expansion->getEndLoc (), Instantiations,
210- Shared, isa<CXXDestructuringExpansionStmtPattern>(Expansion ));
216+ Shared, Expansion-> isDestructuring ( ));
211217
212218 Expansion->getDecl ()->setInstantiations (InstantiationsStmt);
213219 return Expansion;
@@ -233,7 +239,7 @@ std::optional<uint64_t>
233239Sema::ComputeExpansionSize (CXXExpansionStmtPattern *Expansion) {
234240 assert (!HasDependentSize (Expansion));
235241
236- if (isa<CXXEnumeratingExpansionStmtPattern>(Expansion ))
242+ if (Expansion-> isEnumerating ( ))
237243 return cast<CXXExpansionInitListSelectExpr>(
238244 Expansion->getExpansionVariable ()->getInit ())
239245 ->getRangeExpr ()
0 commit comments