1 //===--- ParseStmt.cpp - Statement and Block Parser -----------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the Statement and Block portions of the Parser
10 // interface.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "clang/AST/PrettyDeclStackTrace.h"
15 #include "clang/Basic/Attributes.h"
16 #include "clang/Basic/PrettyStackTrace.h"
17 #include "clang/Basic/TokenKinds.h"
18 #include "clang/Parse/LoopHint.h"
19 #include "clang/Parse/Parser.h"
20 #include "clang/Parse/RAIIObjectsForParser.h"
21 #include "clang/Sema/DeclSpec.h"
22 #include "clang/Sema/Scope.h"
23 #include "clang/Sema/TypoCorrection.h"
24 #include "llvm/ADT/STLExtras.h"
25 #include <optional>
26 
27 using namespace clang;
28 
29 //===----------------------------------------------------------------------===//
30 // C99 6.8: Statements and Blocks.
31 //===----------------------------------------------------------------------===//
32 
33 /// Parse a standalone statement (for instance, as the body of an 'if',
34 /// 'while', or 'for').
35 StmtResult Parser::ParseStatement(SourceLocation *TrailingElseLoc,
36                                   ParsedStmtContext StmtCtx) {
37   StmtResult Res;
38 
39   // We may get back a null statement if we found a #pragma. Keep going until
40   // we get an actual statement.
41   StmtVector Stmts;
42   do {
43     Res = ParseStatementOrDeclaration(Stmts, StmtCtx, TrailingElseLoc);
44   } while (!Res.isInvalid() && !Res.get());
45 
46   return Res;
47 }
48 
49 /// ParseStatementOrDeclaration - Read 'statement' or 'declaration'.
50 ///       StatementOrDeclaration:
51 ///         statement
52 ///         declaration
53 ///
54 ///       statement:
55 ///         labeled-statement
56 ///         compound-statement
57 ///         expression-statement
58 ///         selection-statement
59 ///         iteration-statement
60 ///         jump-statement
61 /// [C++]   declaration-statement
62 /// [C++]   try-block
63 /// [MS]    seh-try-block
64 /// [OBC]   objc-throw-statement
65 /// [OBC]   objc-try-catch-statement
66 /// [OBC]   objc-synchronized-statement
67 /// [GNU]   asm-statement
68 /// [OMP]   openmp-construct             [TODO]
69 ///
70 ///       labeled-statement:
71 ///         identifier ':' statement
72 ///         'case' constant-expression ':' statement
73 ///         'default' ':' statement
74 ///
75 ///       selection-statement:
76 ///         if-statement
77 ///         switch-statement
78 ///
79 ///       iteration-statement:
80 ///         while-statement
81 ///         do-statement
82 ///         for-statement
83 ///
84 ///       expression-statement:
85 ///         expression[opt] ';'
86 ///
87 ///       jump-statement:
88 ///         'goto' identifier ';'
89 ///         'continue' ';'
90 ///         'break' ';'
91 ///         'return' expression[opt] ';'
92 /// [GNU]   'goto' '*' expression ';'
93 ///
94 /// [OBC] objc-throw-statement:
95 /// [OBC]   '@' 'throw' expression ';'
96 /// [OBC]   '@' 'throw' ';'
97 ///
98 StmtResult
99 Parser::ParseStatementOrDeclaration(StmtVector &Stmts,
100                                     ParsedStmtContext StmtCtx,
101                                     SourceLocation *TrailingElseLoc) {
102 
103   ParenBraceBracketBalancer BalancerRAIIObj(*this);
104 
105   // Because we're parsing either a statement or a declaration, the order of
106   // attribute parsing is important. [[]] attributes at the start of a
107   // statement are different from [[]] attributes that follow an __attribute__
108   // at the start of the statement. Thus, we're not using MaybeParseAttributes
109   // here because we don't want to allow arbitrary orderings.
110   ParsedAttributes CXX11Attrs(AttrFactory);
111   MaybeParseCXX11Attributes(CXX11Attrs, /*MightBeObjCMessageSend*/ true);
112   ParsedAttributes GNUAttrs(AttrFactory);
113   if (getLangOpts().OpenCL)
114     MaybeParseGNUAttributes(GNUAttrs);
115 
116   StmtResult Res = ParseStatementOrDeclarationAfterAttributes(
117       Stmts, StmtCtx, TrailingElseLoc, CXX11Attrs, GNUAttrs);
118   MaybeDestroyTemplateIds();
119 
120   // Attributes that are left should all go on the statement, so concatenate the
121   // two lists.
122   ParsedAttributes Attrs(AttrFactory);
123   takeAndConcatenateAttrs(CXX11Attrs, GNUAttrs, Attrs);
124 
125   assert((Attrs.empty() || Res.isInvalid() || Res.isUsable()) &&
126          "attributes on empty statement");
127 
128   if (Attrs.empty() || Res.isInvalid())
129     return Res;
130 
131   return Actions.ActOnAttributedStmt(Attrs, Res.get());
132 }
133 
134 namespace {
135 class StatementFilterCCC final : public CorrectionCandidateCallback {
136 public:
137   StatementFilterCCC(Token nextTok) : NextToken(nextTok) {
138     WantTypeSpecifiers = nextTok.isOneOf(tok::l_paren, tok::less, tok::l_square,
139                                          tok::identifier, tok::star, tok::amp);
140     WantExpressionKeywords =
141         nextTok.isOneOf(tok::l_paren, tok::identifier, tok::arrow, tok::period);
142     WantRemainingKeywords =
143         nextTok.isOneOf(tok::l_paren, tok::semi, tok::identifier, tok::l_brace);
144     WantCXXNamedCasts = false;
145   }
146 
147   bool ValidateCandidate(const TypoCorrection &candidate) override {
148     if (FieldDecl *FD = candidate.getCorrectionDeclAs<FieldDecl>())
149       return !candidate.getCorrectionSpecifier() || isa<ObjCIvarDecl>(FD);
150     if (NextToken.is(tok::equal))
151       return candidate.getCorrectionDeclAs<VarDecl>();
152     if (NextToken.is(tok::period) &&
153         candidate.getCorrectionDeclAs<NamespaceDecl>())
154       return false;
155     return CorrectionCandidateCallback::ValidateCandidate(candidate);
156   }
157 
158   std::unique_ptr<CorrectionCandidateCallback> clone() override {
159     return std::make_unique<StatementFilterCCC>(*this);
160   }
161 
162 private:
163   Token NextToken;
164 };
165 }
166 
167 StmtResult Parser::ParseStatementOrDeclarationAfterAttributes(
168     StmtVector &Stmts, ParsedStmtContext StmtCtx,
169     SourceLocation *TrailingElseLoc, ParsedAttributes &CXX11Attrs,
170     ParsedAttributes &GNUAttrs) {
171   const char *SemiError = nullptr;
172   StmtResult Res;
173   SourceLocation GNUAttributeLoc;
174 
175   // Cases in this switch statement should fall through if the parser expects
176   // the token to end in a semicolon (in which case SemiError should be set),
177   // or they directly 'return;' if not.
178 Retry:
179   tok::TokenKind Kind  = Tok.getKind();
180   SourceLocation AtLoc;
181   switch (Kind) {
182   case tok::at: // May be a @try or @throw statement
183     {
184       AtLoc = ConsumeToken();  // consume @
185       return ParseObjCAtStatement(AtLoc, StmtCtx);
186     }
187 
188   case tok::code_completion:
189     cutOffParsing();
190     Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Statement);
191     return StmtError();
192 
193   case tok::identifier:
194   ParseIdentifier: {
195     Token Next = NextToken();
196     if (Next.is(tok::colon)) { // C99 6.8.1: labeled-statement
197       // Both C++11 and GNU attributes preceding the label appertain to the
198       // label, so put them in a single list to pass on to
199       // ParseLabeledStatement().
200       ParsedAttributes Attrs(AttrFactory);
201       takeAndConcatenateAttrs(CXX11Attrs, GNUAttrs, Attrs);
202 
203       // identifier ':' statement
204       return ParseLabeledStatement(Attrs, StmtCtx);
205     }
206 
207     // Look up the identifier, and typo-correct it to a keyword if it's not
208     // found.
209     if (Next.isNot(tok::coloncolon)) {
210       // Try to limit which sets of keywords should be included in typo
211       // correction based on what the next token is.
212       StatementFilterCCC CCC(Next);
213       if (TryAnnotateName(&CCC) == ANK_Error) {
214         // Handle errors here by skipping up to the next semicolon or '}', and
215         // eat the semicolon if that's what stopped us.
216         SkipUntil(tok::r_brace, StopAtSemi | StopBeforeMatch);
217         if (Tok.is(tok::semi))
218           ConsumeToken();
219         return StmtError();
220       }
221 
222       // If the identifier was typo-corrected, try again.
223       if (Tok.isNot(tok::identifier))
224         goto Retry;
225     }
226 
227     // Fall through
228     [[fallthrough]];
229   }
230 
231   default: {
232     bool HaveAttrs = !CXX11Attrs.empty() || !GNUAttrs.empty();
233     auto IsStmtAttr = [](ParsedAttr &Attr) { return Attr.isStmtAttr(); };
234     bool AllAttrsAreStmtAttrs = llvm::all_of(CXX11Attrs, IsStmtAttr) &&
235                                 llvm::all_of(GNUAttrs, IsStmtAttr);
236     if ((getLangOpts().CPlusPlus || getLangOpts().MicrosoftExt ||
237          (StmtCtx & ParsedStmtContext::AllowDeclarationsInC) !=
238              ParsedStmtContext()) &&
239         ((GNUAttributeLoc.isValid() && !(HaveAttrs && AllAttrsAreStmtAttrs)) ||
240          isDeclarationStatement())) {
241       SourceLocation DeclStart = Tok.getLocation(), DeclEnd;
242       DeclGroupPtrTy Decl;
243       if (GNUAttributeLoc.isValid()) {
244         DeclStart = GNUAttributeLoc;
245         Decl = ParseDeclaration(DeclaratorContext::Block, DeclEnd, CXX11Attrs,
246                                 GNUAttrs, &GNUAttributeLoc);
247       } else {
248         Decl = ParseDeclaration(DeclaratorContext::Block, DeclEnd, CXX11Attrs,
249                                 GNUAttrs);
250       }
251       if (CXX11Attrs.Range.getBegin().isValid()) {
252         // The caller must guarantee that the CXX11Attrs appear before the
253         // GNUAttrs, and we rely on that here.
254         assert(GNUAttrs.Range.getBegin().isInvalid() ||
255                GNUAttrs.Range.getBegin() > CXX11Attrs.Range.getBegin());
256         DeclStart = CXX11Attrs.Range.getBegin();
257       } else if (GNUAttrs.Range.getBegin().isValid())
258         DeclStart = GNUAttrs.Range.getBegin();
259       return Actions.ActOnDeclStmt(Decl, DeclStart, DeclEnd);
260     }
261 
262     if (Tok.is(tok::r_brace)) {
263       Diag(Tok, diag::err_expected_statement);
264       return StmtError();
265     }
266 
267     switch (Tok.getKind()) {
268 #define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait:
269 #include "clang/Basic/TransformTypeTraits.def"
270       if (NextToken().is(tok::less)) {
271         Tok.setKind(tok::identifier);
272         Diag(Tok, diag::ext_keyword_as_ident)
273             << Tok.getIdentifierInfo()->getName() << 0;
274         goto ParseIdentifier;
275       }
276       [[fallthrough]];
277     default:
278       return ParseExprStatement(StmtCtx);
279     }
280   }
281 
282   case tok::kw___attribute: {
283     GNUAttributeLoc = Tok.getLocation();
284     ParseGNUAttributes(GNUAttrs);
285     goto Retry;
286   }
287 
288   case tok::kw_case:                // C99 6.8.1: labeled-statement
289     return ParseCaseStatement(StmtCtx);
290   case tok::kw_default:             // C99 6.8.1: labeled-statement
291     return ParseDefaultStatement(StmtCtx);
292 
293   case tok::l_brace:                // C99 6.8.2: compound-statement
294     return ParseCompoundStatement();
295   case tok::semi: {                 // C99 6.8.3p3: expression[opt] ';'
296     bool HasLeadingEmptyMacro = Tok.hasLeadingEmptyMacro();
297     return Actions.ActOnNullStmt(ConsumeToken(), HasLeadingEmptyMacro);
298   }
299 
300   case tok::kw_if:                  // C99 6.8.4.1: if-statement
301     return ParseIfStatement(TrailingElseLoc);
302   case tok::kw_switch:              // C99 6.8.4.2: switch-statement
303     return ParseSwitchStatement(TrailingElseLoc);
304 
305   case tok::kw_while:               // C99 6.8.5.1: while-statement
306     return ParseWhileStatement(TrailingElseLoc);
307   case tok::kw_do:                  // C99 6.8.5.2: do-statement
308     Res = ParseDoStatement();
309     SemiError = "do/while";
310     break;
311   case tok::kw_for:                 // C99 6.8.5.3: for-statement
312     return ParseForStatement(TrailingElseLoc);
313 
314   case tok::kw_goto:                // C99 6.8.6.1: goto-statement
315     Res = ParseGotoStatement();
316     SemiError = "goto";
317     break;
318   case tok::kw_continue:            // C99 6.8.6.2: continue-statement
319     Res = ParseContinueStatement();
320     SemiError = "continue";
321     break;
322   case tok::kw_break:               // C99 6.8.6.3: break-statement
323     Res = ParseBreakStatement();
324     SemiError = "break";
325     break;
326   case tok::kw_return:              // C99 6.8.6.4: return-statement
327     Res = ParseReturnStatement();
328     SemiError = "return";
329     break;
330   case tok::kw_co_return:            // C++ Coroutines: co_return statement
331     Res = ParseReturnStatement();
332     SemiError = "co_return";
333     break;
334 
335   case tok::kw_asm: {
336     for (const ParsedAttr &AL : CXX11Attrs)
337       Diag(AL.getRange().getBegin(), diag::warn_attribute_ignored) << AL;
338     // Prevent these from being interpreted as statement attributes later on.
339     CXX11Attrs.clear();
340     ProhibitAttributes(GNUAttrs);
341     bool msAsm = false;
342     Res = ParseAsmStatement(msAsm);
343     if (msAsm) return Res;
344     SemiError = "asm";
345     break;
346   }
347 
348   case tok::kw___if_exists:
349   case tok::kw___if_not_exists:
350     ProhibitAttributes(CXX11Attrs);
351     ProhibitAttributes(GNUAttrs);
352     ParseMicrosoftIfExistsStatement(Stmts);
353     // An __if_exists block is like a compound statement, but it doesn't create
354     // a new scope.
355     return StmtEmpty();
356 
357   case tok::kw_try:                 // C++ 15: try-block
358     return ParseCXXTryBlock();
359 
360   case tok::kw___try:
361     ProhibitAttributes(CXX11Attrs);
362     ProhibitAttributes(GNUAttrs);
363     return ParseSEHTryBlock();
364 
365   case tok::kw___leave:
366     Res = ParseSEHLeaveStatement();
367     SemiError = "__leave";
368     break;
369 
370   case tok::annot_pragma_vis:
371     ProhibitAttributes(CXX11Attrs);
372     ProhibitAttributes(GNUAttrs);
373     HandlePragmaVisibility();
374     return StmtEmpty();
375 
376   case tok::annot_pragma_pack:
377     ProhibitAttributes(CXX11Attrs);
378     ProhibitAttributes(GNUAttrs);
379     HandlePragmaPack();
380     return StmtEmpty();
381 
382   case tok::annot_pragma_msstruct:
383     ProhibitAttributes(CXX11Attrs);
384     ProhibitAttributes(GNUAttrs);
385     HandlePragmaMSStruct();
386     return StmtEmpty();
387 
388   case tok::annot_pragma_align:
389     ProhibitAttributes(CXX11Attrs);
390     ProhibitAttributes(GNUAttrs);
391     HandlePragmaAlign();
392     return StmtEmpty();
393 
394   case tok::annot_pragma_weak:
395     ProhibitAttributes(CXX11Attrs);
396     ProhibitAttributes(GNUAttrs);
397     HandlePragmaWeak();
398     return StmtEmpty();
399 
400   case tok::annot_pragma_weakalias:
401     ProhibitAttributes(CXX11Attrs);
402     ProhibitAttributes(GNUAttrs);
403     HandlePragmaWeakAlias();
404     return StmtEmpty();
405 
406   case tok::annot_pragma_redefine_extname:
407     ProhibitAttributes(CXX11Attrs);
408     ProhibitAttributes(GNUAttrs);
409     HandlePragmaRedefineExtname();
410     return StmtEmpty();
411 
412   case tok::annot_pragma_fp_contract:
413     ProhibitAttributes(CXX11Attrs);
414     ProhibitAttributes(GNUAttrs);
415     Diag(Tok, diag::err_pragma_file_or_compound_scope) << "fp_contract";
416     ConsumeAnnotationToken();
417     return StmtError();
418 
419   case tok::annot_pragma_fp:
420     ProhibitAttributes(CXX11Attrs);
421     ProhibitAttributes(GNUAttrs);
422     Diag(Tok, diag::err_pragma_file_or_compound_scope) << "clang fp";
423     ConsumeAnnotationToken();
424     return StmtError();
425 
426   case tok::annot_pragma_fenv_access:
427   case tok::annot_pragma_fenv_access_ms:
428     ProhibitAttributes(CXX11Attrs);
429     ProhibitAttributes(GNUAttrs);
430     Diag(Tok, diag::err_pragma_file_or_compound_scope)
431         << (Kind == tok::annot_pragma_fenv_access ? "STDC FENV_ACCESS"
432                                                     : "fenv_access");
433     ConsumeAnnotationToken();
434     return StmtEmpty();
435 
436   case tok::annot_pragma_fenv_round:
437     ProhibitAttributes(CXX11Attrs);
438     ProhibitAttributes(GNUAttrs);
439     Diag(Tok, diag::err_pragma_file_or_compound_scope) << "STDC FENV_ROUND";
440     ConsumeAnnotationToken();
441     return StmtError();
442 
443   case tok::annot_pragma_float_control:
444     ProhibitAttributes(CXX11Attrs);
445     ProhibitAttributes(GNUAttrs);
446     Diag(Tok, diag::err_pragma_file_or_compound_scope) << "float_control";
447     ConsumeAnnotationToken();
448     return StmtError();
449 
450   case tok::annot_pragma_opencl_extension:
451     ProhibitAttributes(CXX11Attrs);
452     ProhibitAttributes(GNUAttrs);
453     HandlePragmaOpenCLExtension();
454     return StmtEmpty();
455 
456   case tok::annot_pragma_captured:
457     ProhibitAttributes(CXX11Attrs);
458     ProhibitAttributes(GNUAttrs);
459     return HandlePragmaCaptured();
460 
461   case tok::annot_pragma_openmp:
462     // Prohibit attributes that are not OpenMP attributes, but only before
463     // processing a #pragma omp clause.
464     ProhibitAttributes(CXX11Attrs);
465     ProhibitAttributes(GNUAttrs);
466     [[fallthrough]];
467   case tok::annot_attr_openmp:
468     // Do not prohibit attributes if they were OpenMP attributes.
469     return ParseOpenMPDeclarativeOrExecutableDirective(StmtCtx);
470 
471   case tok::annot_pragma_ms_pointers_to_members:
472     ProhibitAttributes(CXX11Attrs);
473     ProhibitAttributes(GNUAttrs);
474     HandlePragmaMSPointersToMembers();
475     return StmtEmpty();
476 
477   case tok::annot_pragma_ms_pragma:
478     ProhibitAttributes(CXX11Attrs);
479     ProhibitAttributes(GNUAttrs);
480     HandlePragmaMSPragma();
481     return StmtEmpty();
482 
483   case tok::annot_pragma_ms_vtordisp:
484     ProhibitAttributes(CXX11Attrs);
485     ProhibitAttributes(GNUAttrs);
486     HandlePragmaMSVtorDisp();
487     return StmtEmpty();
488 
489   case tok::annot_pragma_loop_hint:
490     ProhibitAttributes(CXX11Attrs);
491     ProhibitAttributes(GNUAttrs);
492     return ParsePragmaLoopHint(Stmts, StmtCtx, TrailingElseLoc, CXX11Attrs);
493 
494   case tok::annot_pragma_dump:
495     HandlePragmaDump();
496     return StmtEmpty();
497 
498   case tok::annot_pragma_attribute:
499     HandlePragmaAttribute();
500     return StmtEmpty();
501   }
502 
503   // If we reached this code, the statement must end in a semicolon.
504   if (!TryConsumeToken(tok::semi) && !Res.isInvalid()) {
505     // If the result was valid, then we do want to diagnose this.  Use
506     // ExpectAndConsume to emit the diagnostic, even though we know it won't
507     // succeed.
508     ExpectAndConsume(tok::semi, diag::err_expected_semi_after_stmt, SemiError);
509     // Skip until we see a } or ;, but don't eat it.
510     SkipUntil(tok::r_brace, StopAtSemi | StopBeforeMatch);
511   }
512 
513   return Res;
514 }
515 
516 /// Parse an expression statement.
517 StmtResult Parser::ParseExprStatement(ParsedStmtContext StmtCtx) {
518   // If a case keyword is missing, this is where it should be inserted.
519   Token OldToken = Tok;
520 
521   ExprStatementTokLoc = Tok.getLocation();
522 
523   // expression[opt] ';'
524   ExprResult Expr(ParseExpression());
525   if (Expr.isInvalid()) {
526     // If the expression is invalid, skip ahead to the next semicolon or '}'.
527     // Not doing this opens us up to the possibility of infinite loops if
528     // ParseExpression does not consume any tokens.
529     SkipUntil(tok::r_brace, StopAtSemi | StopBeforeMatch);
530     if (Tok.is(tok::semi))
531       ConsumeToken();
532     return Actions.ActOnExprStmtError();
533   }
534 
535   if (Tok.is(tok::colon) && getCurScope()->isSwitchScope() &&
536       Actions.CheckCaseExpression(Expr.get())) {
537     // If a constant expression is followed by a colon inside a switch block,
538     // suggest a missing case keyword.
539     Diag(OldToken, diag::err_expected_case_before_expression)
540       << FixItHint::CreateInsertion(OldToken.getLocation(), "case ");
541 
542     // Recover parsing as a case statement.
543     return ParseCaseStatement(StmtCtx, /*MissingCase=*/true, Expr);
544   }
545 
546   // Otherwise, eat the semicolon.
547   ExpectAndConsumeSemi(diag::err_expected_semi_after_expr);
548   return handleExprStmt(Expr, StmtCtx);
549 }
550 
551 /// ParseSEHTryBlockCommon
552 ///
553 /// seh-try-block:
554 ///   '__try' compound-statement seh-handler
555 ///
556 /// seh-handler:
557 ///   seh-except-block
558 ///   seh-finally-block
559 ///
560 StmtResult Parser::ParseSEHTryBlock() {
561   assert(Tok.is(tok::kw___try) && "Expected '__try'");
562   SourceLocation TryLoc = ConsumeToken();
563 
564   if (Tok.isNot(tok::l_brace))
565     return StmtError(Diag(Tok, diag::err_expected) << tok::l_brace);
566 
567   StmtResult TryBlock(ParseCompoundStatement(
568       /*isStmtExpr=*/false,
569       Scope::DeclScope | Scope::CompoundStmtScope | Scope::SEHTryScope));
570   if (TryBlock.isInvalid())
571     return TryBlock;
572 
573   StmtResult Handler;
574   if (Tok.is(tok::identifier) &&
575       Tok.getIdentifierInfo() == getSEHExceptKeyword()) {
576     SourceLocation Loc = ConsumeToken();
577     Handler = ParseSEHExceptBlock(Loc);
578   } else if (Tok.is(tok::kw___finally)) {
579     SourceLocation Loc = ConsumeToken();
580     Handler = ParseSEHFinallyBlock(Loc);
581   } else {
582     return StmtError(Diag(Tok, diag::err_seh_expected_handler));
583   }
584 
585   if(Handler.isInvalid())
586     return Handler;
587 
588   return Actions.ActOnSEHTryBlock(false /* IsCXXTry */,
589                                   TryLoc,
590                                   TryBlock.get(),
591                                   Handler.get());
592 }
593 
594 /// ParseSEHExceptBlock - Handle __except
595 ///
596 /// seh-except-block:
597 ///   '__except' '(' seh-filter-expression ')' compound-statement
598 ///
599 StmtResult Parser::ParseSEHExceptBlock(SourceLocation ExceptLoc) {
600   PoisonIdentifierRAIIObject raii(Ident__exception_code, false),
601     raii2(Ident___exception_code, false),
602     raii3(Ident_GetExceptionCode, false);
603 
604   if (ExpectAndConsume(tok::l_paren))
605     return StmtError();
606 
607   ParseScope ExpectScope(this, Scope::DeclScope | Scope::ControlScope |
608                                    Scope::SEHExceptScope);
609 
610   if (getLangOpts().Borland) {
611     Ident__exception_info->setIsPoisoned(false);
612     Ident___exception_info->setIsPoisoned(false);
613     Ident_GetExceptionInfo->setIsPoisoned(false);
614   }
615 
616   ExprResult FilterExpr;
617   {
618     ParseScopeFlags FilterScope(this, getCurScope()->getFlags() |
619                                           Scope::SEHFilterScope);
620     FilterExpr = Actions.CorrectDelayedTyposInExpr(ParseExpression());
621   }
622 
623   if (getLangOpts().Borland) {
624     Ident__exception_info->setIsPoisoned(true);
625     Ident___exception_info->setIsPoisoned(true);
626     Ident_GetExceptionInfo->setIsPoisoned(true);
627   }
628 
629   if(FilterExpr.isInvalid())
630     return StmtError();
631 
632   if (ExpectAndConsume(tok::r_paren))
633     return StmtError();
634 
635   if (Tok.isNot(tok::l_brace))
636     return StmtError(Diag(Tok, diag::err_expected) << tok::l_brace);
637 
638   StmtResult Block(ParseCompoundStatement());
639 
640   if(Block.isInvalid())
641     return Block;
642 
643   return Actions.ActOnSEHExceptBlock(ExceptLoc, FilterExpr.get(), Block.get());
644 }
645 
646 /// ParseSEHFinallyBlock - Handle __finally
647 ///
648 /// seh-finally-block:
649 ///   '__finally' compound-statement
650 ///
651 StmtResult Parser::ParseSEHFinallyBlock(SourceLocation FinallyLoc) {
652   PoisonIdentifierRAIIObject raii(Ident__abnormal_termination, false),
653     raii2(Ident___abnormal_termination, false),
654     raii3(Ident_AbnormalTermination, false);
655 
656   if (Tok.isNot(tok::l_brace))
657     return StmtError(Diag(Tok, diag::err_expected) << tok::l_brace);
658 
659   ParseScope FinallyScope(this, 0);
660   Actions.ActOnStartSEHFinallyBlock();
661 
662   StmtResult Block(ParseCompoundStatement());
663   if(Block.isInvalid()) {
664     Actions.ActOnAbortSEHFinallyBlock();
665     return Block;
666   }
667 
668   return Actions.ActOnFinishSEHFinallyBlock(FinallyLoc, Block.get());
669 }
670 
671 /// Handle __leave
672 ///
673 /// seh-leave-statement:
674 ///   '__leave' ';'
675 ///
676 StmtResult Parser::ParseSEHLeaveStatement() {
677   SourceLocation LeaveLoc = ConsumeToken();  // eat the '__leave'.
678   return Actions.ActOnSEHLeaveStmt(LeaveLoc, getCurScope());
679 }
680 
681 /// ParseLabeledStatement - We have an identifier and a ':' after it.
682 ///
683 ///       label:
684 ///         identifier ':'
685 /// [GNU]   identifier ':' attributes[opt]
686 ///
687 ///       labeled-statement:
688 ///         label statement
689 ///
690 StmtResult Parser::ParseLabeledStatement(ParsedAttributes &Attrs,
691                                          ParsedStmtContext StmtCtx) {
692   assert(Tok.is(tok::identifier) && Tok.getIdentifierInfo() &&
693          "Not an identifier!");
694 
695   // The substatement is always a 'statement', not a 'declaration', but is
696   // otherwise in the same context as the labeled-statement.
697   StmtCtx &= ~ParsedStmtContext::AllowDeclarationsInC;
698 
699   Token IdentTok = Tok;  // Save the whole token.
700   ConsumeToken();  // eat the identifier.
701 
702   assert(Tok.is(tok::colon) && "Not a label!");
703 
704   // identifier ':' statement
705   SourceLocation ColonLoc = ConsumeToken();
706 
707   // Read label attributes, if present.
708   StmtResult SubStmt;
709   if (Tok.is(tok::kw___attribute)) {
710     ParsedAttributes TempAttrs(AttrFactory);
711     ParseGNUAttributes(TempAttrs);
712 
713     // In C++, GNU attributes only apply to the label if they are followed by a
714     // semicolon, to disambiguate label attributes from attributes on a labeled
715     // declaration.
716     //
717     // This doesn't quite match what GCC does; if the attribute list is empty
718     // and followed by a semicolon, GCC will reject (it appears to parse the
719     // attributes as part of a statement in that case). That looks like a bug.
720     if (!getLangOpts().CPlusPlus || Tok.is(tok::semi))
721       Attrs.takeAllFrom(TempAttrs);
722     else {
723       StmtVector Stmts;
724       ParsedAttributes EmptyCXX11Attrs(AttrFactory);
725       SubStmt = ParseStatementOrDeclarationAfterAttributes(
726           Stmts, StmtCtx, nullptr, EmptyCXX11Attrs, TempAttrs);
727       if (!TempAttrs.empty() && !SubStmt.isInvalid())
728         SubStmt = Actions.ActOnAttributedStmt(TempAttrs, SubStmt.get());
729     }
730   }
731 
732   // The label may have no statement following it
733   if (SubStmt.isUnset() && Tok.is(tok::r_brace)) {
734     DiagnoseLabelAtEndOfCompoundStatement();
735     SubStmt = Actions.ActOnNullStmt(ColonLoc);
736   }
737 
738   // If we've not parsed a statement yet, parse one now.
739   if (!SubStmt.isInvalid() && !SubStmt.isUsable())
740     SubStmt = ParseStatement(nullptr, StmtCtx);
741 
742   // Broken substmt shouldn't prevent the label from being added to the AST.
743   if (SubStmt.isInvalid())
744     SubStmt = Actions.ActOnNullStmt(ColonLoc);
745 
746   LabelDecl *LD = Actions.LookupOrCreateLabel(IdentTok.getIdentifierInfo(),
747                                               IdentTok.getLocation());
748   Actions.ProcessDeclAttributeList(Actions.CurScope, LD, Attrs);
749   Attrs.clear();
750 
751   return Actions.ActOnLabelStmt(IdentTok.getLocation(), LD, ColonLoc,
752                                 SubStmt.get());
753 }
754 
755 /// ParseCaseStatement
756 ///       labeled-statement:
757 ///         'case' constant-expression ':' statement
758 /// [GNU]   'case' constant-expression '...' constant-expression ':' statement
759 ///
760 StmtResult Parser::ParseCaseStatement(ParsedStmtContext StmtCtx,
761                                       bool MissingCase, ExprResult Expr) {
762   assert((MissingCase || Tok.is(tok::kw_case)) && "Not a case stmt!");
763 
764   // The substatement is always a 'statement', not a 'declaration', but is
765   // otherwise in the same context as the labeled-statement.
766   StmtCtx &= ~ParsedStmtContext::AllowDeclarationsInC;
767 
768   // It is very common for code to contain many case statements recursively
769   // nested, as in (but usually without indentation):
770   //  case 1:
771   //    case 2:
772   //      case 3:
773   //         case 4:
774   //           case 5: etc.
775   //
776   // Parsing this naively works, but is both inefficient and can cause us to run
777   // out of stack space in our recursive descent parser.  As a special case,
778   // flatten this recursion into an iterative loop.  This is complex and gross,
779   // but all the grossness is constrained to ParseCaseStatement (and some
780   // weirdness in the actions), so this is just local grossness :).
781 
782   // TopLevelCase - This is the highest level we have parsed.  'case 1' in the
783   // example above.
784   StmtResult TopLevelCase(true);
785 
786   // DeepestParsedCaseStmt - This is the deepest statement we have parsed, which
787   // gets updated each time a new case is parsed, and whose body is unset so
788   // far.  When parsing 'case 4', this is the 'case 3' node.
789   Stmt *DeepestParsedCaseStmt = nullptr;
790 
791   // While we have case statements, eat and stack them.
792   SourceLocation ColonLoc;
793   do {
794     SourceLocation CaseLoc = MissingCase ? Expr.get()->getExprLoc() :
795                                            ConsumeToken();  // eat the 'case'.
796     ColonLoc = SourceLocation();
797 
798     if (Tok.is(tok::code_completion)) {
799       cutOffParsing();
800       Actions.CodeCompleteCase(getCurScope());
801       return StmtError();
802     }
803 
804     /// We don't want to treat 'case x : y' as a potential typo for 'case x::y'.
805     /// Disable this form of error recovery while we're parsing the case
806     /// expression.
807     ColonProtectionRAIIObject ColonProtection(*this);
808 
809     ExprResult LHS;
810     if (!MissingCase) {
811       LHS = ParseCaseExpression(CaseLoc);
812       if (LHS.isInvalid()) {
813         // If constant-expression is parsed unsuccessfully, recover by skipping
814         // current case statement (moving to the colon that ends it).
815         if (!SkipUntil(tok::colon, tok::r_brace, StopAtSemi | StopBeforeMatch))
816           return StmtError();
817       }
818     } else {
819       LHS = Expr;
820       MissingCase = false;
821     }
822 
823     // GNU case range extension.
824     SourceLocation DotDotDotLoc;
825     ExprResult RHS;
826     if (TryConsumeToken(tok::ellipsis, DotDotDotLoc)) {
827       Diag(DotDotDotLoc, diag::ext_gnu_case_range);
828       RHS = ParseCaseExpression(CaseLoc);
829       if (RHS.isInvalid()) {
830         if (!SkipUntil(tok::colon, tok::r_brace, StopAtSemi | StopBeforeMatch))
831           return StmtError();
832       }
833     }
834 
835     ColonProtection.restore();
836 
837     if (TryConsumeToken(tok::colon, ColonLoc)) {
838     } else if (TryConsumeToken(tok::semi, ColonLoc) ||
839                TryConsumeToken(tok::coloncolon, ColonLoc)) {
840       // Treat "case blah;" or "case blah::" as a typo for "case blah:".
841       Diag(ColonLoc, diag::err_expected_after)
842           << "'case'" << tok::colon
843           << FixItHint::CreateReplacement(ColonLoc, ":");
844     } else {
845       SourceLocation ExpectedLoc = PP.getLocForEndOfToken(PrevTokLocation);
846       Diag(ExpectedLoc, diag::err_expected_after)
847           << "'case'" << tok::colon
848           << FixItHint::CreateInsertion(ExpectedLoc, ":");
849       ColonLoc = ExpectedLoc;
850     }
851 
852     StmtResult Case =
853         Actions.ActOnCaseStmt(CaseLoc, LHS, DotDotDotLoc, RHS, ColonLoc);
854 
855     // If we had a sema error parsing this case, then just ignore it and
856     // continue parsing the sub-stmt.
857     if (Case.isInvalid()) {
858       if (TopLevelCase.isInvalid())  // No parsed case stmts.
859         return ParseStatement(/*TrailingElseLoc=*/nullptr, StmtCtx);
860       // Otherwise, just don't add it as a nested case.
861     } else {
862       // If this is the first case statement we parsed, it becomes TopLevelCase.
863       // Otherwise we link it into the current chain.
864       Stmt *NextDeepest = Case.get();
865       if (TopLevelCase.isInvalid())
866         TopLevelCase = Case;
867       else
868         Actions.ActOnCaseStmtBody(DeepestParsedCaseStmt, Case.get());
869       DeepestParsedCaseStmt = NextDeepest;
870     }
871 
872     // Handle all case statements.
873   } while (Tok.is(tok::kw_case));
874 
875   // If we found a non-case statement, start by parsing it.
876   StmtResult SubStmt;
877 
878   if (Tok.is(tok::r_brace)) {
879     // "switch (X) { case 4: }", is valid and is treated as if label was
880     // followed by a null statement.
881     DiagnoseLabelAtEndOfCompoundStatement();
882     SubStmt = Actions.ActOnNullStmt(ColonLoc);
883   } else {
884     SubStmt = ParseStatement(/*TrailingElseLoc=*/nullptr, StmtCtx);
885   }
886 
887   // Install the body into the most deeply-nested case.
888   if (DeepestParsedCaseStmt) {
889     // Broken sub-stmt shouldn't prevent forming the case statement properly.
890     if (SubStmt.isInvalid())
891       SubStmt = Actions.ActOnNullStmt(SourceLocation());
892     Actions.ActOnCaseStmtBody(DeepestParsedCaseStmt, SubStmt.get());
893   }
894 
895   // Return the top level parsed statement tree.
896   return TopLevelCase;
897 }
898 
899 /// ParseDefaultStatement
900 ///       labeled-statement:
901 ///         'default' ':' statement
902 /// Note that this does not parse the 'statement' at the end.
903 ///
904 StmtResult Parser::ParseDefaultStatement(ParsedStmtContext StmtCtx) {
905   assert(Tok.is(tok::kw_default) && "Not a default stmt!");
906 
907   // The substatement is always a 'statement', not a 'declaration', but is
908   // otherwise in the same context as the labeled-statement.
909   StmtCtx &= ~ParsedStmtContext::AllowDeclarationsInC;
910 
911   SourceLocation DefaultLoc = ConsumeToken();  // eat the 'default'.
912 
913   SourceLocation ColonLoc;
914   if (TryConsumeToken(tok::colon, ColonLoc)) {
915   } else if (TryConsumeToken(tok::semi, ColonLoc)) {
916     // Treat "default;" as a typo for "default:".
917     Diag(ColonLoc, diag::err_expected_after)
918         << "'default'" << tok::colon
919         << FixItHint::CreateReplacement(ColonLoc, ":");
920   } else {
921     SourceLocation ExpectedLoc = PP.getLocForEndOfToken(PrevTokLocation);
922     Diag(ExpectedLoc, diag::err_expected_after)
923         << "'default'" << tok::colon
924         << FixItHint::CreateInsertion(ExpectedLoc, ":");
925     ColonLoc = ExpectedLoc;
926   }
927 
928   StmtResult SubStmt;
929 
930   if (Tok.is(tok::r_brace)) {
931     // "switch (X) {... default: }", is valid and is treated as if label was
932     // followed by a null statement.
933     DiagnoseLabelAtEndOfCompoundStatement();
934     SubStmt = Actions.ActOnNullStmt(ColonLoc);
935   } else {
936     SubStmt = ParseStatement(/*TrailingElseLoc=*/nullptr, StmtCtx);
937   }
938 
939   // Broken sub-stmt shouldn't prevent forming the case statement properly.
940   if (SubStmt.isInvalid())
941     SubStmt = Actions.ActOnNullStmt(ColonLoc);
942 
943   return Actions.ActOnDefaultStmt(DefaultLoc, ColonLoc,
944                                   SubStmt.get(), getCurScope());
945 }
946 
947 StmtResult Parser::ParseCompoundStatement(bool isStmtExpr) {
948   return ParseCompoundStatement(isStmtExpr,
949                                 Scope::DeclScope | Scope::CompoundStmtScope);
950 }
951 
952 /// ParseCompoundStatement - Parse a "{}" block.
953 ///
954 ///       compound-statement: [C99 6.8.2]
955 ///         { block-item-list[opt] }
956 /// [GNU]   { label-declarations block-item-list } [TODO]
957 ///
958 ///       block-item-list:
959 ///         block-item
960 ///         block-item-list block-item
961 ///
962 ///       block-item:
963 ///         declaration
964 /// [GNU]   '__extension__' declaration
965 ///         statement
966 ///
967 /// [GNU] label-declarations:
968 /// [GNU]   label-declaration
969 /// [GNU]   label-declarations label-declaration
970 ///
971 /// [GNU] label-declaration:
972 /// [GNU]   '__label__' identifier-list ';'
973 ///
974 StmtResult Parser::ParseCompoundStatement(bool isStmtExpr,
975                                           unsigned ScopeFlags) {
976   assert(Tok.is(tok::l_brace) && "Not a compound stmt!");
977 
978   // Enter a scope to hold everything within the compound stmt.  Compound
979   // statements can always hold declarations.
980   ParseScope CompoundScope(this, ScopeFlags);
981 
982   // Parse the statements in the body.
983   return ParseCompoundStatementBody(isStmtExpr);
984 }
985 
986 /// Parse any pragmas at the start of the compound expression. We handle these
987 /// separately since some pragmas (FP_CONTRACT) must appear before any C
988 /// statement in the compound, but may be intermingled with other pragmas.
989 void Parser::ParseCompoundStatementLeadingPragmas() {
990   bool checkForPragmas = true;
991   while (checkForPragmas) {
992     switch (Tok.getKind()) {
993     case tok::annot_pragma_vis:
994       HandlePragmaVisibility();
995       break;
996     case tok::annot_pragma_pack:
997       HandlePragmaPack();
998       break;
999     case tok::annot_pragma_msstruct:
1000       HandlePragmaMSStruct();
1001       break;
1002     case tok::annot_pragma_align:
1003       HandlePragmaAlign();
1004       break;
1005     case tok::annot_pragma_weak:
1006       HandlePragmaWeak();
1007       break;
1008     case tok::annot_pragma_weakalias:
1009       HandlePragmaWeakAlias();
1010       break;
1011     case tok::annot_pragma_redefine_extname:
1012       HandlePragmaRedefineExtname();
1013       break;
1014     case tok::annot_pragma_opencl_extension:
1015       HandlePragmaOpenCLExtension();
1016       break;
1017     case tok::annot_pragma_fp_contract:
1018       HandlePragmaFPContract();
1019       break;
1020     case tok::annot_pragma_fp:
1021       HandlePragmaFP();
1022       break;
1023     case tok::annot_pragma_fenv_access:
1024     case tok::annot_pragma_fenv_access_ms:
1025       HandlePragmaFEnvAccess();
1026       break;
1027     case tok::annot_pragma_fenv_round:
1028       HandlePragmaFEnvRound();
1029       break;
1030     case tok::annot_pragma_float_control:
1031       HandlePragmaFloatControl();
1032       break;
1033     case tok::annot_pragma_ms_pointers_to_members:
1034       HandlePragmaMSPointersToMembers();
1035       break;
1036     case tok::annot_pragma_ms_pragma:
1037       HandlePragmaMSPragma();
1038       break;
1039     case tok::annot_pragma_ms_vtordisp:
1040       HandlePragmaMSVtorDisp();
1041       break;
1042     case tok::annot_pragma_dump:
1043       HandlePragmaDump();
1044       break;
1045     default:
1046       checkForPragmas = false;
1047       break;
1048     }
1049   }
1050 
1051 }
1052 
1053 void Parser::DiagnoseLabelAtEndOfCompoundStatement() {
1054   if (getLangOpts().CPlusPlus) {
1055     Diag(Tok, getLangOpts().CPlusPlus2b
1056                   ? diag::warn_cxx20_compat_label_end_of_compound_statement
1057                   : diag::ext_cxx_label_end_of_compound_statement);
1058   } else {
1059     Diag(Tok, getLangOpts().C2x
1060                   ? diag::warn_c2x_compat_label_end_of_compound_statement
1061                   : diag::ext_c_label_end_of_compound_statement);
1062   }
1063 }
1064 
1065 /// Consume any extra semi-colons resulting in null statements,
1066 /// returning true if any tok::semi were consumed.
1067 bool Parser::ConsumeNullStmt(StmtVector &Stmts) {
1068   if (!Tok.is(tok::semi))
1069     return false;
1070 
1071   SourceLocation StartLoc = Tok.getLocation();
1072   SourceLocation EndLoc;
1073 
1074   while (Tok.is(tok::semi) && !Tok.hasLeadingEmptyMacro() &&
1075          Tok.getLocation().isValid() && !Tok.getLocation().isMacroID()) {
1076     EndLoc = Tok.getLocation();
1077 
1078     // Don't just ConsumeToken() this tok::semi, do store it in AST.
1079     StmtResult R =
1080         ParseStatementOrDeclaration(Stmts, ParsedStmtContext::SubStmt);
1081     if (R.isUsable())
1082       Stmts.push_back(R.get());
1083   }
1084 
1085   // Did not consume any extra semi.
1086   if (EndLoc.isInvalid())
1087     return false;
1088 
1089   Diag(StartLoc, diag::warn_null_statement)
1090       << FixItHint::CreateRemoval(SourceRange(StartLoc, EndLoc));
1091   return true;
1092 }
1093 
1094 StmtResult Parser::handleExprStmt(ExprResult E, ParsedStmtContext StmtCtx) {
1095   bool IsStmtExprResult = false;
1096   if ((StmtCtx & ParsedStmtContext::InStmtExpr) != ParsedStmtContext()) {
1097     // For GCC compatibility we skip past NullStmts.
1098     unsigned LookAhead = 0;
1099     while (GetLookAheadToken(LookAhead).is(tok::semi)) {
1100       ++LookAhead;
1101     }
1102     // Then look to see if the next two tokens close the statement expression;
1103     // if so, this expression statement is the last statement in a statment
1104     // expression.
1105     IsStmtExprResult = GetLookAheadToken(LookAhead).is(tok::r_brace) &&
1106                        GetLookAheadToken(LookAhead + 1).is(tok::r_paren);
1107   }
1108 
1109   if (IsStmtExprResult)
1110     E = Actions.ActOnStmtExprResult(E);
1111   return Actions.ActOnExprStmt(E, /*DiscardedValue=*/!IsStmtExprResult);
1112 }
1113 
1114 /// ParseCompoundStatementBody - Parse a sequence of statements optionally
1115 /// followed by a label and invoke the ActOnCompoundStmt action.  This expects
1116 /// the '{' to be the current token, and consume the '}' at the end of the
1117 /// block.  It does not manipulate the scope stack.
1118 StmtResult Parser::ParseCompoundStatementBody(bool isStmtExpr) {
1119   PrettyStackTraceLoc CrashInfo(PP.getSourceManager(),
1120                                 Tok.getLocation(),
1121                                 "in compound statement ('{}')");
1122 
1123   // Record the current FPFeatures, restore on leaving the
1124   // compound statement.
1125   Sema::FPFeaturesStateRAII SaveFPFeatures(Actions);
1126 
1127   InMessageExpressionRAIIObject InMessage(*this, false);
1128   BalancedDelimiterTracker T(*this, tok::l_brace);
1129   if (T.consumeOpen())
1130     return StmtError();
1131 
1132   Sema::CompoundScopeRAII CompoundScope(Actions, isStmtExpr);
1133 
1134   // Parse any pragmas at the beginning of the compound statement.
1135   ParseCompoundStatementLeadingPragmas();
1136   Actions.ActOnAfterCompoundStatementLeadingPragmas();
1137 
1138   StmtVector Stmts;
1139 
1140   // "__label__ X, Y, Z;" is the GNU "Local Label" extension.  These are
1141   // only allowed at the start of a compound stmt regardless of the language.
1142   while (Tok.is(tok::kw___label__)) {
1143     SourceLocation LabelLoc = ConsumeToken();
1144 
1145     SmallVector<Decl *, 8> DeclsInGroup;
1146     while (true) {
1147       if (Tok.isNot(tok::identifier)) {
1148         Diag(Tok, diag::err_expected) << tok::identifier;
1149         break;
1150       }
1151 
1152       IdentifierInfo *II = Tok.getIdentifierInfo();
1153       SourceLocation IdLoc = ConsumeToken();
1154       DeclsInGroup.push_back(Actions.LookupOrCreateLabel(II, IdLoc, LabelLoc));
1155 
1156       if (!TryConsumeToken(tok::comma))
1157         break;
1158     }
1159 
1160     DeclSpec DS(AttrFactory);
1161     DeclGroupPtrTy Res =
1162         Actions.FinalizeDeclaratorGroup(getCurScope(), DS, DeclsInGroup);
1163     StmtResult R = Actions.ActOnDeclStmt(Res, LabelLoc, Tok.getLocation());
1164 
1165     ExpectAndConsumeSemi(diag::err_expected_semi_declaration);
1166     if (R.isUsable())
1167       Stmts.push_back(R.get());
1168   }
1169 
1170   ParsedStmtContext SubStmtCtx =
1171       ParsedStmtContext::Compound |
1172       (isStmtExpr ? ParsedStmtContext::InStmtExpr : ParsedStmtContext());
1173 
1174   while (!tryParseMisplacedModuleImport() && Tok.isNot(tok::r_brace) &&
1175          Tok.isNot(tok::eof)) {
1176     if (Tok.is(tok::annot_pragma_unused)) {
1177       HandlePragmaUnused();
1178       continue;
1179     }
1180 
1181     if (ConsumeNullStmt(Stmts))
1182       continue;
1183 
1184     StmtResult R;
1185     if (Tok.isNot(tok::kw___extension__)) {
1186       R = ParseStatementOrDeclaration(Stmts, SubStmtCtx);
1187     } else {
1188       // __extension__ can start declarations and it can also be a unary
1189       // operator for expressions.  Consume multiple __extension__ markers here
1190       // until we can determine which is which.
1191       // FIXME: This loses extension expressions in the AST!
1192       SourceLocation ExtLoc = ConsumeToken();
1193       while (Tok.is(tok::kw___extension__))
1194         ConsumeToken();
1195 
1196       ParsedAttributes attrs(AttrFactory);
1197       MaybeParseCXX11Attributes(attrs, /*MightBeObjCMessageSend*/ true);
1198 
1199       // If this is the start of a declaration, parse it as such.
1200       if (isDeclarationStatement()) {
1201         // __extension__ silences extension warnings in the subdeclaration.
1202         // FIXME: Save the __extension__ on the decl as a node somehow?
1203         ExtensionRAIIObject O(Diags);
1204 
1205         SourceLocation DeclStart = Tok.getLocation(), DeclEnd;
1206         ParsedAttributes DeclSpecAttrs(AttrFactory);
1207         DeclGroupPtrTy Res = ParseDeclaration(DeclaratorContext::Block, DeclEnd,
1208                                               attrs, DeclSpecAttrs);
1209         R = Actions.ActOnDeclStmt(Res, DeclStart, DeclEnd);
1210       } else {
1211         // Otherwise this was a unary __extension__ marker.
1212         ExprResult Res(ParseExpressionWithLeadingExtension(ExtLoc));
1213 
1214         if (Res.isInvalid()) {
1215           SkipUntil(tok::semi);
1216           continue;
1217         }
1218 
1219         // Eat the semicolon at the end of stmt and convert the expr into a
1220         // statement.
1221         ExpectAndConsumeSemi(diag::err_expected_semi_after_expr);
1222         R = handleExprStmt(Res, SubStmtCtx);
1223         if (R.isUsable())
1224           R = Actions.ActOnAttributedStmt(attrs, R.get());
1225       }
1226     }
1227 
1228     if (R.isUsable())
1229       Stmts.push_back(R.get());
1230   }
1231   // Warn the user that using option `-ffp-eval-method=source` on a
1232   // 32-bit target and feature `sse` disabled, or using
1233   // `pragma clang fp eval_method=source` and feature `sse` disabled, is not
1234   // supported.
1235   if (!PP.getTargetInfo().supportSourceEvalMethod() &&
1236       (PP.getLastFPEvalPragmaLocation().isValid() ||
1237        PP.getCurrentFPEvalMethod() ==
1238            LangOptions::FPEvalMethodKind::FEM_Source))
1239     Diag(Tok.getLocation(),
1240          diag::warn_no_support_for_eval_method_source_on_m32);
1241 
1242   SourceLocation CloseLoc = Tok.getLocation();
1243 
1244   // We broke out of the while loop because we found a '}' or EOF.
1245   if (!T.consumeClose()) {
1246     // If this is the '})' of a statement expression, check that it's written
1247     // in a sensible way.
1248     if (isStmtExpr && Tok.is(tok::r_paren))
1249       checkCompoundToken(CloseLoc, tok::r_brace, CompoundToken::StmtExprEnd);
1250   } else {
1251     // Recover by creating a compound statement with what we parsed so far,
1252     // instead of dropping everything and returning StmtError().
1253   }
1254 
1255   if (T.getCloseLocation().isValid())
1256     CloseLoc = T.getCloseLocation();
1257 
1258   return Actions.ActOnCompoundStmt(T.getOpenLocation(), CloseLoc,
1259                                    Stmts, isStmtExpr);
1260 }
1261 
1262 /// ParseParenExprOrCondition:
1263 /// [C  ]     '(' expression ')'
1264 /// [C++]     '(' condition ')'
1265 /// [C++1z]   '(' init-statement[opt] condition ')'
1266 ///
1267 /// This function parses and performs error recovery on the specified condition
1268 /// or expression (depending on whether we're in C++ or C mode).  This function
1269 /// goes out of its way to recover well.  It returns true if there was a parser
1270 /// error (the right paren couldn't be found), which indicates that the caller
1271 /// should try to recover harder.  It returns false if the condition is
1272 /// successfully parsed.  Note that a successful parse can still have semantic
1273 /// errors in the condition.
1274 /// Additionally, it will assign the location of the outer-most '(' and ')',
1275 /// to LParenLoc and RParenLoc, respectively.
1276 bool Parser::ParseParenExprOrCondition(StmtResult *InitStmt,
1277                                        Sema::ConditionResult &Cond,
1278                                        SourceLocation Loc,
1279                                        Sema::ConditionKind CK,
1280                                        SourceLocation &LParenLoc,
1281                                        SourceLocation &RParenLoc) {
1282   BalancedDelimiterTracker T(*this, tok::l_paren);
1283   T.consumeOpen();
1284   SourceLocation Start = Tok.getLocation();
1285 
1286   if (getLangOpts().CPlusPlus) {
1287     Cond = ParseCXXCondition(InitStmt, Loc, CK, false);
1288   } else {
1289     ExprResult CondExpr = ParseExpression();
1290 
1291     // If required, convert to a boolean value.
1292     if (CondExpr.isInvalid())
1293       Cond = Sema::ConditionError();
1294     else
1295       Cond = Actions.ActOnCondition(getCurScope(), Loc, CondExpr.get(), CK,
1296                                     /*MissingOK=*/false);
1297   }
1298 
1299   // If the parser was confused by the condition and we don't have a ')', try to
1300   // recover by skipping ahead to a semi and bailing out.  If condexp is
1301   // semantically invalid but we have well formed code, keep going.
1302   if (Cond.isInvalid() && Tok.isNot(tok::r_paren)) {
1303     SkipUntil(tok::semi);
1304     // Skipping may have stopped if it found the containing ')'.  If so, we can
1305     // continue parsing the if statement.
1306     if (Tok.isNot(tok::r_paren))
1307       return true;
1308   }
1309 
1310   if (Cond.isInvalid()) {
1311     ExprResult CondExpr = Actions.CreateRecoveryExpr(
1312         Start, Tok.getLocation() == Start ? Start : PrevTokLocation, {},
1313         Actions.PreferredConditionType(CK));
1314     if (!CondExpr.isInvalid())
1315       Cond = Actions.ActOnCondition(getCurScope(), Loc, CondExpr.get(), CK,
1316                                     /*MissingOK=*/false);
1317   }
1318 
1319   // Either the condition is valid or the rparen is present.
1320   T.consumeClose();
1321   LParenLoc = T.getOpenLocation();
1322   RParenLoc = T.getCloseLocation();
1323 
1324   // Check for extraneous ')'s to catch things like "if (foo())) {".  We know
1325   // that all callers are looking for a statement after the condition, so ")"
1326   // isn't valid.
1327   while (Tok.is(tok::r_paren)) {
1328     Diag(Tok, diag::err_extraneous_rparen_in_condition)
1329       << FixItHint::CreateRemoval(Tok.getLocation());
1330     ConsumeParen();
1331   }
1332 
1333   return false;
1334 }
1335 
1336 namespace {
1337 
1338 enum MisleadingStatementKind { MSK_if, MSK_else, MSK_for, MSK_while };
1339 
1340 struct MisleadingIndentationChecker {
1341   Parser &P;
1342   SourceLocation StmtLoc;
1343   SourceLocation PrevLoc;
1344   unsigned NumDirectives;
1345   MisleadingStatementKind Kind;
1346   bool ShouldSkip;
1347   MisleadingIndentationChecker(Parser &P, MisleadingStatementKind K,
1348                                SourceLocation SL)
1349       : P(P), StmtLoc(SL), PrevLoc(P.getCurToken().getLocation()),
1350         NumDirectives(P.getPreprocessor().getNumDirectives()), Kind(K),
1351         ShouldSkip(P.getCurToken().is(tok::l_brace)) {
1352     if (!P.MisleadingIndentationElseLoc.isInvalid()) {
1353       StmtLoc = P.MisleadingIndentationElseLoc;
1354       P.MisleadingIndentationElseLoc = SourceLocation();
1355     }
1356     if (Kind == MSK_else && !ShouldSkip)
1357       P.MisleadingIndentationElseLoc = SL;
1358   }
1359 
1360   /// Compute the column number will aligning tabs on TabStop (-ftabstop), this
1361   /// gives the visual indentation of the SourceLocation.
1362   static unsigned getVisualIndentation(SourceManager &SM, SourceLocation Loc) {
1363     unsigned TabStop = SM.getDiagnostics().getDiagnosticOptions().TabStop;
1364 
1365     unsigned ColNo = SM.getSpellingColumnNumber(Loc);
1366     if (ColNo == 0 || TabStop == 1)
1367       return ColNo;
1368 
1369     std::pair<FileID, unsigned> FIDAndOffset = SM.getDecomposedLoc(Loc);
1370 
1371     bool Invalid;
1372     StringRef BufData = SM.getBufferData(FIDAndOffset.first, &Invalid);
1373     if (Invalid)
1374       return 0;
1375 
1376     const char *EndPos = BufData.data() + FIDAndOffset.second;
1377     // FileOffset are 0-based and Column numbers are 1-based
1378     assert(FIDAndOffset.second + 1 >= ColNo &&
1379            "Column number smaller than file offset?");
1380 
1381     unsigned VisualColumn = 0; // Stored as 0-based column, here.
1382     // Loop from beginning of line up to Loc's file position, counting columns,
1383     // expanding tabs.
1384     for (const char *CurPos = EndPos - (ColNo - 1); CurPos != EndPos;
1385          ++CurPos) {
1386       if (*CurPos == '\t')
1387         // Advance visual column to next tabstop.
1388         VisualColumn += (TabStop - VisualColumn % TabStop);
1389       else
1390         VisualColumn++;
1391     }
1392     return VisualColumn + 1;
1393   }
1394 
1395   void Check() {
1396     Token Tok = P.getCurToken();
1397     if (P.getActions().getDiagnostics().isIgnored(
1398             diag::warn_misleading_indentation, Tok.getLocation()) ||
1399         ShouldSkip || NumDirectives != P.getPreprocessor().getNumDirectives() ||
1400         Tok.isOneOf(tok::semi, tok::r_brace) || Tok.isAnnotation() ||
1401         Tok.getLocation().isMacroID() || PrevLoc.isMacroID() ||
1402         StmtLoc.isMacroID() ||
1403         (Kind == MSK_else && P.MisleadingIndentationElseLoc.isInvalid())) {
1404       P.MisleadingIndentationElseLoc = SourceLocation();
1405       return;
1406     }
1407     if (Kind == MSK_else)
1408       P.MisleadingIndentationElseLoc = SourceLocation();
1409 
1410     SourceManager &SM = P.getPreprocessor().getSourceManager();
1411     unsigned PrevColNum = getVisualIndentation(SM, PrevLoc);
1412     unsigned CurColNum = getVisualIndentation(SM, Tok.getLocation());
1413     unsigned StmtColNum = getVisualIndentation(SM, StmtLoc);
1414 
1415     if (PrevColNum != 0 && CurColNum != 0 && StmtColNum != 0 &&
1416         ((PrevColNum > StmtColNum && PrevColNum == CurColNum) ||
1417          !Tok.isAtStartOfLine()) &&
1418         SM.getPresumedLineNumber(StmtLoc) !=
1419             SM.getPresumedLineNumber(Tok.getLocation()) &&
1420         (Tok.isNot(tok::identifier) ||
1421          P.getPreprocessor().LookAhead(0).isNot(tok::colon))) {
1422       P.Diag(Tok.getLocation(), diag::warn_misleading_indentation) << Kind;
1423       P.Diag(StmtLoc, diag::note_previous_statement);
1424     }
1425   }
1426 };
1427 
1428 }
1429 
1430 /// ParseIfStatement
1431 ///       if-statement: [C99 6.8.4.1]
1432 ///         'if' '(' expression ')' statement
1433 ///         'if' '(' expression ')' statement 'else' statement
1434 /// [C++]   'if' '(' condition ')' statement
1435 /// [C++]   'if' '(' condition ')' statement 'else' statement
1436 /// [C++23] 'if' '!' [opt] consteval compound-statement
1437 /// [C++23] 'if' '!' [opt] consteval compound-statement 'else' statement
1438 ///
1439 StmtResult Parser::ParseIfStatement(SourceLocation *TrailingElseLoc) {
1440   assert(Tok.is(tok::kw_if) && "Not an if stmt!");
1441   SourceLocation IfLoc = ConsumeToken();  // eat the 'if'.
1442 
1443   bool IsConstexpr = false;
1444   bool IsConsteval = false;
1445   SourceLocation NotLocation;
1446   SourceLocation ConstevalLoc;
1447 
1448   if (Tok.is(tok::kw_constexpr)) {
1449     Diag(Tok, getLangOpts().CPlusPlus17 ? diag::warn_cxx14_compat_constexpr_if
1450                                         : diag::ext_constexpr_if);
1451     IsConstexpr = true;
1452     ConsumeToken();
1453   } else {
1454     if (Tok.is(tok::exclaim)) {
1455       NotLocation = ConsumeToken();
1456     }
1457 
1458     if (Tok.is(tok::kw_consteval)) {
1459       Diag(Tok, getLangOpts().CPlusPlus2b ? diag::warn_cxx20_compat_consteval_if
1460                                           : diag::ext_consteval_if);
1461       IsConsteval = true;
1462       ConstevalLoc = ConsumeToken();
1463     }
1464   }
1465   if (!IsConsteval && (NotLocation.isValid() || Tok.isNot(tok::l_paren))) {
1466     Diag(Tok, diag::err_expected_lparen_after) << "if";
1467     SkipUntil(tok::semi);
1468     return StmtError();
1469   }
1470 
1471   bool C99orCXX = getLangOpts().C99 || getLangOpts().CPlusPlus;
1472 
1473   // C99 6.8.4p3 - In C99, the if statement is a block.  This is not
1474   // the case for C90.
1475   //
1476   // C++ 6.4p3:
1477   // A name introduced by a declaration in a condition is in scope from its
1478   // point of declaration until the end of the substatements controlled by the
1479   // condition.
1480   // C++ 3.3.2p4:
1481   // Names declared in the for-init-statement, and in the condition of if,
1482   // while, for, and switch statements are local to the if, while, for, or
1483   // switch statement (including the controlled statement).
1484   //
1485   ParseScope IfScope(this, Scope::DeclScope | Scope::ControlScope, C99orCXX);
1486 
1487   // Parse the condition.
1488   StmtResult InitStmt;
1489   Sema::ConditionResult Cond;
1490   SourceLocation LParen;
1491   SourceLocation RParen;
1492   std::optional<bool> ConstexprCondition;
1493   if (!IsConsteval) {
1494 
1495     if (ParseParenExprOrCondition(&InitStmt, Cond, IfLoc,
1496                                   IsConstexpr ? Sema::ConditionKind::ConstexprIf
1497                                               : Sema::ConditionKind::Boolean,
1498                                   LParen, RParen))
1499       return StmtError();
1500 
1501     if (IsConstexpr)
1502       ConstexprCondition = Cond.getKnownValue();
1503   }
1504 
1505   bool IsBracedThen = Tok.is(tok::l_brace);
1506 
1507   // C99 6.8.4p3 - In C99, the body of the if statement is a scope, even if
1508   // there is no compound stmt.  C90 does not have this clause.  We only do this
1509   // if the body isn't a compound statement to avoid push/pop in common cases.
1510   //
1511   // C++ 6.4p1:
1512   // The substatement in a selection-statement (each substatement, in the else
1513   // form of the if statement) implicitly defines a local scope.
1514   //
1515   // For C++ we create a scope for the condition and a new scope for
1516   // substatements because:
1517   // -When the 'then' scope exits, we want the condition declaration to still be
1518   //    active for the 'else' scope too.
1519   // -Sema will detect name clashes by considering declarations of a
1520   //    'ControlScope' as part of its direct subscope.
1521   // -If we wanted the condition and substatement to be in the same scope, we
1522   //    would have to notify ParseStatement not to create a new scope. It's
1523   //    simpler to let it create a new scope.
1524   //
1525   ParseScope InnerScope(this, Scope::DeclScope, C99orCXX, IsBracedThen);
1526 
1527   MisleadingIndentationChecker MIChecker(*this, MSK_if, IfLoc);
1528 
1529   // Read the 'then' stmt.
1530   SourceLocation ThenStmtLoc = Tok.getLocation();
1531 
1532   SourceLocation InnerStatementTrailingElseLoc;
1533   StmtResult ThenStmt;
1534   {
1535     bool ShouldEnter = ConstexprCondition && !*ConstexprCondition;
1536     Sema::ExpressionEvaluationContext Context =
1537         Sema::ExpressionEvaluationContext::DiscardedStatement;
1538     if (NotLocation.isInvalid() && IsConsteval) {
1539       Context = Sema::ExpressionEvaluationContext::ImmediateFunctionContext;
1540       ShouldEnter = true;
1541     }
1542 
1543     EnterExpressionEvaluationContext PotentiallyDiscarded(
1544         Actions, Context, nullptr,
1545         Sema::ExpressionEvaluationContextRecord::EK_Other, ShouldEnter);
1546     ThenStmt = ParseStatement(&InnerStatementTrailingElseLoc);
1547   }
1548 
1549   if (Tok.isNot(tok::kw_else))
1550     MIChecker.Check();
1551 
1552   // Pop the 'if' scope if needed.
1553   InnerScope.Exit();
1554 
1555   // If it has an else, parse it.
1556   SourceLocation ElseLoc;
1557   SourceLocation ElseStmtLoc;
1558   StmtResult ElseStmt;
1559 
1560   if (Tok.is(tok::kw_else)) {
1561     if (TrailingElseLoc)
1562       *TrailingElseLoc = Tok.getLocation();
1563 
1564     ElseLoc = ConsumeToken();
1565     ElseStmtLoc = Tok.getLocation();
1566 
1567     // C99 6.8.4p3 - In C99, the body of the if statement is a scope, even if
1568     // there is no compound stmt.  C90 does not have this clause.  We only do
1569     // this if the body isn't a compound statement to avoid push/pop in common
1570     // cases.
1571     //
1572     // C++ 6.4p1:
1573     // The substatement in a selection-statement (each substatement, in the else
1574     // form of the if statement) implicitly defines a local scope.
1575     //
1576     ParseScope InnerScope(this, Scope::DeclScope, C99orCXX,
1577                           Tok.is(tok::l_brace));
1578 
1579     MisleadingIndentationChecker MIChecker(*this, MSK_else, ElseLoc);
1580     bool ShouldEnter = ConstexprCondition && *ConstexprCondition;
1581     Sema::ExpressionEvaluationContext Context =
1582         Sema::ExpressionEvaluationContext::DiscardedStatement;
1583     if (NotLocation.isValid() && IsConsteval) {
1584       Context = Sema::ExpressionEvaluationContext::ImmediateFunctionContext;
1585       ShouldEnter = true;
1586     }
1587 
1588     EnterExpressionEvaluationContext PotentiallyDiscarded(
1589         Actions, Context, nullptr,
1590         Sema::ExpressionEvaluationContextRecord::EK_Other, ShouldEnter);
1591     ElseStmt = ParseStatement();
1592 
1593     if (ElseStmt.isUsable())
1594       MIChecker.Check();
1595 
1596     // Pop the 'else' scope if needed.
1597     InnerScope.Exit();
1598   } else if (Tok.is(tok::code_completion)) {
1599     cutOffParsing();
1600     Actions.CodeCompleteAfterIf(getCurScope(), IsBracedThen);
1601     return StmtError();
1602   } else if (InnerStatementTrailingElseLoc.isValid()) {
1603     Diag(InnerStatementTrailingElseLoc, diag::warn_dangling_else);
1604   }
1605 
1606   IfScope.Exit();
1607 
1608   // If the then or else stmt is invalid and the other is valid (and present),
1609   // make turn the invalid one into a null stmt to avoid dropping the other
1610   // part.  If both are invalid, return error.
1611   if ((ThenStmt.isInvalid() && ElseStmt.isInvalid()) ||
1612       (ThenStmt.isInvalid() && ElseStmt.get() == nullptr) ||
1613       (ThenStmt.get() == nullptr && ElseStmt.isInvalid())) {
1614     // Both invalid, or one is invalid and other is non-present: return error.
1615     return StmtError();
1616   }
1617 
1618   if (IsConsteval) {
1619     auto IsCompoundStatement = [](const Stmt *S) {
1620       if (const auto *Outer = dyn_cast_or_null<AttributedStmt>(S))
1621         S = Outer->getSubStmt();
1622       return isa_and_nonnull<clang::CompoundStmt>(S);
1623     };
1624 
1625     if (!IsCompoundStatement(ThenStmt.get())) {
1626       Diag(ConstevalLoc, diag::err_expected_after) << "consteval"
1627                                                    << "{";
1628       return StmtError();
1629     }
1630     if (!ElseStmt.isUnset() && !IsCompoundStatement(ElseStmt.get())) {
1631       Diag(ElseLoc, diag::err_expected_after) << "else"
1632                                               << "{";
1633       return StmtError();
1634     }
1635   }
1636 
1637   // Now if either are invalid, replace with a ';'.
1638   if (ThenStmt.isInvalid())
1639     ThenStmt = Actions.ActOnNullStmt(ThenStmtLoc);
1640   if (ElseStmt.isInvalid())
1641     ElseStmt = Actions.ActOnNullStmt(ElseStmtLoc);
1642 
1643   IfStatementKind Kind = IfStatementKind::Ordinary;
1644   if (IsConstexpr)
1645     Kind = IfStatementKind::Constexpr;
1646   else if (IsConsteval)
1647     Kind = NotLocation.isValid() ? IfStatementKind::ConstevalNegated
1648                                  : IfStatementKind::ConstevalNonNegated;
1649 
1650   return Actions.ActOnIfStmt(IfLoc, Kind, LParen, InitStmt.get(), Cond, RParen,
1651                              ThenStmt.get(), ElseLoc, ElseStmt.get());
1652 }
1653 
1654 /// ParseSwitchStatement
1655 ///       switch-statement:
1656 ///         'switch' '(' expression ')' statement
1657 /// [C++]   'switch' '(' condition ')' statement
1658 StmtResult Parser::ParseSwitchStatement(SourceLocation *TrailingElseLoc) {
1659   assert(Tok.is(tok::kw_switch) && "Not a switch stmt!");
1660   SourceLocation SwitchLoc = ConsumeToken();  // eat the 'switch'.
1661 
1662   if (Tok.isNot(tok::l_paren)) {
1663     Diag(Tok, diag::err_expected_lparen_after) << "switch";
1664     SkipUntil(tok::semi);
1665     return StmtError();
1666   }
1667 
1668   bool C99orCXX = getLangOpts().C99 || getLangOpts().CPlusPlus;
1669 
1670   // C99 6.8.4p3 - In C99, the switch statement is a block.  This is
1671   // not the case for C90.  Start the switch scope.
1672   //
1673   // C++ 6.4p3:
1674   // A name introduced by a declaration in a condition is in scope from its
1675   // point of declaration until the end of the substatements controlled by the
1676   // condition.
1677   // C++ 3.3.2p4:
1678   // Names declared in the for-init-statement, and in the condition of if,
1679   // while, for, and switch statements are local to the if, while, for, or
1680   // switch statement (including the controlled statement).
1681   //
1682   unsigned ScopeFlags = Scope::SwitchScope;
1683   if (C99orCXX)
1684     ScopeFlags |= Scope::DeclScope | Scope::ControlScope;
1685   ParseScope SwitchScope(this, ScopeFlags);
1686 
1687   // Parse the condition.
1688   StmtResult InitStmt;
1689   Sema::ConditionResult Cond;
1690   SourceLocation LParen;
1691   SourceLocation RParen;
1692   if (ParseParenExprOrCondition(&InitStmt, Cond, SwitchLoc,
1693                                 Sema::ConditionKind::Switch, LParen, RParen))
1694     return StmtError();
1695 
1696   StmtResult Switch = Actions.ActOnStartOfSwitchStmt(
1697       SwitchLoc, LParen, InitStmt.get(), Cond, RParen);
1698 
1699   if (Switch.isInvalid()) {
1700     // Skip the switch body.
1701     // FIXME: This is not optimal recovery, but parsing the body is more
1702     // dangerous due to the presence of case and default statements, which
1703     // will have no place to connect back with the switch.
1704     if (Tok.is(tok::l_brace)) {
1705       ConsumeBrace();
1706       SkipUntil(tok::r_brace);
1707     } else
1708       SkipUntil(tok::semi);
1709     return Switch;
1710   }
1711 
1712   // C99 6.8.4p3 - In C99, the body of the switch statement is a scope, even if
1713   // there is no compound stmt.  C90 does not have this clause.  We only do this
1714   // if the body isn't a compound statement to avoid push/pop in common cases.
1715   //
1716   // C++ 6.4p1:
1717   // The substatement in a selection-statement (each substatement, in the else
1718   // form of the if statement) implicitly defines a local scope.
1719   //
1720   // See comments in ParseIfStatement for why we create a scope for the
1721   // condition and a new scope for substatement in C++.
1722   //
1723   getCurScope()->AddFlags(Scope::BreakScope);
1724   ParseScope InnerScope(this, Scope::DeclScope, C99orCXX, Tok.is(tok::l_brace));
1725 
1726   // We have incremented the mangling number for the SwitchScope and the
1727   // InnerScope, which is one too many.
1728   if (C99orCXX)
1729     getCurScope()->decrementMSManglingNumber();
1730 
1731   // Read the body statement.
1732   StmtResult Body(ParseStatement(TrailingElseLoc));
1733 
1734   // Pop the scopes.
1735   InnerScope.Exit();
1736   SwitchScope.Exit();
1737 
1738   return Actions.ActOnFinishSwitchStmt(SwitchLoc, Switch.get(), Body.get());
1739 }
1740 
1741 /// ParseWhileStatement
1742 ///       while-statement: [C99 6.8.5.1]
1743 ///         'while' '(' expression ')' statement
1744 /// [C++]   'while' '(' condition ')' statement
1745 StmtResult Parser::ParseWhileStatement(SourceLocation *TrailingElseLoc) {
1746   assert(Tok.is(tok::kw_while) && "Not a while stmt!");
1747   SourceLocation WhileLoc = Tok.getLocation();
1748   ConsumeToken();  // eat the 'while'.
1749 
1750   if (Tok.isNot(tok::l_paren)) {
1751     Diag(Tok, diag::err_expected_lparen_after) << "while";
1752     SkipUntil(tok::semi);
1753     return StmtError();
1754   }
1755 
1756   bool C99orCXX = getLangOpts().C99 || getLangOpts().CPlusPlus;
1757 
1758   // C99 6.8.5p5 - In C99, the while statement is a block.  This is not
1759   // the case for C90.  Start the loop scope.
1760   //
1761   // C++ 6.4p3:
1762   // A name introduced by a declaration in a condition is in scope from its
1763   // point of declaration until the end of the substatements controlled by the
1764   // condition.
1765   // C++ 3.3.2p4:
1766   // Names declared in the for-init-statement, and in the condition of if,
1767   // while, for, and switch statements are local to the if, while, for, or
1768   // switch statement (including the controlled statement).
1769   //
1770   unsigned ScopeFlags;
1771   if (C99orCXX)
1772     ScopeFlags = Scope::BreakScope | Scope::ContinueScope |
1773                  Scope::DeclScope  | Scope::ControlScope;
1774   else
1775     ScopeFlags = Scope::BreakScope | Scope::ContinueScope;
1776   ParseScope WhileScope(this, ScopeFlags);
1777 
1778   // Parse the condition.
1779   Sema::ConditionResult Cond;
1780   SourceLocation LParen;
1781   SourceLocation RParen;
1782   if (ParseParenExprOrCondition(nullptr, Cond, WhileLoc,
1783                                 Sema::ConditionKind::Boolean, LParen, RParen))
1784     return StmtError();
1785 
1786   // C99 6.8.5p5 - In C99, the body of the while statement is a scope, even if
1787   // there is no compound stmt.  C90 does not have this clause.  We only do this
1788   // if the body isn't a compound statement to avoid push/pop in common cases.
1789   //
1790   // C++ 6.5p2:
1791   // The substatement in an iteration-statement implicitly defines a local scope
1792   // which is entered and exited each time through the loop.
1793   //
1794   // See comments in ParseIfStatement for why we create a scope for the
1795   // condition and a new scope for substatement in C++.
1796   //
1797   ParseScope InnerScope(this, Scope::DeclScope, C99orCXX, Tok.is(tok::l_brace));
1798 
1799   MisleadingIndentationChecker MIChecker(*this, MSK_while, WhileLoc);
1800 
1801   // Read the body statement.
1802   StmtResult Body(ParseStatement(TrailingElseLoc));
1803 
1804   if (Body.isUsable())
1805     MIChecker.Check();
1806   // Pop the body scope if needed.
1807   InnerScope.Exit();
1808   WhileScope.Exit();
1809 
1810   if (Cond.isInvalid() || Body.isInvalid())
1811     return StmtError();
1812 
1813   return Actions.ActOnWhileStmt(WhileLoc, LParen, Cond, RParen, Body.get());
1814 }
1815 
1816 /// ParseDoStatement
1817 ///       do-statement: [C99 6.8.5.2]
1818 ///         'do' statement 'while' '(' expression ')' ';'
1819 /// Note: this lets the caller parse the end ';'.
1820 StmtResult Parser::ParseDoStatement() {
1821   assert(Tok.is(tok::kw_do) && "Not a do stmt!");
1822   SourceLocation DoLoc = ConsumeToken();  // eat the 'do'.
1823 
1824   // C99 6.8.5p5 - In C99, the do statement is a block.  This is not
1825   // the case for C90.  Start the loop scope.
1826   unsigned ScopeFlags;
1827   if (getLangOpts().C99)
1828     ScopeFlags = Scope::BreakScope | Scope::ContinueScope | Scope::DeclScope;
1829   else
1830     ScopeFlags = Scope::BreakScope | Scope::ContinueScope;
1831 
1832   ParseScope DoScope(this, ScopeFlags);
1833 
1834   // C99 6.8.5p5 - In C99, the body of the do statement is a scope, even if
1835   // there is no compound stmt.  C90 does not have this clause. We only do this
1836   // if the body isn't a compound statement to avoid push/pop in common cases.
1837   //
1838   // C++ 6.5p2:
1839   // The substatement in an iteration-statement implicitly defines a local scope
1840   // which is entered and exited each time through the loop.
1841   //
1842   bool C99orCXX = getLangOpts().C99 || getLangOpts().CPlusPlus;
1843   ParseScope InnerScope(this, Scope::DeclScope, C99orCXX, Tok.is(tok::l_brace));
1844 
1845   // Read the body statement.
1846   StmtResult Body(ParseStatement());
1847 
1848   // Pop the body scope if needed.
1849   InnerScope.Exit();
1850 
1851   if (Tok.isNot(tok::kw_while)) {
1852     if (!Body.isInvalid()) {
1853       Diag(Tok, diag::err_expected_while);
1854       Diag(DoLoc, diag::note_matching) << "'do'";
1855       SkipUntil(tok::semi, StopBeforeMatch);
1856     }
1857     return StmtError();
1858   }
1859   SourceLocation WhileLoc = ConsumeToken();
1860 
1861   if (Tok.isNot(tok::l_paren)) {
1862     Diag(Tok, diag::err_expected_lparen_after) << "do/while";
1863     SkipUntil(tok::semi, StopBeforeMatch);
1864     return StmtError();
1865   }
1866 
1867   // Parse the parenthesized expression.
1868   BalancedDelimiterTracker T(*this, tok::l_paren);
1869   T.consumeOpen();
1870 
1871   // A do-while expression is not a condition, so can't have attributes.
1872   DiagnoseAndSkipCXX11Attributes();
1873 
1874   SourceLocation Start = Tok.getLocation();
1875   ExprResult Cond = ParseExpression();
1876   // Correct the typos in condition before closing the scope.
1877   if (Cond.isUsable())
1878     Cond = Actions.CorrectDelayedTyposInExpr(Cond);
1879   else {
1880     if (!Tok.isOneOf(tok::r_paren, tok::r_square, tok::r_brace))
1881       SkipUntil(tok::semi);
1882     Cond = Actions.CreateRecoveryExpr(
1883         Start, Start == Tok.getLocation() ? Start : PrevTokLocation, {},
1884         Actions.getASTContext().BoolTy);
1885   }
1886   T.consumeClose();
1887   DoScope.Exit();
1888 
1889   if (Cond.isInvalid() || Body.isInvalid())
1890     return StmtError();
1891 
1892   return Actions.ActOnDoStmt(DoLoc, Body.get(), WhileLoc, T.getOpenLocation(),
1893                              Cond.get(), T.getCloseLocation());
1894 }
1895 
1896 bool Parser::isForRangeIdentifier() {
1897   assert(Tok.is(tok::identifier));
1898 
1899   const Token &Next = NextToken();
1900   if (Next.is(tok::colon))
1901     return true;
1902 
1903   if (Next.isOneOf(tok::l_square, tok::kw_alignas)) {
1904     TentativeParsingAction PA(*this);
1905     ConsumeToken();
1906     SkipCXX11Attributes();
1907     bool Result = Tok.is(tok::colon);
1908     PA.Revert();
1909     return Result;
1910   }
1911 
1912   return false;
1913 }
1914 
1915 /// ParseForStatement
1916 ///       for-statement: [C99 6.8.5.3]
1917 ///         'for' '(' expr[opt] ';' expr[opt] ';' expr[opt] ')' statement
1918 ///         'for' '(' declaration expr[opt] ';' expr[opt] ')' statement
1919 /// [C++]   'for' '(' for-init-statement condition[opt] ';' expression[opt] ')'
1920 /// [C++]       statement
1921 /// [C++0x] 'for'
1922 ///             'co_await'[opt]    [Coroutines]
1923 ///             '(' for-range-declaration ':' for-range-initializer ')'
1924 ///             statement
1925 /// [OBJC2] 'for' '(' declaration 'in' expr ')' statement
1926 /// [OBJC2] 'for' '(' expr 'in' expr ')' statement
1927 ///
1928 /// [C++] for-init-statement:
1929 /// [C++]   expression-statement
1930 /// [C++]   simple-declaration
1931 /// [C++2b] alias-declaration
1932 ///
1933 /// [C++0x] for-range-declaration:
1934 /// [C++0x]   attribute-specifier-seq[opt] type-specifier-seq declarator
1935 /// [C++0x] for-range-initializer:
1936 /// [C++0x]   expression
1937 /// [C++0x]   braced-init-list            [TODO]
1938 StmtResult Parser::ParseForStatement(SourceLocation *TrailingElseLoc) {
1939   assert(Tok.is(tok::kw_for) && "Not a for stmt!");
1940   SourceLocation ForLoc = ConsumeToken();  // eat the 'for'.
1941 
1942   SourceLocation CoawaitLoc;
1943   if (Tok.is(tok::kw_co_await))
1944     CoawaitLoc = ConsumeToken();
1945 
1946   if (Tok.isNot(tok::l_paren)) {
1947     Diag(Tok, diag::err_expected_lparen_after) << "for";
1948     SkipUntil(tok::semi);
1949     return StmtError();
1950   }
1951 
1952   bool C99orCXXorObjC = getLangOpts().C99 || getLangOpts().CPlusPlus ||
1953     getLangOpts().ObjC;
1954 
1955   // C99 6.8.5p5 - In C99, the for statement is a block.  This is not
1956   // the case for C90.  Start the loop scope.
1957   //
1958   // C++ 6.4p3:
1959   // A name introduced by a declaration in a condition is in scope from its
1960   // point of declaration until the end of the substatements controlled by the
1961   // condition.
1962   // C++ 3.3.2p4:
1963   // Names declared in the for-init-statement, and in the condition of if,
1964   // while, for, and switch statements are local to the if, while, for, or
1965   // switch statement (including the controlled statement).
1966   // C++ 6.5.3p1:
1967   // Names declared in the for-init-statement are in the same declarative-region
1968   // as those declared in the condition.
1969   //
1970   unsigned ScopeFlags = 0;
1971   if (C99orCXXorObjC)
1972     ScopeFlags = Scope::DeclScope | Scope::ControlScope;
1973 
1974   ParseScope ForScope(this, ScopeFlags);
1975 
1976   BalancedDelimiterTracker T(*this, tok::l_paren);
1977   T.consumeOpen();
1978 
1979   ExprResult Value;
1980 
1981   bool ForEach = false;
1982   StmtResult FirstPart;
1983   Sema::ConditionResult SecondPart;
1984   ExprResult Collection;
1985   ForRangeInfo ForRangeInfo;
1986   FullExprArg ThirdPart(Actions);
1987 
1988   if (Tok.is(tok::code_completion)) {
1989     cutOffParsing();
1990     Actions.CodeCompleteOrdinaryName(getCurScope(),
1991                                      C99orCXXorObjC? Sema::PCC_ForInit
1992                                                    : Sema::PCC_Expression);
1993     return StmtError();
1994   }
1995 
1996   ParsedAttributes attrs(AttrFactory);
1997   MaybeParseCXX11Attributes(attrs);
1998 
1999   SourceLocation EmptyInitStmtSemiLoc;
2000 
2001   // Parse the first part of the for specifier.
2002   if (Tok.is(tok::semi)) {  // for (;
2003     ProhibitAttributes(attrs);
2004     // no first part, eat the ';'.
2005     SourceLocation SemiLoc = Tok.getLocation();
2006     if (!Tok.hasLeadingEmptyMacro() && !SemiLoc.isMacroID())
2007       EmptyInitStmtSemiLoc = SemiLoc;
2008     ConsumeToken();
2009   } else if (getLangOpts().CPlusPlus && Tok.is(tok::identifier) &&
2010              isForRangeIdentifier()) {
2011     ProhibitAttributes(attrs);
2012     IdentifierInfo *Name = Tok.getIdentifierInfo();
2013     SourceLocation Loc = ConsumeToken();
2014     MaybeParseCXX11Attributes(attrs);
2015 
2016     ForRangeInfo.ColonLoc = ConsumeToken();
2017     if (Tok.is(tok::l_brace))
2018       ForRangeInfo.RangeExpr = ParseBraceInitializer();
2019     else
2020       ForRangeInfo.RangeExpr = ParseExpression();
2021 
2022     Diag(Loc, diag::err_for_range_identifier)
2023       << ((getLangOpts().CPlusPlus11 && !getLangOpts().CPlusPlus17)
2024               ? FixItHint::CreateInsertion(Loc, "auto &&")
2025               : FixItHint());
2026 
2027     ForRangeInfo.LoopVar =
2028         Actions.ActOnCXXForRangeIdentifier(getCurScope(), Loc, Name, attrs);
2029   } else if (isForInitDeclaration()) {  // for (int X = 4;
2030     ParenBraceBracketBalancer BalancerRAIIObj(*this);
2031 
2032     // Parse declaration, which eats the ';'.
2033     if (!C99orCXXorObjC) {   // Use of C99-style for loops in C90 mode?
2034       Diag(Tok, diag::ext_c99_variable_decl_in_for_loop);
2035       Diag(Tok, diag::warn_gcc_variable_decl_in_for_loop);
2036     }
2037     DeclGroupPtrTy DG;
2038     if (Tok.is(tok::kw_using)) {
2039       DG = ParseAliasDeclarationInInitStatement(DeclaratorContext::ForInit,
2040                                                 attrs);
2041     } else {
2042       // In C++0x, "for (T NS:a" might not be a typo for ::
2043       bool MightBeForRangeStmt = getLangOpts().CPlusPlus;
2044       ColonProtectionRAIIObject ColonProtection(*this, MightBeForRangeStmt);
2045 
2046       SourceLocation DeclStart = Tok.getLocation(), DeclEnd;
2047       ParsedAttributes DeclSpecAttrs(AttrFactory);
2048       DG = ParseSimpleDeclaration(
2049           DeclaratorContext::ForInit, DeclEnd, attrs, DeclSpecAttrs, false,
2050           MightBeForRangeStmt ? &ForRangeInfo : nullptr);
2051       FirstPart = Actions.ActOnDeclStmt(DG, DeclStart, Tok.getLocation());
2052       if (ForRangeInfo.ParsedForRangeDecl()) {
2053         Diag(ForRangeInfo.ColonLoc, getLangOpts().CPlusPlus11
2054                                         ? diag::warn_cxx98_compat_for_range
2055                                         : diag::ext_for_range);
2056         ForRangeInfo.LoopVar = FirstPart;
2057         FirstPart = StmtResult();
2058       } else if (Tok.is(tok::semi)) { // for (int x = 4;
2059         ConsumeToken();
2060       } else if ((ForEach = isTokIdentifier_in())) {
2061         Actions.ActOnForEachDeclStmt(DG);
2062         // ObjC: for (id x in expr)
2063         ConsumeToken(); // consume 'in'
2064 
2065         if (Tok.is(tok::code_completion)) {
2066           cutOffParsing();
2067           Actions.CodeCompleteObjCForCollection(getCurScope(), DG);
2068           return StmtError();
2069         }
2070         Collection = ParseExpression();
2071       } else {
2072         Diag(Tok, diag::err_expected_semi_for);
2073       }
2074     }
2075   } else {
2076     ProhibitAttributes(attrs);
2077     Value = Actions.CorrectDelayedTyposInExpr(ParseExpression());
2078 
2079     ForEach = isTokIdentifier_in();
2080 
2081     // Turn the expression into a stmt.
2082     if (!Value.isInvalid()) {
2083       if (ForEach)
2084         FirstPart = Actions.ActOnForEachLValueExpr(Value.get());
2085       else {
2086         // We already know this is not an init-statement within a for loop, so
2087         // if we are parsing a C++11 range-based for loop, we should treat this
2088         // expression statement as being a discarded value expression because
2089         // we will err below. This way we do not warn on an unused expression
2090         // that was an error in the first place, like with: for (expr : expr);
2091         bool IsRangeBasedFor =
2092             getLangOpts().CPlusPlus11 && !ForEach && Tok.is(tok::colon);
2093         FirstPart = Actions.ActOnExprStmt(Value, !IsRangeBasedFor);
2094       }
2095     }
2096 
2097     if (Tok.is(tok::semi)) {
2098       ConsumeToken();
2099     } else if (ForEach) {
2100       ConsumeToken(); // consume 'in'
2101 
2102       if (Tok.is(tok::code_completion)) {
2103         cutOffParsing();
2104         Actions.CodeCompleteObjCForCollection(getCurScope(), nullptr);
2105         return StmtError();
2106       }
2107       Collection = ParseExpression();
2108     } else if (getLangOpts().CPlusPlus11 && Tok.is(tok::colon) && FirstPart.get()) {
2109       // User tried to write the reasonable, but ill-formed, for-range-statement
2110       //   for (expr : expr) { ... }
2111       Diag(Tok, diag::err_for_range_expected_decl)
2112         << FirstPart.get()->getSourceRange();
2113       SkipUntil(tok::r_paren, StopBeforeMatch);
2114       SecondPart = Sema::ConditionError();
2115     } else {
2116       if (!Value.isInvalid()) {
2117         Diag(Tok, diag::err_expected_semi_for);
2118       } else {
2119         // Skip until semicolon or rparen, don't consume it.
2120         SkipUntil(tok::r_paren, StopAtSemi | StopBeforeMatch);
2121         if (Tok.is(tok::semi))
2122           ConsumeToken();
2123       }
2124     }
2125   }
2126 
2127   // Parse the second part of the for specifier.
2128   if (!ForEach && !ForRangeInfo.ParsedForRangeDecl() &&
2129       !SecondPart.isInvalid()) {
2130     // Parse the second part of the for specifier.
2131     if (Tok.is(tok::semi)) {  // for (...;;
2132       // no second part.
2133     } else if (Tok.is(tok::r_paren)) {
2134       // missing both semicolons.
2135     } else {
2136       if (getLangOpts().CPlusPlus) {
2137         // C++2a: We've parsed an init-statement; we might have a
2138         // for-range-declaration next.
2139         bool MightBeForRangeStmt = !ForRangeInfo.ParsedForRangeDecl();
2140         ColonProtectionRAIIObject ColonProtection(*this, MightBeForRangeStmt);
2141         SecondPart = ParseCXXCondition(
2142             nullptr, ForLoc, Sema::ConditionKind::Boolean,
2143             // FIXME: recovery if we don't see another semi!
2144             /*MissingOK=*/true, MightBeForRangeStmt ? &ForRangeInfo : nullptr,
2145             /*EnterForConditionScope*/ true);
2146 
2147         if (ForRangeInfo.ParsedForRangeDecl()) {
2148           Diag(FirstPart.get() ? FirstPart.get()->getBeginLoc()
2149                                : ForRangeInfo.ColonLoc,
2150                getLangOpts().CPlusPlus20
2151                    ? diag::warn_cxx17_compat_for_range_init_stmt
2152                    : diag::ext_for_range_init_stmt)
2153               << (FirstPart.get() ? FirstPart.get()->getSourceRange()
2154                                   : SourceRange());
2155           if (EmptyInitStmtSemiLoc.isValid()) {
2156             Diag(EmptyInitStmtSemiLoc, diag::warn_empty_init_statement)
2157                 << /*for-loop*/ 2
2158                 << FixItHint::CreateRemoval(EmptyInitStmtSemiLoc);
2159           }
2160         }
2161       } else {
2162         // We permit 'continue' and 'break' in the condition of a for loop.
2163         getCurScope()->AddFlags(Scope::BreakScope | Scope::ContinueScope);
2164 
2165         ExprResult SecondExpr = ParseExpression();
2166         if (SecondExpr.isInvalid())
2167           SecondPart = Sema::ConditionError();
2168         else
2169           SecondPart = Actions.ActOnCondition(
2170               getCurScope(), ForLoc, SecondExpr.get(),
2171               Sema::ConditionKind::Boolean, /*MissingOK=*/true);
2172       }
2173     }
2174   }
2175 
2176   // Enter a break / continue scope, if we didn't already enter one while
2177   // parsing the second part.
2178   if (!getCurScope()->isContinueScope())
2179     getCurScope()->AddFlags(Scope::BreakScope | Scope::ContinueScope);
2180 
2181   // Parse the third part of the for statement.
2182   if (!ForEach && !ForRangeInfo.ParsedForRangeDecl()) {
2183     if (Tok.isNot(tok::semi)) {
2184       if (!SecondPart.isInvalid())
2185         Diag(Tok, diag::err_expected_semi_for);
2186       else
2187         // Skip until semicolon or rparen, don't consume it.
2188         SkipUntil(tok::r_paren, StopAtSemi | StopBeforeMatch);
2189     }
2190 
2191     if (Tok.is(tok::semi)) {
2192       ConsumeToken();
2193     }
2194 
2195     if (Tok.isNot(tok::r_paren)) {   // for (...;...;)
2196       ExprResult Third = ParseExpression();
2197       // FIXME: The C++11 standard doesn't actually say that this is a
2198       // discarded-value expression, but it clearly should be.
2199       ThirdPart = Actions.MakeFullDiscardedValueExpr(Third.get());
2200     }
2201   }
2202   // Match the ')'.
2203   T.consumeClose();
2204 
2205   // C++ Coroutines [stmt.iter]:
2206   //   'co_await' can only be used for a range-based for statement.
2207   if (CoawaitLoc.isValid() && !ForRangeInfo.ParsedForRangeDecl()) {
2208     Diag(CoawaitLoc, diag::err_for_co_await_not_range_for);
2209     CoawaitLoc = SourceLocation();
2210   }
2211 
2212   if (CoawaitLoc.isValid() && getLangOpts().CPlusPlus20)
2213     Diag(CoawaitLoc, diag::warn_deprecated_for_co_await);
2214 
2215   // We need to perform most of the semantic analysis for a C++0x for-range
2216   // statememt before parsing the body, in order to be able to deduce the type
2217   // of an auto-typed loop variable.
2218   StmtResult ForRangeStmt;
2219   StmtResult ForEachStmt;
2220 
2221   if (ForRangeInfo.ParsedForRangeDecl()) {
2222     ExprResult CorrectedRange =
2223         Actions.CorrectDelayedTyposInExpr(ForRangeInfo.RangeExpr.get());
2224     ForRangeStmt = Actions.ActOnCXXForRangeStmt(
2225         getCurScope(), ForLoc, CoawaitLoc, FirstPart.get(),
2226         ForRangeInfo.LoopVar.get(), ForRangeInfo.ColonLoc, CorrectedRange.get(),
2227         T.getCloseLocation(), Sema::BFRK_Build);
2228 
2229   // Similarly, we need to do the semantic analysis for a for-range
2230   // statement immediately in order to close over temporaries correctly.
2231   } else if (ForEach) {
2232     ForEachStmt = Actions.ActOnObjCForCollectionStmt(ForLoc,
2233                                                      FirstPart.get(),
2234                                                      Collection.get(),
2235                                                      T.getCloseLocation());
2236   } else {
2237     // In OpenMP loop region loop control variable must be captured and be
2238     // private. Perform analysis of first part (if any).
2239     if (getLangOpts().OpenMP && FirstPart.isUsable()) {
2240       Actions.ActOnOpenMPLoopInitialization(ForLoc, FirstPart.get());
2241     }
2242   }
2243 
2244   // C99 6.8.5p5 - In C99, the body of the for statement is a scope, even if
2245   // there is no compound stmt.  C90 does not have this clause.  We only do this
2246   // if the body isn't a compound statement to avoid push/pop in common cases.
2247   //
2248   // C++ 6.5p2:
2249   // The substatement in an iteration-statement implicitly defines a local scope
2250   // which is entered and exited each time through the loop.
2251   //
2252   // See comments in ParseIfStatement for why we create a scope for
2253   // for-init-statement/condition and a new scope for substatement in C++.
2254   //
2255   ParseScope InnerScope(this, Scope::DeclScope, C99orCXXorObjC,
2256                         Tok.is(tok::l_brace));
2257 
2258   // The body of the for loop has the same local mangling number as the
2259   // for-init-statement.
2260   // It will only be incremented if the body contains other things that would
2261   // normally increment the mangling number (like a compound statement).
2262   if (C99orCXXorObjC)
2263     getCurScope()->decrementMSManglingNumber();
2264 
2265   MisleadingIndentationChecker MIChecker(*this, MSK_for, ForLoc);
2266 
2267   // Read the body statement.
2268   StmtResult Body(ParseStatement(TrailingElseLoc));
2269 
2270   if (Body.isUsable())
2271     MIChecker.Check();
2272 
2273   // Pop the body scope if needed.
2274   InnerScope.Exit();
2275 
2276   // Leave the for-scope.
2277   ForScope.Exit();
2278 
2279   if (Body.isInvalid())
2280     return StmtError();
2281 
2282   if (ForEach)
2283    return Actions.FinishObjCForCollectionStmt(ForEachStmt.get(),
2284                                               Body.get());
2285 
2286   if (ForRangeInfo.ParsedForRangeDecl())
2287     return Actions.FinishCXXForRangeStmt(ForRangeStmt.get(), Body.get());
2288 
2289   return Actions.ActOnForStmt(ForLoc, T.getOpenLocation(), FirstPart.get(),
2290                               SecondPart, ThirdPart, T.getCloseLocation(),
2291                               Body.get());
2292 }
2293 
2294 /// ParseGotoStatement
2295 ///       jump-statement:
2296 ///         'goto' identifier ';'
2297 /// [GNU]   'goto' '*' expression ';'
2298 ///
2299 /// Note: this lets the caller parse the end ';'.
2300 ///
2301 StmtResult Parser::ParseGotoStatement() {
2302   assert(Tok.is(tok::kw_goto) && "Not a goto stmt!");
2303   SourceLocation GotoLoc = ConsumeToken();  // eat the 'goto'.
2304 
2305   StmtResult Res;
2306   if (Tok.is(tok::identifier)) {
2307     LabelDecl *LD = Actions.LookupOrCreateLabel(Tok.getIdentifierInfo(),
2308                                                 Tok.getLocation());
2309     Res = Actions.ActOnGotoStmt(GotoLoc, Tok.getLocation(), LD);
2310     ConsumeToken();
2311   } else if (Tok.is(tok::star)) {
2312     // GNU indirect goto extension.
2313     Diag(Tok, diag::ext_gnu_indirect_goto);
2314     SourceLocation StarLoc = ConsumeToken();
2315     ExprResult R(ParseExpression());
2316     if (R.isInvalid()) {  // Skip to the semicolon, but don't consume it.
2317       SkipUntil(tok::semi, StopBeforeMatch);
2318       return StmtError();
2319     }
2320     Res = Actions.ActOnIndirectGotoStmt(GotoLoc, StarLoc, R.get());
2321   } else {
2322     Diag(Tok, diag::err_expected) << tok::identifier;
2323     return StmtError();
2324   }
2325 
2326   return Res;
2327 }
2328 
2329 /// ParseContinueStatement
2330 ///       jump-statement:
2331 ///         'continue' ';'
2332 ///
2333 /// Note: this lets the caller parse the end ';'.
2334 ///
2335 StmtResult Parser::ParseContinueStatement() {
2336   SourceLocation ContinueLoc = ConsumeToken();  // eat the 'continue'.
2337   return Actions.ActOnContinueStmt(ContinueLoc, getCurScope());
2338 }
2339 
2340 /// ParseBreakStatement
2341 ///       jump-statement:
2342 ///         'break' ';'
2343 ///
2344 /// Note: this lets the caller parse the end ';'.
2345 ///
2346 StmtResult Parser::ParseBreakStatement() {
2347   SourceLocation BreakLoc = ConsumeToken();  // eat the 'break'.
2348   return Actions.ActOnBreakStmt(BreakLoc, getCurScope());
2349 }
2350 
2351 /// ParseReturnStatement
2352 ///       jump-statement:
2353 ///         'return' expression[opt] ';'
2354 ///         'return' braced-init-list ';'
2355 ///         'co_return' expression[opt] ';'
2356 ///         'co_return' braced-init-list ';'
2357 StmtResult Parser::ParseReturnStatement() {
2358   assert((Tok.is(tok::kw_return) || Tok.is(tok::kw_co_return)) &&
2359          "Not a return stmt!");
2360   bool IsCoreturn = Tok.is(tok::kw_co_return);
2361   SourceLocation ReturnLoc = ConsumeToken();  // eat the 'return'.
2362 
2363   ExprResult R;
2364   if (Tok.isNot(tok::semi)) {
2365     if (!IsCoreturn)
2366       PreferredType.enterReturn(Actions, Tok.getLocation());
2367     // FIXME: Code completion for co_return.
2368     if (Tok.is(tok::code_completion) && !IsCoreturn) {
2369       cutOffParsing();
2370       Actions.CodeCompleteExpression(getCurScope(),
2371                                      PreferredType.get(Tok.getLocation()));
2372       return StmtError();
2373     }
2374 
2375     if (Tok.is(tok::l_brace) && getLangOpts().CPlusPlus) {
2376       R = ParseInitializer();
2377       if (R.isUsable())
2378         Diag(R.get()->getBeginLoc(),
2379              getLangOpts().CPlusPlus11
2380                  ? diag::warn_cxx98_compat_generalized_initializer_lists
2381                  : diag::ext_generalized_initializer_lists)
2382             << R.get()->getSourceRange();
2383     } else
2384       R = ParseExpression();
2385     if (R.isInvalid()) {
2386       SkipUntil(tok::r_brace, StopAtSemi | StopBeforeMatch);
2387       return StmtError();
2388     }
2389   }
2390   if (IsCoreturn)
2391     return Actions.ActOnCoreturnStmt(getCurScope(), ReturnLoc, R.get());
2392   return Actions.ActOnReturnStmt(ReturnLoc, R.get(), getCurScope());
2393 }
2394 
2395 StmtResult Parser::ParsePragmaLoopHint(StmtVector &Stmts,
2396                                        ParsedStmtContext StmtCtx,
2397                                        SourceLocation *TrailingElseLoc,
2398                                        ParsedAttributes &Attrs) {
2399   // Create temporary attribute list.
2400   ParsedAttributes TempAttrs(AttrFactory);
2401 
2402   SourceLocation StartLoc = Tok.getLocation();
2403 
2404   // Get loop hints and consume annotated token.
2405   while (Tok.is(tok::annot_pragma_loop_hint)) {
2406     LoopHint Hint;
2407     if (!HandlePragmaLoopHint(Hint))
2408       continue;
2409 
2410     ArgsUnion ArgHints[] = {Hint.PragmaNameLoc, Hint.OptionLoc, Hint.StateLoc,
2411                             ArgsUnion(Hint.ValueExpr)};
2412     TempAttrs.addNew(Hint.PragmaNameLoc->Ident, Hint.Range, nullptr,
2413                      Hint.PragmaNameLoc->Loc, ArgHints, 4,
2414                      ParsedAttr::AS_Pragma);
2415   }
2416 
2417   // Get the next statement.
2418   MaybeParseCXX11Attributes(Attrs);
2419 
2420   ParsedAttributes EmptyDeclSpecAttrs(AttrFactory);
2421   StmtResult S = ParseStatementOrDeclarationAfterAttributes(
2422       Stmts, StmtCtx, TrailingElseLoc, Attrs, EmptyDeclSpecAttrs);
2423 
2424   Attrs.takeAllFrom(TempAttrs);
2425 
2426   // Start of attribute range may already be set for some invalid input.
2427   // See PR46336.
2428   if (Attrs.Range.getBegin().isInvalid())
2429     Attrs.Range.setBegin(StartLoc);
2430 
2431   return S;
2432 }
2433 
2434 Decl *Parser::ParseFunctionStatementBody(Decl *Decl, ParseScope &BodyScope) {
2435   assert(Tok.is(tok::l_brace));
2436   SourceLocation LBraceLoc = Tok.getLocation();
2437 
2438   PrettyDeclStackTraceEntry CrashInfo(Actions.Context, Decl, LBraceLoc,
2439                                       "parsing function body");
2440 
2441   // Save and reset current vtordisp stack if we have entered a C++ method body.
2442   bool IsCXXMethod =
2443       getLangOpts().CPlusPlus && Decl && isa<CXXMethodDecl>(Decl);
2444   Sema::PragmaStackSentinelRAII
2445     PragmaStackSentinel(Actions, "InternalPragmaState", IsCXXMethod);
2446 
2447   // Do not enter a scope for the brace, as the arguments are in the same scope
2448   // (the function body) as the body itself.  Instead, just read the statement
2449   // list and put it into a CompoundStmt for safe keeping.
2450   StmtResult FnBody(ParseCompoundStatementBody());
2451 
2452   // If the function body could not be parsed, make a bogus compoundstmt.
2453   if (FnBody.isInvalid()) {
2454     Sema::CompoundScopeRAII CompoundScope(Actions);
2455     FnBody =
2456         Actions.ActOnCompoundStmt(LBraceLoc, LBraceLoc, std::nullopt, false);
2457   }
2458 
2459   BodyScope.Exit();
2460   return Actions.ActOnFinishFunctionBody(Decl, FnBody.get());
2461 }
2462 
2463 /// ParseFunctionTryBlock - Parse a C++ function-try-block.
2464 ///
2465 ///       function-try-block:
2466 ///         'try' ctor-initializer[opt] compound-statement handler-seq
2467 ///
2468 Decl *Parser::ParseFunctionTryBlock(Decl *Decl, ParseScope &BodyScope) {
2469   assert(Tok.is(tok::kw_try) && "Expected 'try'");
2470   SourceLocation TryLoc = ConsumeToken();
2471 
2472   PrettyDeclStackTraceEntry CrashInfo(Actions.Context, Decl, TryLoc,
2473                                       "parsing function try block");
2474 
2475   // Constructor initializer list?
2476   if (Tok.is(tok::colon))
2477     ParseConstructorInitializer(Decl);
2478   else
2479     Actions.ActOnDefaultCtorInitializers(Decl);
2480 
2481   // Save and reset current vtordisp stack if we have entered a C++ method body.
2482   bool IsCXXMethod =
2483       getLangOpts().CPlusPlus && Decl && isa<CXXMethodDecl>(Decl);
2484   Sema::PragmaStackSentinelRAII
2485     PragmaStackSentinel(Actions, "InternalPragmaState", IsCXXMethod);
2486 
2487   SourceLocation LBraceLoc = Tok.getLocation();
2488   StmtResult FnBody(ParseCXXTryBlockCommon(TryLoc, /*FnTry*/true));
2489   // If we failed to parse the try-catch, we just give the function an empty
2490   // compound statement as the body.
2491   if (FnBody.isInvalid()) {
2492     Sema::CompoundScopeRAII CompoundScope(Actions);
2493     FnBody =
2494         Actions.ActOnCompoundStmt(LBraceLoc, LBraceLoc, std::nullopt, false);
2495   }
2496 
2497   BodyScope.Exit();
2498   return Actions.ActOnFinishFunctionBody(Decl, FnBody.get());
2499 }
2500 
2501 bool Parser::trySkippingFunctionBody() {
2502   assert(SkipFunctionBodies &&
2503          "Should only be called when SkipFunctionBodies is enabled");
2504   if (!PP.isCodeCompletionEnabled()) {
2505     SkipFunctionBody();
2506     return true;
2507   }
2508 
2509   // We're in code-completion mode. Skip parsing for all function bodies unless
2510   // the body contains the code-completion point.
2511   TentativeParsingAction PA(*this);
2512   bool IsTryCatch = Tok.is(tok::kw_try);
2513   CachedTokens Toks;
2514   bool ErrorInPrologue = ConsumeAndStoreFunctionPrologue(Toks);
2515   if (llvm::any_of(Toks, [](const Token &Tok) {
2516         return Tok.is(tok::code_completion);
2517       })) {
2518     PA.Revert();
2519     return false;
2520   }
2521   if (ErrorInPrologue) {
2522     PA.Commit();
2523     SkipMalformedDecl();
2524     return true;
2525   }
2526   if (!SkipUntil(tok::r_brace, StopAtCodeCompletion)) {
2527     PA.Revert();
2528     return false;
2529   }
2530   while (IsTryCatch && Tok.is(tok::kw_catch)) {
2531     if (!SkipUntil(tok::l_brace, StopAtCodeCompletion) ||
2532         !SkipUntil(tok::r_brace, StopAtCodeCompletion)) {
2533       PA.Revert();
2534       return false;
2535     }
2536   }
2537   PA.Commit();
2538   return true;
2539 }
2540 
2541 /// ParseCXXTryBlock - Parse a C++ try-block.
2542 ///
2543 ///       try-block:
2544 ///         'try' compound-statement handler-seq
2545 ///
2546 StmtResult Parser::ParseCXXTryBlock() {
2547   assert(Tok.is(tok::kw_try) && "Expected 'try'");
2548 
2549   SourceLocation TryLoc = ConsumeToken();
2550   return ParseCXXTryBlockCommon(TryLoc);
2551 }
2552 
2553 /// ParseCXXTryBlockCommon - Parse the common part of try-block and
2554 /// function-try-block.
2555 ///
2556 ///       try-block:
2557 ///         'try' compound-statement handler-seq
2558 ///
2559 ///       function-try-block:
2560 ///         'try' ctor-initializer[opt] compound-statement handler-seq
2561 ///
2562 ///       handler-seq:
2563 ///         handler handler-seq[opt]
2564 ///
2565 ///       [Borland] try-block:
2566 ///         'try' compound-statement seh-except-block
2567 ///         'try' compound-statement seh-finally-block
2568 ///
2569 StmtResult Parser::ParseCXXTryBlockCommon(SourceLocation TryLoc, bool FnTry) {
2570   if (Tok.isNot(tok::l_brace))
2571     return StmtError(Diag(Tok, diag::err_expected) << tok::l_brace);
2572 
2573   StmtResult TryBlock(ParseCompoundStatement(
2574       /*isStmtExpr=*/false, Scope::DeclScope | Scope::TryScope |
2575                                 Scope::CompoundStmtScope |
2576                                 (FnTry ? Scope::FnTryCatchScope : 0)));
2577   if (TryBlock.isInvalid())
2578     return TryBlock;
2579 
2580   // Borland allows SEH-handlers with 'try'
2581 
2582   if ((Tok.is(tok::identifier) &&
2583        Tok.getIdentifierInfo() == getSEHExceptKeyword()) ||
2584       Tok.is(tok::kw___finally)) {
2585     // TODO: Factor into common return ParseSEHHandlerCommon(...)
2586     StmtResult Handler;
2587     if(Tok.getIdentifierInfo() == getSEHExceptKeyword()) {
2588       SourceLocation Loc = ConsumeToken();
2589       Handler = ParseSEHExceptBlock(Loc);
2590     }
2591     else {
2592       SourceLocation Loc = ConsumeToken();
2593       Handler = ParseSEHFinallyBlock(Loc);
2594     }
2595     if(Handler.isInvalid())
2596       return Handler;
2597 
2598     return Actions.ActOnSEHTryBlock(true /* IsCXXTry */,
2599                                     TryLoc,
2600                                     TryBlock.get(),
2601                                     Handler.get());
2602   }
2603   else {
2604     StmtVector Handlers;
2605 
2606     // C++11 attributes can't appear here, despite this context seeming
2607     // statement-like.
2608     DiagnoseAndSkipCXX11Attributes();
2609 
2610     if (Tok.isNot(tok::kw_catch))
2611       return StmtError(Diag(Tok, diag::err_expected_catch));
2612     while (Tok.is(tok::kw_catch)) {
2613       StmtResult Handler(ParseCXXCatchBlock(FnTry));
2614       if (!Handler.isInvalid())
2615         Handlers.push_back(Handler.get());
2616     }
2617     // Don't bother creating the full statement if we don't have any usable
2618     // handlers.
2619     if (Handlers.empty())
2620       return StmtError();
2621 
2622     return Actions.ActOnCXXTryBlock(TryLoc, TryBlock.get(), Handlers);
2623   }
2624 }
2625 
2626 /// ParseCXXCatchBlock - Parse a C++ catch block, called handler in the standard
2627 ///
2628 ///   handler:
2629 ///     'catch' '(' exception-declaration ')' compound-statement
2630 ///
2631 ///   exception-declaration:
2632 ///     attribute-specifier-seq[opt] type-specifier-seq declarator
2633 ///     attribute-specifier-seq[opt] type-specifier-seq abstract-declarator[opt]
2634 ///     '...'
2635 ///
2636 StmtResult Parser::ParseCXXCatchBlock(bool FnCatch) {
2637   assert(Tok.is(tok::kw_catch) && "Expected 'catch'");
2638 
2639   SourceLocation CatchLoc = ConsumeToken();
2640 
2641   BalancedDelimiterTracker T(*this, tok::l_paren);
2642   if (T.expectAndConsume())
2643     return StmtError();
2644 
2645   // C++ 3.3.2p3:
2646   // The name in a catch exception-declaration is local to the handler and
2647   // shall not be redeclared in the outermost block of the handler.
2648   ParseScope CatchScope(this, Scope::DeclScope | Scope::ControlScope |
2649                                   Scope::CatchScope |
2650                                   (FnCatch ? Scope::FnTryCatchScope : 0));
2651 
2652   // exception-declaration is equivalent to '...' or a parameter-declaration
2653   // without default arguments.
2654   Decl *ExceptionDecl = nullptr;
2655   if (Tok.isNot(tok::ellipsis)) {
2656     ParsedAttributes Attributes(AttrFactory);
2657     MaybeParseCXX11Attributes(Attributes);
2658 
2659     DeclSpec DS(AttrFactory);
2660 
2661     if (ParseCXXTypeSpecifierSeq(DS))
2662       return StmtError();
2663 
2664     Declarator ExDecl(DS, Attributes, DeclaratorContext::CXXCatch);
2665     ParseDeclarator(ExDecl);
2666     ExceptionDecl = Actions.ActOnExceptionDeclarator(getCurScope(), ExDecl);
2667   } else
2668     ConsumeToken();
2669 
2670   T.consumeClose();
2671   if (T.getCloseLocation().isInvalid())
2672     return StmtError();
2673 
2674   if (Tok.isNot(tok::l_brace))
2675     return StmtError(Diag(Tok, diag::err_expected) << tok::l_brace);
2676 
2677   // FIXME: Possible draft standard bug: attribute-specifier should be allowed?
2678   StmtResult Block(ParseCompoundStatement());
2679   if (Block.isInvalid())
2680     return Block;
2681 
2682   return Actions.ActOnCXXCatchBlock(CatchLoc, ExceptionDecl, Block.get());
2683 }
2684 
2685 void Parser::ParseMicrosoftIfExistsStatement(StmtVector &Stmts) {
2686   IfExistsCondition Result;
2687   if (ParseMicrosoftIfExistsCondition(Result))
2688     return;
2689 
2690   // Handle dependent statements by parsing the braces as a compound statement.
2691   // This is not the same behavior as Visual C++, which don't treat this as a
2692   // compound statement, but for Clang's type checking we can't have anything
2693   // inside these braces escaping to the surrounding code.
2694   if (Result.Behavior == IEB_Dependent) {
2695     if (!Tok.is(tok::l_brace)) {
2696       Diag(Tok, diag::err_expected) << tok::l_brace;
2697       return;
2698     }
2699 
2700     StmtResult Compound = ParseCompoundStatement();
2701     if (Compound.isInvalid())
2702       return;
2703 
2704     StmtResult DepResult = Actions.ActOnMSDependentExistsStmt(Result.KeywordLoc,
2705                                                               Result.IsIfExists,
2706                                                               Result.SS,
2707                                                               Result.Name,
2708                                                               Compound.get());
2709     if (DepResult.isUsable())
2710       Stmts.push_back(DepResult.get());
2711     return;
2712   }
2713 
2714   BalancedDelimiterTracker Braces(*this, tok::l_brace);
2715   if (Braces.consumeOpen()) {
2716     Diag(Tok, diag::err_expected) << tok::l_brace;
2717     return;
2718   }
2719 
2720   switch (Result.Behavior) {
2721   case IEB_Parse:
2722     // Parse the statements below.
2723     break;
2724 
2725   case IEB_Dependent:
2726     llvm_unreachable("Dependent case handled above");
2727 
2728   case IEB_Skip:
2729     Braces.skipToEnd();
2730     return;
2731   }
2732 
2733   // Condition is true, parse the statements.
2734   while (Tok.isNot(tok::r_brace)) {
2735     StmtResult R =
2736         ParseStatementOrDeclaration(Stmts, ParsedStmtContext::Compound);
2737     if (R.isUsable())
2738       Stmts.push_back(R.get());
2739   }
2740   Braces.consumeClose();
2741 }
2742