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