@@ -1700,11 +1700,13 @@ class Parser : public CodeCompletionHandler {
17001700 }
17011701
17021702 // / Information on a C++0x for-range-initializer found while parsing a
1703- // / declaration which turns out to be a for-range-declaration.
1703+ // / declaration which turns out to be a for-range-declaration. Also used
1704+ // / for C++26's expansion statements.
17041705 struct ForRangeInit {
17051706 SourceLocation ColonLoc;
17061707 ExprResult RangeExpr;
17071708 SmallVector<MaterializeTemporaryExpr *, 8 > LifetimeExtendTemps;
1709+ bool ExpansionStmt = false ;
17081710 bool ParsedForRangeDecl () { return !ColonLoc.isInvalid (); }
17091711 };
17101712 struct ForRangeInfo : ForRangeInit {
@@ -4186,7 +4188,8 @@ class Parser : public CodeCompletionHandler {
41864188 bool ParseExpressionList (SmallVectorImpl<Expr *> &Exprs,
41874189 llvm::function_ref<void ()> ExpressionStarts =
41884190 llvm::function_ref<void()>(),
4189- bool FailImmediatelyOnInvalidExpr = false);
4191+ bool FailImmediatelyOnInvalidExpr = false,
4192+ bool StopAtRBraceAfterComma = false);
41904193
41914194 // / ParseSimpleExpressionList - A simple comma-separated list of expressions,
41924195 // / used for misc language extensions.
@@ -5246,6 +5249,16 @@ class Parser : public CodeCompletionHandler {
52465249 // /
52475250 ExprResult ParseBraceInitializer ();
52485251
5252+ // / ParseExpansionInitList - Called when the initializer of an expansion
5253+ // / statement starts with an open brace.
5254+ // /
5255+ // / \verbatim
5256+ // / expansion-init-list: [C++26 [stmt.expand]]
5257+ // / '{' expression-list ','[opt] '}'
5258+ // / '{' '}'
5259+ // / \endverbatim
5260+ ExprResult ParseExpansionInitList ();
5261+
52495262 struct DesignatorCompletionInfo {
52505263 SmallVectorImpl<Expr *> &InitExprs;
52515264 QualType PreferredBaseType;
@@ -7452,8 +7465,12 @@ class Parser : public CodeCompletionHandler {
74527465 // / [C++0x] expression
74537466 // / [C++0x] braced-init-list [TODO]
74547467 // / \endverbatim
7455- StmtResult ParseForStatement (SourceLocation *TrailingElseLoc,
7456- LabelDecl *PrecedingLabel);
7468+ StmtResult ParseForStatement (
7469+ SourceLocation *TrailingElseLoc, LabelDecl *PrecedingLabel,
7470+ CXXExpansionStmtDecl *CXXExpansionStmtDeclaration = nullptr );
7471+
7472+ void ParseForRangeInitializerAfterColon (ForRangeInit &FRI,
7473+ ParsingDeclSpec *VarDeclSpec);
74577474
74587475 // / ParseGotoStatement
74597476 // / \verbatim
@@ -7500,6 +7517,22 @@ class Parser : public CodeCompletionHandler {
75007517
75017518 StmtResult ParseBreakOrContinueStatement (bool IsContinue);
75027519
7520+ // / ParseExpansionStatement - Parse a C++26 expansion
7521+ // / statement ('template for').
7522+ // /
7523+ // / \verbatim
7524+ // / expansion-statement:
7525+ // / 'template' 'for' '(' init-statement[opt]
7526+ // / for-range-declaration ':' expansion-initializer ')'
7527+ // / compound-statement
7528+ // /
7529+ // / expansion-initializer:
7530+ // / expression
7531+ // / expansion-init-list
7532+ // / \endverbatim
7533+ StmtResult ParseExpansionStatement (SourceLocation *TrailingElseLoc,
7534+ LabelDecl *PrecedingLabel);
7535+
75037536 StmtResult ParsePragmaLoopHint (StmtVector &Stmts, ParsedStmtContext StmtCtx,
75047537 SourceLocation *TrailingElseLoc,
75057538 ParsedAttributes &Attrs,
0 commit comments