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