Home | History | Annotate | Download | only in Parse
      1 //===--- ParseStmt.cpp - Statement and Block Parser -----------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file implements the Statement and Block portions of the Parser
     11 // interface.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #include "clang/Parse/Parser.h"
     16 #include "RAIIObjectsForParser.h"
     17 #include "clang/Sema/DeclSpec.h"
     18 #include "clang/Sema/PrettyDeclStackTrace.h"
     19 #include "clang/Sema/Scope.h"
     20 #include "clang/Basic/Diagnostic.h"
     21 #include "clang/Basic/PrettyStackTrace.h"
     22 #include "clang/Basic/SourceManager.h"
     23 using namespace clang;
     24 
     25 //===----------------------------------------------------------------------===//
     26 // C99 6.8: Statements and Blocks.
     27 //===----------------------------------------------------------------------===//
     28 
     29 /// ParseStatementOrDeclaration - Read 'statement' or 'declaration'.
     30 ///       StatementOrDeclaration:
     31 ///         statement
     32 ///         declaration
     33 ///
     34 ///       statement:
     35 ///         labeled-statement
     36 ///         compound-statement
     37 ///         expression-statement
     38 ///         selection-statement
     39 ///         iteration-statement
     40 ///         jump-statement
     41 /// [C++]   declaration-statement
     42 /// [C++]   try-block
     43 /// [MS]    seh-try-block
     44 /// [OBC]   objc-throw-statement
     45 /// [OBC]   objc-try-catch-statement
     46 /// [OBC]   objc-synchronized-statement
     47 /// [GNU]   asm-statement
     48 /// [OMP]   openmp-construct             [TODO]
     49 ///
     50 ///       labeled-statement:
     51 ///         identifier ':' statement
     52 ///         'case' constant-expression ':' statement
     53 ///         'default' ':' statement
     54 ///
     55 ///       selection-statement:
     56 ///         if-statement
     57 ///         switch-statement
     58 ///
     59 ///       iteration-statement:
     60 ///         while-statement
     61 ///         do-statement
     62 ///         for-statement
     63 ///
     64 ///       expression-statement:
     65 ///         expression[opt] ';'
     66 ///
     67 ///       jump-statement:
     68 ///         'goto' identifier ';'
     69 ///         'continue' ';'
     70 ///         'break' ';'
     71 ///         'return' expression[opt] ';'
     72 /// [GNU]   'goto' '*' expression ';'
     73 ///
     74 /// [OBC] objc-throw-statement:
     75 /// [OBC]   '@' 'throw' expression ';'
     76 /// [OBC]   '@' 'throw' ';'
     77 ///
     78 StmtResult
     79 Parser::ParseStatementOrDeclaration(StmtVector &Stmts, bool OnlyStatement) {
     80   const char *SemiError = 0;
     81   StmtResult Res;
     82 
     83   ParenBraceBracketBalancer BalancerRAIIObj(*this);
     84 
     85   ParsedAttributesWithRange attrs(AttrFactory);
     86   MaybeParseCXX0XAttributes(attrs);
     87 
     88   // Cases in this switch statement should fall through if the parser expects
     89   // the token to end in a semicolon (in which case SemiError should be set),
     90   // or they directly 'return;' if not.
     91 Retry:
     92   tok::TokenKind Kind  = Tok.getKind();
     93   SourceLocation AtLoc;
     94   switch (Kind) {
     95   case tok::at: // May be a @try or @throw statement
     96     {
     97       AtLoc = ConsumeToken();  // consume @
     98       return ParseObjCAtStatement(AtLoc);
     99     }
    100 
    101   case tok::code_completion:
    102     Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Statement);
    103     ConsumeCodeCompletionToken();
    104     return ParseStatementOrDeclaration(Stmts, OnlyStatement);
    105 
    106   case tok::identifier: {
    107     Token Next = NextToken();
    108     if (Next.is(tok::colon)) { // C99 6.8.1: labeled-statement
    109       // identifier ':' statement
    110       return ParseLabeledStatement(attrs);
    111     }
    112 
    113     if (Next.isNot(tok::coloncolon)) {
    114       CXXScopeSpec SS;
    115       IdentifierInfo *Name = Tok.getIdentifierInfo();
    116       SourceLocation NameLoc = Tok.getLocation();
    117       Sema::NameClassification Classification
    118         = Actions.ClassifyName(getCurScope(), SS, Name, NameLoc, Next);
    119       switch (Classification.getKind()) {
    120       case Sema::NC_Keyword:
    121         // The identifier was corrected to a keyword. Update the token
    122         // to this keyword, and try again.
    123         if (Name->getTokenID() != tok::identifier) {
    124           Tok.setIdentifierInfo(Name);
    125           Tok.setKind(Name->getTokenID());
    126           goto Retry;
    127         }
    128 
    129         // Fall through via the normal error path.
    130         // FIXME: This seems like it could only happen for context-sensitive
    131         // keywords.
    132 
    133       case Sema::NC_Error:
    134         // Handle errors here by skipping up to the next semicolon or '}', and
    135         // eat the semicolon if that's what stopped us.
    136         SkipUntil(tok::r_brace, /*StopAtSemi=*/true, /*DontConsume=*/true);
    137         if (Tok.is(tok::semi))
    138           ConsumeToken();
    139         return StmtError();
    140 
    141       case Sema::NC_Unknown:
    142         // Either we don't know anything about this identifier, or we know that
    143         // we're in a syntactic context we haven't handled yet.
    144         break;
    145 
    146       case Sema::NC_Type:
    147         Tok.setKind(tok::annot_typename);
    148         setTypeAnnotation(Tok, Classification.getType());
    149         Tok.setAnnotationEndLoc(NameLoc);
    150         PP.AnnotateCachedTokens(Tok);
    151         break;
    152 
    153       case Sema::NC_Expression:
    154         Tok.setKind(tok::annot_primary_expr);
    155         setExprAnnotation(Tok, Classification.getExpression());
    156         Tok.setAnnotationEndLoc(NameLoc);
    157         PP.AnnotateCachedTokens(Tok);
    158         break;
    159 
    160       case Sema::NC_TypeTemplate:
    161       case Sema::NC_FunctionTemplate: {
    162         ConsumeToken(); // the identifier
    163         UnqualifiedId Id;
    164         Id.setIdentifier(Name, NameLoc);
    165         if (AnnotateTemplateIdToken(
    166                             TemplateTy::make(Classification.getTemplateName()),
    167                                     Classification.getTemplateNameKind(),
    168                                     SS, Id, SourceLocation(),
    169                                     /*AllowTypeAnnotation=*/false)) {
    170           // Handle errors here by skipping up to the next semicolon or '}', and
    171           // eat the semicolon if that's what stopped us.
    172           SkipUntil(tok::r_brace, /*StopAtSemi=*/true, /*DontConsume=*/true);
    173           if (Tok.is(tok::semi))
    174             ConsumeToken();
    175           return StmtError();
    176         }
    177 
    178         // If the next token is '::', jump right into parsing a
    179         // nested-name-specifier. We don't want to leave the template-id
    180         // hanging.
    181         if (NextToken().is(tok::coloncolon) && TryAnnotateCXXScopeToken(false)){
    182           // Handle errors here by skipping up to the next semicolon or '}', and
    183           // eat the semicolon if that's what stopped us.
    184           SkipUntil(tok::r_brace, /*StopAtSemi=*/true, /*DontConsume=*/true);
    185           if (Tok.is(tok::semi))
    186             ConsumeToken();
    187           return StmtError();
    188         }
    189 
    190         // We've annotated a template-id, so try again now.
    191         goto Retry;
    192       }
    193 
    194       case Sema::NC_NestedNameSpecifier:
    195         // FIXME: Implement this!
    196         break;
    197       }
    198     }
    199 
    200     // Fall through
    201   }
    202 
    203   default: {
    204     if ((getLang().CPlusPlus || !OnlyStatement) && isDeclarationStatement()) {
    205       SourceLocation DeclStart = Tok.getLocation(), DeclEnd;
    206       DeclGroupPtrTy Decl = ParseDeclaration(Stmts, Declarator::BlockContext,
    207                                              DeclEnd, attrs);
    208       return Actions.ActOnDeclStmt(Decl, DeclStart, DeclEnd);
    209     }
    210 
    211     if (Tok.is(tok::r_brace)) {
    212       Diag(Tok, diag::err_expected_statement);
    213       return StmtError();
    214     }
    215 
    216     return ParseExprStatement(attrs);
    217   }
    218 
    219   case tok::kw_case:                // C99 6.8.1: labeled-statement
    220     return ParseCaseStatement(attrs);
    221   case tok::kw_default:             // C99 6.8.1: labeled-statement
    222     return ParseDefaultStatement(attrs);
    223 
    224   case tok::l_brace:                // C99 6.8.2: compound-statement
    225     return ParseCompoundStatement(attrs);
    226   case tok::semi: {                 // C99 6.8.3p3: expression[opt] ';'
    227     SourceLocation LeadingEmptyMacroLoc;
    228     if (Tok.hasLeadingEmptyMacro())
    229       LeadingEmptyMacroLoc = PP.getLastEmptyMacroExpansionLoc();
    230     return Actions.ActOnNullStmt(ConsumeToken(), LeadingEmptyMacroLoc);
    231   }
    232 
    233   case tok::kw_if:                  // C99 6.8.4.1: if-statement
    234     return ParseIfStatement(attrs);
    235   case tok::kw_switch:              // C99 6.8.4.2: switch-statement
    236     return ParseSwitchStatement(attrs);
    237 
    238   case tok::kw_while:               // C99 6.8.5.1: while-statement
    239     return ParseWhileStatement(attrs);
    240   case tok::kw_do:                  // C99 6.8.5.2: do-statement
    241     Res = ParseDoStatement(attrs);
    242     SemiError = "do/while";
    243     break;
    244   case tok::kw_for:                 // C99 6.8.5.3: for-statement
    245     return ParseForStatement(attrs);
    246 
    247   case tok::kw_goto:                // C99 6.8.6.1: goto-statement
    248     Res = ParseGotoStatement(attrs);
    249     SemiError = "goto";
    250     break;
    251   case tok::kw_continue:            // C99 6.8.6.2: continue-statement
    252     Res = ParseContinueStatement(attrs);
    253     SemiError = "continue";
    254     break;
    255   case tok::kw_break:               // C99 6.8.6.3: break-statement
    256     Res = ParseBreakStatement(attrs);
    257     SemiError = "break";
    258     break;
    259   case tok::kw_return:              // C99 6.8.6.4: return-statement
    260     Res = ParseReturnStatement(attrs);
    261     SemiError = "return";
    262     break;
    263 
    264   case tok::kw_asm: {
    265     ProhibitAttributes(attrs);
    266     bool msAsm = false;
    267     Res = ParseAsmStatement(msAsm);
    268     Res = Actions.ActOnFinishFullStmt(Res.get());
    269     if (msAsm) return move(Res);
    270     SemiError = "asm";
    271     break;
    272   }
    273 
    274   case tok::kw_try:                 // C++ 15: try-block
    275     return ParseCXXTryBlock(attrs);
    276 
    277   case tok::kw___try:
    278     return ParseSEHTryBlock(attrs);
    279   }
    280 
    281   // If we reached this code, the statement must end in a semicolon.
    282   if (Tok.is(tok::semi)) {
    283     ConsumeToken();
    284   } else if (!Res.isInvalid()) {
    285     // If the result was valid, then we do want to diagnose this.  Use
    286     // ExpectAndConsume to emit the diagnostic, even though we know it won't
    287     // succeed.
    288     ExpectAndConsume(tok::semi, diag::err_expected_semi_after_stmt, SemiError);
    289     // Skip until we see a } or ;, but don't eat it.
    290     SkipUntil(tok::r_brace, true, true);
    291   }
    292 
    293   return move(Res);
    294 }
    295 
    296 /// \brief Parse an expression statement.
    297 StmtResult Parser::ParseExprStatement(ParsedAttributes &Attrs) {
    298   // If a case keyword is missing, this is where it should be inserted.
    299   Token OldToken = Tok;
    300 
    301   // FIXME: Use the attributes
    302   // expression[opt] ';'
    303   ExprResult Expr(ParseExpression());
    304   if (Expr.isInvalid()) {
    305     // If the expression is invalid, skip ahead to the next semicolon or '}'.
    306     // Not doing this opens us up to the possibility of infinite loops if
    307     // ParseExpression does not consume any tokens.
    308     SkipUntil(tok::r_brace, /*StopAtSemi=*/true, /*DontConsume=*/true);
    309     if (Tok.is(tok::semi))
    310       ConsumeToken();
    311     return StmtError();
    312   }
    313 
    314   if (Tok.is(tok::colon) && getCurScope()->isSwitchScope() &&
    315       Actions.CheckCaseExpression(Expr.get())) {
    316     // If a constant expression is followed by a colon inside a switch block,
    317     // suggest a missing case keyword.
    318     Diag(OldToken, diag::err_expected_case_before_expression)
    319       << FixItHint::CreateInsertion(OldToken.getLocation(), "case ");
    320 
    321     // Recover parsing as a case statement.
    322     return ParseCaseStatement(Attrs, /*MissingCase=*/true, Expr);
    323   }
    324 
    325   // Otherwise, eat the semicolon.
    326   ExpectAndConsumeSemi(diag::err_expected_semi_after_expr);
    327   return Actions.ActOnExprStmt(Actions.MakeFullExpr(Expr.get()));
    328 }
    329 
    330 StmtResult Parser::ParseSEHTryBlock(ParsedAttributes & Attrs) {
    331   assert(Tok.is(tok::kw___try) && "Expected '__try'");
    332   SourceLocation Loc = ConsumeToken();
    333   return ParseSEHTryBlockCommon(Loc);
    334 }
    335 
    336 /// ParseSEHTryBlockCommon
    337 ///
    338 /// seh-try-block:
    339 ///   '__try' compound-statement seh-handler
    340 ///
    341 /// seh-handler:
    342 ///   seh-except-block
    343 ///   seh-finally-block
    344 ///
    345 StmtResult Parser::ParseSEHTryBlockCommon(SourceLocation TryLoc) {
    346   if(Tok.isNot(tok::l_brace))
    347     return StmtError(Diag(Tok,diag::err_expected_lbrace));
    348 
    349   ParsedAttributesWithRange attrs(AttrFactory);
    350   StmtResult TryBlock(ParseCompoundStatement(attrs));
    351   if(TryBlock.isInvalid())
    352     return move(TryBlock);
    353 
    354   StmtResult Handler;
    355   if(Tok.is(tok::kw___except)) {
    356     SourceLocation Loc = ConsumeToken();
    357     Handler = ParseSEHExceptBlock(Loc);
    358   } else if (Tok.is(tok::kw___finally)) {
    359     SourceLocation Loc = ConsumeToken();
    360     Handler = ParseSEHFinallyBlock(Loc);
    361   } else {
    362     return StmtError(Diag(Tok,diag::err_seh_expected_handler));
    363   }
    364 
    365   if(Handler.isInvalid())
    366     return move(Handler);
    367 
    368   return Actions.ActOnSEHTryBlock(false /* IsCXXTry */,
    369                                   TryLoc,
    370                                   TryBlock.take(),
    371                                   Handler.take());
    372 }
    373 
    374 /// ParseSEHExceptBlock - Handle __except
    375 ///
    376 /// seh-except-block:
    377 ///   '__except' '(' seh-filter-expression ')' compound-statement
    378 ///
    379 StmtResult Parser::ParseSEHExceptBlock(SourceLocation ExceptLoc) {
    380   PoisonIdentifierRAIIObject raii(Ident__exception_code, false),
    381     raii2(Ident___exception_code, false),
    382     raii3(Ident_GetExceptionCode, false);
    383 
    384   if(ExpectAndConsume(tok::l_paren,diag::err_expected_lparen))
    385     return StmtError();
    386 
    387   ParseScope ExpectScope(this, Scope::DeclScope | Scope::ControlScope);
    388 
    389   if (getLang().Borland) {
    390     Ident__exception_info->setIsPoisoned(false);
    391     Ident___exception_info->setIsPoisoned(false);
    392     Ident_GetExceptionInfo->setIsPoisoned(false);
    393   }
    394   ExprResult FilterExpr(ParseExpression());
    395 
    396   if (getLang().Borland) {
    397     Ident__exception_info->setIsPoisoned(true);
    398     Ident___exception_info->setIsPoisoned(true);
    399     Ident_GetExceptionInfo->setIsPoisoned(true);
    400   }
    401 
    402   if(FilterExpr.isInvalid())
    403     return StmtError();
    404 
    405   if(ExpectAndConsume(tok::r_paren,diag::err_expected_rparen))
    406     return StmtError();
    407 
    408   ParsedAttributesWithRange attrs(AttrFactory);
    409   StmtResult Block(ParseCompoundStatement(attrs));
    410 
    411   if(Block.isInvalid())
    412     return move(Block);
    413 
    414   return Actions.ActOnSEHExceptBlock(ExceptLoc, FilterExpr.take(), Block.take());
    415 }
    416 
    417 /// ParseSEHFinallyBlock - Handle __finally
    418 ///
    419 /// seh-finally-block:
    420 ///   '__finally' compound-statement
    421 ///
    422 StmtResult Parser::ParseSEHFinallyBlock(SourceLocation FinallyBlock) {
    423   PoisonIdentifierRAIIObject raii(Ident__abnormal_termination, false),
    424     raii2(Ident___abnormal_termination, false),
    425     raii3(Ident_AbnormalTermination, false);
    426 
    427   ParsedAttributesWithRange attrs(AttrFactory);
    428   StmtResult Block(ParseCompoundStatement(attrs));
    429   if(Block.isInvalid())
    430     return move(Block);
    431 
    432   return Actions.ActOnSEHFinallyBlock(FinallyBlock,Block.take());
    433 }
    434 
    435 /// ParseLabeledStatement - We have an identifier and a ':' after it.
    436 ///
    437 ///       labeled-statement:
    438 ///         identifier ':' statement
    439 /// [GNU]   identifier ':' attributes[opt] statement
    440 ///
    441 StmtResult Parser::ParseLabeledStatement(ParsedAttributes &attrs) {
    442   assert(Tok.is(tok::identifier) && Tok.getIdentifierInfo() &&
    443          "Not an identifier!");
    444 
    445   Token IdentTok = Tok;  // Save the whole token.
    446   ConsumeToken();  // eat the identifier.
    447 
    448   assert(Tok.is(tok::colon) && "Not a label!");
    449 
    450   // identifier ':' statement
    451   SourceLocation ColonLoc = ConsumeToken();
    452 
    453   // Read label attributes, if present.
    454   MaybeParseGNUAttributes(attrs);
    455 
    456   StmtResult SubStmt(ParseStatement());
    457 
    458   // Broken substmt shouldn't prevent the label from being added to the AST.
    459   if (SubStmt.isInvalid())
    460     SubStmt = Actions.ActOnNullStmt(ColonLoc);
    461 
    462   LabelDecl *LD = Actions.LookupOrCreateLabel(IdentTok.getIdentifierInfo(),
    463                                               IdentTok.getLocation());
    464   if (AttributeList *Attrs = attrs.getList())
    465     Actions.ProcessDeclAttributeList(Actions.CurScope, LD, Attrs);
    466 
    467   return Actions.ActOnLabelStmt(IdentTok.getLocation(), LD, ColonLoc,
    468                                 SubStmt.get());
    469 }
    470 
    471 /// ParseCaseStatement
    472 ///       labeled-statement:
    473 ///         'case' constant-expression ':' statement
    474 /// [GNU]   'case' constant-expression '...' constant-expression ':' statement
    475 ///
    476 StmtResult Parser::ParseCaseStatement(ParsedAttributes &attrs, bool MissingCase,
    477                                       ExprResult Expr) {
    478   assert((MissingCase || Tok.is(tok::kw_case)) && "Not a case stmt!");
    479   // FIXME: Use attributes?
    480 
    481   // It is very very common for code to contain many case statements recursively
    482   // nested, as in (but usually without indentation):
    483   //  case 1:
    484   //    case 2:
    485   //      case 3:
    486   //         case 4:
    487   //           case 5: etc.
    488   //
    489   // Parsing this naively works, but is both inefficient and can cause us to run
    490   // out of stack space in our recursive descent parser.  As a special case,
    491   // flatten this recursion into an iterative loop.  This is complex and gross,
    492   // but all the grossness is constrained to ParseCaseStatement (and some
    493   // wierdness in the actions), so this is just local grossness :).
    494 
    495   // TopLevelCase - This is the highest level we have parsed.  'case 1' in the
    496   // example above.
    497   StmtResult TopLevelCase(true);
    498 
    499   // DeepestParsedCaseStmt - This is the deepest statement we have parsed, which
    500   // gets updated each time a new case is parsed, and whose body is unset so
    501   // far.  When parsing 'case 4', this is the 'case 3' node.
    502   StmtTy *DeepestParsedCaseStmt = 0;
    503 
    504   // While we have case statements, eat and stack them.
    505   SourceLocation ColonLoc;
    506   do {
    507     SourceLocation CaseLoc = MissingCase ? Expr.get()->getExprLoc() :
    508                                            ConsumeToken();  // eat the 'case'.
    509 
    510     if (Tok.is(tok::code_completion)) {
    511       Actions.CodeCompleteCase(getCurScope());
    512       ConsumeCodeCompletionToken();
    513     }
    514 
    515     /// We don't want to treat 'case x : y' as a potential typo for 'case x::y'.
    516     /// Disable this form of error recovery while we're parsing the case
    517     /// expression.
    518     ColonProtectionRAIIObject ColonProtection(*this);
    519 
    520     ExprResult LHS(MissingCase ? Expr : ParseConstantExpression());
    521     MissingCase = false;
    522     if (LHS.isInvalid()) {
    523       SkipUntil(tok::colon);
    524       return StmtError();
    525     }
    526 
    527     // GNU case range extension.
    528     SourceLocation DotDotDotLoc;
    529     ExprResult RHS;
    530     if (Tok.is(tok::ellipsis)) {
    531       Diag(Tok, diag::ext_gnu_case_range);
    532       DotDotDotLoc = ConsumeToken();
    533 
    534       RHS = ParseConstantExpression();
    535       if (RHS.isInvalid()) {
    536         SkipUntil(tok::colon);
    537         return StmtError();
    538       }
    539     }
    540 
    541     ColonProtection.restore();
    542 
    543     if (Tok.is(tok::colon)) {
    544       ColonLoc = ConsumeToken();
    545 
    546     // Treat "case blah;" as a typo for "case blah:".
    547     } else if (Tok.is(tok::semi)) {
    548       ColonLoc = ConsumeToken();
    549       Diag(ColonLoc, diag::err_expected_colon_after) << "'case'"
    550         << FixItHint::CreateReplacement(ColonLoc, ":");
    551     } else {
    552       SourceLocation ExpectedLoc = PP.getLocForEndOfToken(PrevTokLocation);
    553       Diag(ExpectedLoc, diag::err_expected_colon_after) << "'case'"
    554         << FixItHint::CreateInsertion(ExpectedLoc, ":");
    555       ColonLoc = ExpectedLoc;
    556     }
    557 
    558     StmtResult Case =
    559       Actions.ActOnCaseStmt(CaseLoc, LHS.get(), DotDotDotLoc,
    560                             RHS.get(), ColonLoc);
    561 
    562     // If we had a sema error parsing this case, then just ignore it and
    563     // continue parsing the sub-stmt.
    564     if (Case.isInvalid()) {
    565       if (TopLevelCase.isInvalid())  // No parsed case stmts.
    566         return ParseStatement();
    567       // Otherwise, just don't add it as a nested case.
    568     } else {
    569       // If this is the first case statement we parsed, it becomes TopLevelCase.
    570       // Otherwise we link it into the current chain.
    571       Stmt *NextDeepest = Case.get();
    572       if (TopLevelCase.isInvalid())
    573         TopLevelCase = move(Case);
    574       else
    575         Actions.ActOnCaseStmtBody(DeepestParsedCaseStmt, Case.get());
    576       DeepestParsedCaseStmt = NextDeepest;
    577     }
    578 
    579     // Handle all case statements.
    580   } while (Tok.is(tok::kw_case));
    581 
    582   assert(!TopLevelCase.isInvalid() && "Should have parsed at least one case!");
    583 
    584   // If we found a non-case statement, start by parsing it.
    585   StmtResult SubStmt;
    586 
    587   if (Tok.isNot(tok::r_brace)) {
    588     SubStmt = ParseStatement();
    589   } else {
    590     // Nicely diagnose the common error "switch (X) { case 4: }", which is
    591     // not valid.
    592     SourceLocation AfterColonLoc = PP.getLocForEndOfToken(ColonLoc);
    593     Diag(AfterColonLoc, diag::err_label_end_of_compound_statement);
    594     SubStmt = true;
    595   }
    596 
    597   // Broken sub-stmt shouldn't prevent forming the case statement properly.
    598   if (SubStmt.isInvalid())
    599     SubStmt = Actions.ActOnNullStmt(SourceLocation());
    600 
    601   // Install the body into the most deeply-nested case.
    602   Actions.ActOnCaseStmtBody(DeepestParsedCaseStmt, SubStmt.get());
    603 
    604   // Return the top level parsed statement tree.
    605   return move(TopLevelCase);
    606 }
    607 
    608 /// ParseDefaultStatement
    609 ///       labeled-statement:
    610 ///         'default' ':' statement
    611 /// Note that this does not parse the 'statement' at the end.
    612 ///
    613 StmtResult Parser::ParseDefaultStatement(ParsedAttributes &attrs) {
    614   //FIXME: Use attributes?
    615 
    616   assert(Tok.is(tok::kw_default) && "Not a default stmt!");
    617   SourceLocation DefaultLoc = ConsumeToken();  // eat the 'default'.
    618 
    619   SourceLocation ColonLoc;
    620   if (Tok.is(tok::colon)) {
    621     ColonLoc = ConsumeToken();
    622 
    623   // Treat "default;" as a typo for "default:".
    624   } else if (Tok.is(tok::semi)) {
    625     ColonLoc = ConsumeToken();
    626     Diag(ColonLoc, diag::err_expected_colon_after) << "'default'"
    627       << FixItHint::CreateReplacement(ColonLoc, ":");
    628   } else {
    629     SourceLocation ExpectedLoc = PP.getLocForEndOfToken(PrevTokLocation);
    630     Diag(ExpectedLoc, diag::err_expected_colon_after) << "'default'"
    631       << FixItHint::CreateInsertion(ExpectedLoc, ":");
    632     ColonLoc = ExpectedLoc;
    633   }
    634 
    635   // Diagnose the common error "switch (X) {... default: }", which is not valid.
    636   if (Tok.is(tok::r_brace)) {
    637     SourceLocation AfterColonLoc = PP.getLocForEndOfToken(ColonLoc);
    638     Diag(AfterColonLoc, diag::err_label_end_of_compound_statement);
    639     return StmtError();
    640   }
    641 
    642   StmtResult SubStmt(ParseStatement());
    643   if (SubStmt.isInvalid())
    644     return StmtError();
    645 
    646   return Actions.ActOnDefaultStmt(DefaultLoc, ColonLoc,
    647                                   SubStmt.get(), getCurScope());
    648 }
    649 
    650 StmtResult Parser::ParseCompoundStatement(ParsedAttributes &Attr,
    651                                           bool isStmtExpr) {
    652   return ParseCompoundStatement(Attr, isStmtExpr, Scope::DeclScope);
    653 }
    654 
    655 /// ParseCompoundStatement - Parse a "{}" block.
    656 ///
    657 ///       compound-statement: [C99 6.8.2]
    658 ///         { block-item-list[opt] }
    659 /// [GNU]   { label-declarations block-item-list } [TODO]
    660 ///
    661 ///       block-item-list:
    662 ///         block-item
    663 ///         block-item-list block-item
    664 ///
    665 ///       block-item:
    666 ///         declaration
    667 /// [GNU]   '__extension__' declaration
    668 ///         statement
    669 /// [OMP]   openmp-directive            [TODO]
    670 ///
    671 /// [GNU] label-declarations:
    672 /// [GNU]   label-declaration
    673 /// [GNU]   label-declarations label-declaration
    674 ///
    675 /// [GNU] label-declaration:
    676 /// [GNU]   '__label__' identifier-list ';'
    677 ///
    678 /// [OMP] openmp-directive:             [TODO]
    679 /// [OMP]   barrier-directive
    680 /// [OMP]   flush-directive
    681 ///
    682 StmtResult Parser::ParseCompoundStatement(ParsedAttributes &attrs,
    683                                           bool isStmtExpr,
    684                                           unsigned ScopeFlags) {
    685   //FIXME: Use attributes?
    686 
    687   assert(Tok.is(tok::l_brace) && "Not a compount stmt!");
    688 
    689   // Enter a scope to hold everything within the compound stmt.  Compound
    690   // statements can always hold declarations.
    691   ParseScope CompoundScope(this, ScopeFlags);
    692 
    693   // Parse the statements in the body.
    694   return ParseCompoundStatementBody(isStmtExpr);
    695 }
    696 
    697 
    698 /// ParseCompoundStatementBody - Parse a sequence of statements and invoke the
    699 /// ActOnCompoundStmt action.  This expects the '{' to be the current token, and
    700 /// consume the '}' at the end of the block.  It does not manipulate the scope
    701 /// stack.
    702 StmtResult Parser::ParseCompoundStatementBody(bool isStmtExpr) {
    703   PrettyStackTraceLoc CrashInfo(PP.getSourceManager(),
    704                                 Tok.getLocation(),
    705                                 "in compound statement ('{}')");
    706   InMessageExpressionRAIIObject InMessage(*this, false);
    707 
    708   SourceLocation LBraceLoc = ConsumeBrace();  // eat the '{'.
    709 
    710   StmtVector Stmts(Actions);
    711 
    712   // "__label__ X, Y, Z;" is the GNU "Local Label" extension.  These are
    713   // only allowed at the start of a compound stmt regardless of the language.
    714   while (Tok.is(tok::kw___label__)) {
    715     SourceLocation LabelLoc = ConsumeToken();
    716     Diag(LabelLoc, diag::ext_gnu_local_label);
    717 
    718     llvm::SmallVector<Decl *, 8> DeclsInGroup;
    719     while (1) {
    720       if (Tok.isNot(tok::identifier)) {
    721         Diag(Tok, diag::err_expected_ident);
    722         break;
    723       }
    724 
    725       IdentifierInfo *II = Tok.getIdentifierInfo();
    726       SourceLocation IdLoc = ConsumeToken();
    727       DeclsInGroup.push_back(Actions.LookupOrCreateLabel(II, IdLoc, LabelLoc));
    728 
    729       if (!Tok.is(tok::comma))
    730         break;
    731       ConsumeToken();
    732     }
    733 
    734     DeclSpec DS(AttrFactory);
    735     DeclGroupPtrTy Res = Actions.FinalizeDeclaratorGroup(getCurScope(), DS,
    736                                       DeclsInGroup.data(), DeclsInGroup.size());
    737     StmtResult R = Actions.ActOnDeclStmt(Res, LabelLoc, Tok.getLocation());
    738 
    739     ExpectAndConsume(tok::semi, diag::err_expected_semi_declaration);
    740     if (R.isUsable())
    741       Stmts.push_back(R.release());
    742   }
    743 
    744   while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) {
    745     if (Tok.is(tok::annot_pragma_unused)) {
    746       HandlePragmaUnused();
    747       continue;
    748     }
    749 
    750     if (getLang().Microsoft && (Tok.is(tok::kw___if_exists) ||
    751         Tok.is(tok::kw___if_not_exists))) {
    752       ParseMicrosoftIfExistsStatement(Stmts);
    753       continue;
    754     }
    755 
    756     StmtResult R;
    757     if (Tok.isNot(tok::kw___extension__)) {
    758       R = ParseStatementOrDeclaration(Stmts, false);
    759     } else {
    760       // __extension__ can start declarations and it can also be a unary
    761       // operator for expressions.  Consume multiple __extension__ markers here
    762       // until we can determine which is which.
    763       // FIXME: This loses extension expressions in the AST!
    764       SourceLocation ExtLoc = ConsumeToken();
    765       while (Tok.is(tok::kw___extension__))
    766         ConsumeToken();
    767 
    768       ParsedAttributesWithRange attrs(AttrFactory);
    769       MaybeParseCXX0XAttributes(attrs);
    770 
    771       // If this is the start of a declaration, parse it as such.
    772       if (isDeclarationStatement()) {
    773         // __extension__ silences extension warnings in the subdeclaration.
    774         // FIXME: Save the __extension__ on the decl as a node somehow?
    775         ExtensionRAIIObject O(Diags);
    776 
    777         SourceLocation DeclStart = Tok.getLocation(), DeclEnd;
    778         DeclGroupPtrTy Res = ParseDeclaration(Stmts,
    779                                               Declarator::BlockContext, DeclEnd,
    780                                               attrs);
    781         R = Actions.ActOnDeclStmt(Res, DeclStart, DeclEnd);
    782       } else {
    783         // Otherwise this was a unary __extension__ marker.
    784         ExprResult Res(ParseExpressionWithLeadingExtension(ExtLoc));
    785 
    786         if (Res.isInvalid()) {
    787           SkipUntil(tok::semi);
    788           continue;
    789         }
    790 
    791         // FIXME: Use attributes?
    792         // Eat the semicolon at the end of stmt and convert the expr into a
    793         // statement.
    794         ExpectAndConsumeSemi(diag::err_expected_semi_after_expr);
    795         R = Actions.ActOnExprStmt(Actions.MakeFullExpr(Res.get()));
    796       }
    797     }
    798 
    799     if (R.isUsable())
    800       Stmts.push_back(R.release());
    801   }
    802 
    803   // We broke out of the while loop because we found a '}' or EOF.
    804   if (Tok.isNot(tok::r_brace)) {
    805     Diag(Tok, diag::err_expected_rbrace);
    806     Diag(LBraceLoc, diag::note_matching) << "{";
    807     return StmtError();
    808   }
    809 
    810   SourceLocation RBraceLoc = ConsumeBrace();
    811   return Actions.ActOnCompoundStmt(LBraceLoc, RBraceLoc, move_arg(Stmts),
    812                                    isStmtExpr);
    813 }
    814 
    815 /// ParseParenExprOrCondition:
    816 /// [C  ]     '(' expression ')'
    817 /// [C++]     '(' condition ')'       [not allowed if OnlyAllowCondition=true]
    818 ///
    819 /// This function parses and performs error recovery on the specified condition
    820 /// or expression (depending on whether we're in C++ or C mode).  This function
    821 /// goes out of its way to recover well.  It returns true if there was a parser
    822 /// error (the right paren couldn't be found), which indicates that the caller
    823 /// should try to recover harder.  It returns false if the condition is
    824 /// successfully parsed.  Note that a successful parse can still have semantic
    825 /// errors in the condition.
    826 bool Parser::ParseParenExprOrCondition(ExprResult &ExprResult,
    827                                        Decl *&DeclResult,
    828                                        SourceLocation Loc,
    829                                        bool ConvertToBoolean) {
    830   SourceLocation LParenLoc = ConsumeParen();
    831   if (getLang().CPlusPlus)
    832     ParseCXXCondition(ExprResult, DeclResult, Loc, ConvertToBoolean);
    833   else {
    834     ExprResult = ParseExpression();
    835     DeclResult = 0;
    836 
    837     // If required, convert to a boolean value.
    838     if (!ExprResult.isInvalid() && ConvertToBoolean)
    839       ExprResult
    840         = Actions.ActOnBooleanCondition(getCurScope(), Loc, ExprResult.get());
    841   }
    842 
    843   // If the parser was confused by the condition and we don't have a ')', try to
    844   // recover by skipping ahead to a semi and bailing out.  If condexp is
    845   // semantically invalid but we have well formed code, keep going.
    846   if (ExprResult.isInvalid() && !DeclResult && Tok.isNot(tok::r_paren)) {
    847     SkipUntil(tok::semi);
    848     // Skipping may have stopped if it found the containing ')'.  If so, we can
    849     // continue parsing the if statement.
    850     if (Tok.isNot(tok::r_paren))
    851       return true;
    852   }
    853 
    854   // Otherwise the condition is valid or the rparen is present.
    855   MatchRHSPunctuation(tok::r_paren, LParenLoc);
    856   return false;
    857 }
    858 
    859 
    860 /// ParseIfStatement
    861 ///       if-statement: [C99 6.8.4.1]
    862 ///         'if' '(' expression ')' statement
    863 ///         'if' '(' expression ')' statement 'else' statement
    864 /// [C++]   'if' '(' condition ')' statement
    865 /// [C++]   'if' '(' condition ')' statement 'else' statement
    866 ///
    867 StmtResult Parser::ParseIfStatement(ParsedAttributes &attrs) {
    868   // FIXME: Use attributes?
    869 
    870   assert(Tok.is(tok::kw_if) && "Not an if stmt!");
    871   SourceLocation IfLoc = ConsumeToken();  // eat the 'if'.
    872 
    873   if (Tok.isNot(tok::l_paren)) {
    874     Diag(Tok, diag::err_expected_lparen_after) << "if";
    875     SkipUntil(tok::semi);
    876     return StmtError();
    877   }
    878 
    879   bool C99orCXX = getLang().C99 || getLang().CPlusPlus;
    880 
    881   // C99 6.8.4p3 - In C99, the if statement is a block.  This is not
    882   // the case for C90.
    883   //
    884   // C++ 6.4p3:
    885   // A name introduced by a declaration in a condition is in scope from its
    886   // point of declaration until the end of the substatements controlled by the
    887   // condition.
    888   // C++ 3.3.2p4:
    889   // Names declared in the for-init-statement, and in the condition of if,
    890   // while, for, and switch statements are local to the if, while, for, or
    891   // switch statement (including the controlled statement).
    892   //
    893   ParseScope IfScope(this, Scope::DeclScope | Scope::ControlScope, C99orCXX);
    894 
    895   // Parse the condition.
    896   ExprResult CondExp;
    897   Decl *CondVar = 0;
    898   if (ParseParenExprOrCondition(CondExp, CondVar, IfLoc, true))
    899     return StmtError();
    900 
    901   FullExprArg FullCondExp(Actions.MakeFullExpr(CondExp.get()));
    902 
    903   // C99 6.8.4p3 - In C99, the body of the if statement is a scope, even if
    904   // there is no compound stmt.  C90 does not have this clause.  We only do this
    905   // if the body isn't a compound statement to avoid push/pop in common cases.
    906   //
    907   // C++ 6.4p1:
    908   // The substatement in a selection-statement (each substatement, in the else
    909   // form of the if statement) implicitly defines a local scope.
    910   //
    911   // For C++ we create a scope for the condition and a new scope for
    912   // substatements because:
    913   // -When the 'then' scope exits, we want the condition declaration to still be
    914   //    active for the 'else' scope too.
    915   // -Sema will detect name clashes by considering declarations of a
    916   //    'ControlScope' as part of its direct subscope.
    917   // -If we wanted the condition and substatement to be in the same scope, we
    918   //    would have to notify ParseStatement not to create a new scope. It's
    919   //    simpler to let it create a new scope.
    920   //
    921   ParseScope InnerScope(this, Scope::DeclScope,
    922                         C99orCXX && Tok.isNot(tok::l_brace));
    923 
    924   // Read the 'then' stmt.
    925   SourceLocation ThenStmtLoc = Tok.getLocation();
    926   StmtResult ThenStmt(ParseStatement());
    927 
    928   // Pop the 'if' scope if needed.
    929   InnerScope.Exit();
    930 
    931   // If it has an else, parse it.
    932   SourceLocation ElseLoc;
    933   SourceLocation ElseStmtLoc;
    934   StmtResult ElseStmt;
    935 
    936   if (Tok.is(tok::kw_else)) {
    937     ElseLoc = ConsumeToken();
    938     ElseStmtLoc = Tok.getLocation();
    939 
    940     // C99 6.8.4p3 - In C99, the body of the if statement is a scope, even if
    941     // there is no compound stmt.  C90 does not have this clause.  We only do
    942     // this if the body isn't a compound statement to avoid push/pop in common
    943     // cases.
    944     //
    945     // C++ 6.4p1:
    946     // The substatement in a selection-statement (each substatement, in the else
    947     // form of the if statement) implicitly defines a local scope.
    948     //
    949     ParseScope InnerScope(this, Scope::DeclScope,
    950                           C99orCXX && Tok.isNot(tok::l_brace));
    951 
    952     ElseStmt = ParseStatement();
    953 
    954     // Pop the 'else' scope if needed.
    955     InnerScope.Exit();
    956   }
    957 
    958   IfScope.Exit();
    959 
    960   // If the condition was invalid, discard the if statement.  We could recover
    961   // better by replacing it with a valid expr, but don't do that yet.
    962   if (CondExp.isInvalid() && !CondVar)
    963     return StmtError();
    964 
    965   // If the then or else stmt is invalid and the other is valid (and present),
    966   // make turn the invalid one into a null stmt to avoid dropping the other
    967   // part.  If both are invalid, return error.
    968   if ((ThenStmt.isInvalid() && ElseStmt.isInvalid()) ||
    969       (ThenStmt.isInvalid() && ElseStmt.get() == 0) ||
    970       (ThenStmt.get() == 0  && ElseStmt.isInvalid())) {
    971     // Both invalid, or one is invalid and other is non-present: return error.
    972     return StmtError();
    973   }
    974 
    975   // Now if either are invalid, replace with a ';'.
    976   if (ThenStmt.isInvalid())
    977     ThenStmt = Actions.ActOnNullStmt(ThenStmtLoc);
    978   if (ElseStmt.isInvalid())
    979     ElseStmt = Actions.ActOnNullStmt(ElseStmtLoc);
    980 
    981   return Actions.ActOnIfStmt(IfLoc, FullCondExp, CondVar, ThenStmt.get(),
    982                              ElseLoc, ElseStmt.get());
    983 }
    984 
    985 /// ParseSwitchStatement
    986 ///       switch-statement:
    987 ///         'switch' '(' expression ')' statement
    988 /// [C++]   'switch' '(' condition ')' statement
    989 StmtResult Parser::ParseSwitchStatement(ParsedAttributes &attrs) {
    990   // FIXME: Use attributes?
    991 
    992   assert(Tok.is(tok::kw_switch) && "Not a switch stmt!");
    993   SourceLocation SwitchLoc = ConsumeToken();  // eat the 'switch'.
    994 
    995   if (Tok.isNot(tok::l_paren)) {
    996     Diag(Tok, diag::err_expected_lparen_after) << "switch";
    997     SkipUntil(tok::semi);
    998     return StmtError();
    999   }
   1000 
   1001   bool C99orCXX = getLang().C99 || getLang().CPlusPlus;
   1002 
   1003   // C99 6.8.4p3 - In C99, the switch statement is a block.  This is
   1004   // not the case for C90.  Start the switch scope.
   1005   //
   1006   // C++ 6.4p3:
   1007   // A name introduced by a declaration in a condition is in scope from its
   1008   // point of declaration until the end of the substatements controlled by the
   1009   // condition.
   1010   // C++ 3.3.2p4:
   1011   // Names declared in the for-init-statement, and in the condition of if,
   1012   // while, for, and switch statements are local to the if, while, for, or
   1013   // switch statement (including the controlled statement).
   1014   //
   1015   unsigned ScopeFlags = Scope::BreakScope | Scope::SwitchScope;
   1016   if (C99orCXX)
   1017     ScopeFlags |= Scope::DeclScope | Scope::ControlScope;
   1018   ParseScope SwitchScope(this, ScopeFlags);
   1019 
   1020   // Parse the condition.
   1021   ExprResult Cond;
   1022   Decl *CondVar = 0;
   1023   if (ParseParenExprOrCondition(Cond, CondVar, SwitchLoc, false))
   1024     return StmtError();
   1025 
   1026   StmtResult Switch
   1027     = Actions.ActOnStartOfSwitchStmt(SwitchLoc, Cond.get(), CondVar);
   1028 
   1029   if (Switch.isInvalid()) {
   1030     // Skip the switch body.
   1031     // FIXME: This is not optimal recovery, but parsing the body is more
   1032     // dangerous due to the presence of case and default statements, which
   1033     // will have no place to connect back with the switch.
   1034     if (Tok.is(tok::l_brace)) {
   1035       ConsumeBrace();
   1036       SkipUntil(tok::r_brace, false, false);
   1037     } else
   1038       SkipUntil(tok::semi);
   1039     return move(Switch);
   1040   }
   1041 
   1042   // C99 6.8.4p3 - In C99, the body of the switch statement is a scope, even if
   1043   // there is no compound stmt.  C90 does not have this clause.  We only do this
   1044   // if the body isn't a compound statement to avoid push/pop in common cases.
   1045   //
   1046   // C++ 6.4p1:
   1047   // The substatement in a selection-statement (each substatement, in the else
   1048   // form of the if statement) implicitly defines a local scope.
   1049   //
   1050   // See comments in ParseIfStatement for why we create a scope for the
   1051   // condition and a new scope for substatement in C++.
   1052   //
   1053   ParseScope InnerScope(this, Scope::DeclScope,
   1054                         C99orCXX && Tok.isNot(tok::l_brace));
   1055 
   1056   // Read the body statement.
   1057   StmtResult Body(ParseStatement());
   1058 
   1059   // Pop the scopes.
   1060   InnerScope.Exit();
   1061   SwitchScope.Exit();
   1062 
   1063   if (Body.isInvalid())
   1064     // FIXME: Remove the case statement list from the Switch statement.
   1065     Body = Actions.ActOnNullStmt(Tok.getLocation());
   1066 
   1067   return Actions.ActOnFinishSwitchStmt(SwitchLoc, Switch.get(), Body.get());
   1068 }
   1069 
   1070 /// ParseWhileStatement
   1071 ///       while-statement: [C99 6.8.5.1]
   1072 ///         'while' '(' expression ')' statement
   1073 /// [C++]   'while' '(' condition ')' statement
   1074 StmtResult Parser::ParseWhileStatement(ParsedAttributes &attrs) {
   1075   // FIXME: Use attributes?
   1076 
   1077   assert(Tok.is(tok::kw_while) && "Not a while stmt!");
   1078   SourceLocation WhileLoc = Tok.getLocation();
   1079   ConsumeToken();  // eat the 'while'.
   1080 
   1081   if (Tok.isNot(tok::l_paren)) {
   1082     Diag(Tok, diag::err_expected_lparen_after) << "while";
   1083     SkipUntil(tok::semi);
   1084     return StmtError();
   1085   }
   1086 
   1087   bool C99orCXX = getLang().C99 || getLang().CPlusPlus;
   1088 
   1089   // C99 6.8.5p5 - In C99, the while statement is a block.  This is not
   1090   // the case for C90.  Start the loop scope.
   1091   //
   1092   // C++ 6.4p3:
   1093   // A name introduced by a declaration in a condition is in scope from its
   1094   // point of declaration until the end of the substatements controlled by the
   1095   // condition.
   1096   // C++ 3.3.2p4:
   1097   // Names declared in the for-init-statement, and in the condition of if,
   1098   // while, for, and switch statements are local to the if, while, for, or
   1099   // switch statement (including the controlled statement).
   1100   //
   1101   unsigned ScopeFlags;
   1102   if (C99orCXX)
   1103     ScopeFlags = Scope::BreakScope | Scope::ContinueScope |
   1104                  Scope::DeclScope  | Scope::ControlScope;
   1105   else
   1106     ScopeFlags = Scope::BreakScope | Scope::ContinueScope;
   1107   ParseScope WhileScope(this, ScopeFlags);
   1108 
   1109   // Parse the condition.
   1110   ExprResult Cond;
   1111   Decl *CondVar = 0;
   1112   if (ParseParenExprOrCondition(Cond, CondVar, WhileLoc, true))
   1113     return StmtError();
   1114 
   1115   FullExprArg FullCond(Actions.MakeFullExpr(Cond.get()));
   1116 
   1117   // C99 6.8.5p5 - In C99, the body of the if statement is a scope, even if
   1118   // there is no compound stmt.  C90 does not have this clause.  We only do this
   1119   // if the body isn't a compound statement to avoid push/pop in common cases.
   1120   //
   1121   // C++ 6.5p2:
   1122   // The substatement in an iteration-statement implicitly defines a local scope
   1123   // which is entered and exited each time through the loop.
   1124   //
   1125   // See comments in ParseIfStatement for why we create a scope for the
   1126   // condition and a new scope for substatement in C++.
   1127   //
   1128   ParseScope InnerScope(this, Scope::DeclScope,
   1129                         C99orCXX && Tok.isNot(tok::l_brace));
   1130 
   1131   // Read the body statement.
   1132   StmtResult Body(ParseStatement());
   1133 
   1134   // Pop the body scope if needed.
   1135   InnerScope.Exit();
   1136   WhileScope.Exit();
   1137 
   1138   if ((Cond.isInvalid() && !CondVar) || Body.isInvalid())
   1139     return StmtError();
   1140 
   1141   return Actions.ActOnWhileStmt(WhileLoc, FullCond, CondVar, Body.get());
   1142 }
   1143 
   1144 /// ParseDoStatement
   1145 ///       do-statement: [C99 6.8.5.2]
   1146 ///         'do' statement 'while' '(' expression ')' ';'
   1147 /// Note: this lets the caller parse the end ';'.
   1148 StmtResult Parser::ParseDoStatement(ParsedAttributes &attrs) {
   1149   // FIXME: Use attributes?
   1150 
   1151   assert(Tok.is(tok::kw_do) && "Not a do stmt!");
   1152   SourceLocation DoLoc = ConsumeToken();  // eat the 'do'.
   1153 
   1154   // C99 6.8.5p5 - In C99, the do statement is a block.  This is not
   1155   // the case for C90.  Start the loop scope.
   1156   unsigned ScopeFlags;
   1157   if (getLang().C99)
   1158     ScopeFlags = Scope::BreakScope | Scope::ContinueScope | Scope::DeclScope;
   1159   else
   1160     ScopeFlags = Scope::BreakScope | Scope::ContinueScope;
   1161 
   1162   ParseScope DoScope(this, ScopeFlags);
   1163 
   1164   // C99 6.8.5p5 - In C99, the body of the if statement is a scope, even if
   1165   // there is no compound stmt.  C90 does not have this clause. We only do this
   1166   // if the body isn't a compound statement to avoid push/pop in common cases.
   1167   //
   1168   // C++ 6.5p2:
   1169   // The substatement in an iteration-statement implicitly defines a local scope
   1170   // which is entered and exited each time through the loop.
   1171   //
   1172   ParseScope InnerScope(this, Scope::DeclScope,
   1173                         (getLang().C99 || getLang().CPlusPlus) &&
   1174                         Tok.isNot(tok::l_brace));
   1175 
   1176   // Read the body statement.
   1177   StmtResult Body(ParseStatement());
   1178 
   1179   // Pop the body scope if needed.
   1180   InnerScope.Exit();
   1181 
   1182   if (Tok.isNot(tok::kw_while)) {
   1183     if (!Body.isInvalid()) {
   1184       Diag(Tok, diag::err_expected_while);
   1185       Diag(DoLoc, diag::note_matching) << "do";
   1186       SkipUntil(tok::semi, false, true);
   1187     }
   1188     return StmtError();
   1189   }
   1190   SourceLocation WhileLoc = ConsumeToken();
   1191 
   1192   if (Tok.isNot(tok::l_paren)) {
   1193     Diag(Tok, diag::err_expected_lparen_after) << "do/while";
   1194     SkipUntil(tok::semi, false, true);
   1195     return StmtError();
   1196   }
   1197 
   1198   // Parse the parenthesized condition.
   1199   SourceLocation LPLoc = ConsumeParen();
   1200   ExprResult Cond = ParseExpression();
   1201   SourceLocation RPLoc = MatchRHSPunctuation(tok::r_paren, LPLoc);
   1202   DoScope.Exit();
   1203 
   1204   if (Cond.isInvalid() || Body.isInvalid())
   1205     return StmtError();
   1206 
   1207   return Actions.ActOnDoStmt(DoLoc, Body.get(), WhileLoc, LPLoc,
   1208                              Cond.get(), RPLoc);
   1209 }
   1210 
   1211 /// ParseForStatement
   1212 ///       for-statement: [C99 6.8.5.3]
   1213 ///         'for' '(' expr[opt] ';' expr[opt] ';' expr[opt] ')' statement
   1214 ///         'for' '(' declaration expr[opt] ';' expr[opt] ')' statement
   1215 /// [C++]   'for' '(' for-init-statement condition[opt] ';' expression[opt] ')'
   1216 /// [C++]       statement
   1217 /// [C++0x] 'for' '(' for-range-declaration : for-range-initializer ) statement
   1218 /// [OBJC2] 'for' '(' declaration 'in' expr ')' statement
   1219 /// [OBJC2] 'for' '(' expr 'in' expr ')' statement
   1220 ///
   1221 /// [C++] for-init-statement:
   1222 /// [C++]   expression-statement
   1223 /// [C++]   simple-declaration
   1224 ///
   1225 /// [C++0x] for-range-declaration:
   1226 /// [C++0x]   attribute-specifier-seq[opt] type-specifier-seq declarator
   1227 /// [C++0x] for-range-initializer:
   1228 /// [C++0x]   expression
   1229 /// [C++0x]   braced-init-list            [TODO]
   1230 StmtResult Parser::ParseForStatement(ParsedAttributes &attrs) {
   1231   // FIXME: Use attributes?
   1232 
   1233   assert(Tok.is(tok::kw_for) && "Not a for stmt!");
   1234   SourceLocation ForLoc = ConsumeToken();  // eat the 'for'.
   1235 
   1236   if (Tok.isNot(tok::l_paren)) {
   1237     Diag(Tok, diag::err_expected_lparen_after) << "for";
   1238     SkipUntil(tok::semi);
   1239     return StmtError();
   1240   }
   1241 
   1242   bool C99orCXXorObjC = getLang().C99 || getLang().CPlusPlus || getLang().ObjC1;
   1243 
   1244   // C99 6.8.5p5 - In C99, the for statement is a block.  This is not
   1245   // the case for C90.  Start the loop scope.
   1246   //
   1247   // C++ 6.4p3:
   1248   // A name introduced by a declaration in a condition is in scope from its
   1249   // point of declaration until the end of the substatements controlled by the
   1250   // condition.
   1251   // C++ 3.3.2p4:
   1252   // Names declared in the for-init-statement, and in the condition of if,
   1253   // while, for, and switch statements are local to the if, while, for, or
   1254   // switch statement (including the controlled statement).
   1255   // C++ 6.5.3p1:
   1256   // Names declared in the for-init-statement are in the same declarative-region
   1257   // as those declared in the condition.
   1258   //
   1259   unsigned ScopeFlags;
   1260   if (C99orCXXorObjC)
   1261     ScopeFlags = Scope::BreakScope | Scope::ContinueScope |
   1262                  Scope::DeclScope  | Scope::ControlScope;
   1263   else
   1264     ScopeFlags = Scope::BreakScope | Scope::ContinueScope;
   1265 
   1266   ParseScope ForScope(this, ScopeFlags);
   1267 
   1268   SourceLocation LParenLoc = ConsumeParen();
   1269   ExprResult Value;
   1270 
   1271   bool ForEach = false, ForRange = false;
   1272   StmtResult FirstPart;
   1273   bool SecondPartIsInvalid = false;
   1274   FullExprArg SecondPart(Actions);
   1275   ExprResult Collection;
   1276   ForRangeInit ForRangeInit;
   1277   FullExprArg ThirdPart(Actions);
   1278   Decl *SecondVar = 0;
   1279 
   1280   if (Tok.is(tok::code_completion)) {
   1281     Actions.CodeCompleteOrdinaryName(getCurScope(),
   1282                                      C99orCXXorObjC? Sema::PCC_ForInit
   1283                                                    : Sema::PCC_Expression);
   1284     ConsumeCodeCompletionToken();
   1285   }
   1286 
   1287   // Parse the first part of the for specifier.
   1288   if (Tok.is(tok::semi)) {  // for (;
   1289     // no first part, eat the ';'.
   1290     ConsumeToken();
   1291   } else if (isSimpleDeclaration()) {  // for (int X = 4;
   1292     // Parse declaration, which eats the ';'.
   1293     if (!C99orCXXorObjC)   // Use of C99-style for loops in C90 mode?
   1294       Diag(Tok, diag::ext_c99_variable_decl_in_for_loop);
   1295 
   1296     ParsedAttributesWithRange attrs(AttrFactory);
   1297     MaybeParseCXX0XAttributes(attrs);
   1298 
   1299     // In C++0x, "for (T NS:a" might not be a typo for ::
   1300     bool MightBeForRangeStmt = getLang().CPlusPlus;
   1301     ColonProtectionRAIIObject ColonProtection(*this, MightBeForRangeStmt);
   1302 
   1303     SourceLocation DeclStart = Tok.getLocation(), DeclEnd;
   1304     StmtVector Stmts(Actions);
   1305     DeclGroupPtrTy DG = ParseSimpleDeclaration(Stmts, Declarator::ForContext,
   1306                                                DeclEnd, attrs, false,
   1307                                                MightBeForRangeStmt ?
   1308                                                  &ForRangeInit : 0);
   1309     FirstPart = Actions.ActOnDeclStmt(DG, DeclStart, Tok.getLocation());
   1310 
   1311     if (ForRangeInit.ParsedForRangeDecl()) {
   1312       ForRange = true;
   1313     } else if (Tok.is(tok::semi)) {  // for (int x = 4;
   1314       ConsumeToken();
   1315     } else if ((ForEach = isTokIdentifier_in())) {
   1316       Actions.ActOnForEachDeclStmt(DG);
   1317       // ObjC: for (id x in expr)
   1318       ConsumeToken(); // consume 'in'
   1319 
   1320       if (Tok.is(tok::code_completion)) {
   1321         Actions.CodeCompleteObjCForCollection(getCurScope(), DG);
   1322         ConsumeCodeCompletionToken();
   1323       }
   1324       Collection = ParseExpression();
   1325     } else {
   1326       Diag(Tok, diag::err_expected_semi_for);
   1327     }
   1328   } else {
   1329     Value = ParseExpression();
   1330 
   1331     ForEach = isTokIdentifier_in();
   1332 
   1333     // Turn the expression into a stmt.
   1334     if (!Value.isInvalid()) {
   1335       if (ForEach)
   1336         FirstPart = Actions.ActOnForEachLValueExpr(Value.get());
   1337       else
   1338         FirstPart = Actions.ActOnExprStmt(Actions.MakeFullExpr(Value.get()));
   1339     }
   1340 
   1341     if (Tok.is(tok::semi)) {
   1342       ConsumeToken();
   1343     } else if (ForEach) {
   1344       ConsumeToken(); // consume 'in'
   1345 
   1346       if (Tok.is(tok::code_completion)) {
   1347         Actions.CodeCompleteObjCForCollection(getCurScope(), DeclGroupPtrTy());
   1348         ConsumeCodeCompletionToken();
   1349       }
   1350       Collection = ParseExpression();
   1351     } else {
   1352       if (!Value.isInvalid()) {
   1353         Diag(Tok, diag::err_expected_semi_for);
   1354       } else {
   1355         // Skip until semicolon or rparen, don't consume it.
   1356         SkipUntil(tok::r_paren, true, true);
   1357         if (Tok.is(tok::semi))
   1358           ConsumeToken();
   1359       }
   1360     }
   1361   }
   1362   if (!ForEach && !ForRange) {
   1363     assert(!SecondPart.get() && "Shouldn't have a second expression yet.");
   1364     // Parse the second part of the for specifier.
   1365     if (Tok.is(tok::semi)) {  // for (...;;
   1366       // no second part.
   1367     } else if (Tok.is(tok::r_paren)) {
   1368       // missing both semicolons.
   1369     } else {
   1370       ExprResult Second;
   1371       if (getLang().CPlusPlus)
   1372         ParseCXXCondition(Second, SecondVar, ForLoc, true);
   1373       else {
   1374         Second = ParseExpression();
   1375         if (!Second.isInvalid())
   1376           Second = Actions.ActOnBooleanCondition(getCurScope(), ForLoc,
   1377                                                  Second.get());
   1378       }
   1379       SecondPartIsInvalid = Second.isInvalid();
   1380       SecondPart = Actions.MakeFullExpr(Second.get());
   1381     }
   1382 
   1383     if (Tok.isNot(tok::semi)) {
   1384       if (!SecondPartIsInvalid || SecondVar)
   1385         Diag(Tok, diag::err_expected_semi_for);
   1386       else
   1387         // Skip until semicolon or rparen, don't consume it.
   1388         SkipUntil(tok::r_paren, true, true);
   1389     }
   1390 
   1391     if (Tok.is(tok::semi)) {
   1392       ConsumeToken();
   1393     }
   1394 
   1395     // Parse the third part of the for specifier.
   1396     if (Tok.isNot(tok::r_paren)) {   // for (...;...;)
   1397       ExprResult Third = ParseExpression();
   1398       ThirdPart = Actions.MakeFullExpr(Third.take());
   1399     }
   1400   }
   1401   // Match the ')'.
   1402   SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
   1403 
   1404   // We need to perform most of the semantic analysis for a C++0x for-range
   1405   // statememt before parsing the body, in order to be able to deduce the type
   1406   // of an auto-typed loop variable.
   1407   StmtResult ForRangeStmt;
   1408   if (ForRange)
   1409     ForRangeStmt = Actions.ActOnCXXForRangeStmt(ForLoc, LParenLoc,
   1410                                                 FirstPart.take(),
   1411                                                 ForRangeInit.ColonLoc,
   1412                                                 ForRangeInit.RangeExpr.get(),
   1413                                                 RParenLoc);
   1414 
   1415   // C99 6.8.5p5 - In C99, the body of the if statement is a scope, even if
   1416   // there is no compound stmt.  C90 does not have this clause.  We only do this
   1417   // if the body isn't a compound statement to avoid push/pop in common cases.
   1418   //
   1419   // C++ 6.5p2:
   1420   // The substatement in an iteration-statement implicitly defines a local scope
   1421   // which is entered and exited each time through the loop.
   1422   //
   1423   // See comments in ParseIfStatement for why we create a scope for
   1424   // for-init-statement/condition and a new scope for substatement in C++.
   1425   //
   1426   ParseScope InnerScope(this, Scope::DeclScope,
   1427                         C99orCXXorObjC && Tok.isNot(tok::l_brace));
   1428 
   1429   // Read the body statement.
   1430   StmtResult Body(ParseStatement());
   1431 
   1432   // Pop the body scope if needed.
   1433   InnerScope.Exit();
   1434 
   1435   // Leave the for-scope.
   1436   ForScope.Exit();
   1437 
   1438   if (Body.isInvalid())
   1439     return StmtError();
   1440 
   1441   if (ForEach)
   1442     // FIXME: It isn't clear how to communicate the late destruction of
   1443     // C++ temporaries used to create the collection.
   1444     return Actions.ActOnObjCForCollectionStmt(ForLoc, LParenLoc,
   1445                                               FirstPart.take(),
   1446                                               Collection.take(), RParenLoc,
   1447                                               Body.take());
   1448 
   1449   if (ForRange)
   1450     return Actions.FinishCXXForRangeStmt(ForRangeStmt.take(), Body.take());
   1451 
   1452   return Actions.ActOnForStmt(ForLoc, LParenLoc, FirstPart.take(), SecondPart,
   1453                               SecondVar, ThirdPart, RParenLoc, Body.take());
   1454 }
   1455 
   1456 /// ParseGotoStatement
   1457 ///       jump-statement:
   1458 ///         'goto' identifier ';'
   1459 /// [GNU]   'goto' '*' expression ';'
   1460 ///
   1461 /// Note: this lets the caller parse the end ';'.
   1462 ///
   1463 StmtResult Parser::ParseGotoStatement(ParsedAttributes &attrs) {
   1464   // FIXME: Use attributes?
   1465 
   1466   assert(Tok.is(tok::kw_goto) && "Not a goto stmt!");
   1467   SourceLocation GotoLoc = ConsumeToken();  // eat the 'goto'.
   1468 
   1469   StmtResult Res;
   1470   if (Tok.is(tok::identifier)) {
   1471     LabelDecl *LD = Actions.LookupOrCreateLabel(Tok.getIdentifierInfo(),
   1472                                                 Tok.getLocation());
   1473     Res = Actions.ActOnGotoStmt(GotoLoc, Tok.getLocation(), LD);
   1474     ConsumeToken();
   1475   } else if (Tok.is(tok::star)) {
   1476     // GNU indirect goto extension.
   1477     Diag(Tok, diag::ext_gnu_indirect_goto);
   1478     SourceLocation StarLoc = ConsumeToken();
   1479     ExprResult R(ParseExpression());
   1480     if (R.isInvalid()) {  // Skip to the semicolon, but don't consume it.
   1481       SkipUntil(tok::semi, false, true);
   1482       return StmtError();
   1483     }
   1484     Res = Actions.ActOnIndirectGotoStmt(GotoLoc, StarLoc, R.take());
   1485   } else {
   1486     Diag(Tok, diag::err_expected_ident);
   1487     return StmtError();
   1488   }
   1489 
   1490   return move(Res);
   1491 }
   1492 
   1493 /// ParseContinueStatement
   1494 ///       jump-statement:
   1495 ///         'continue' ';'
   1496 ///
   1497 /// Note: this lets the caller parse the end ';'.
   1498 ///
   1499 StmtResult Parser::ParseContinueStatement(ParsedAttributes &attrs) {
   1500   // FIXME: Use attributes?
   1501 
   1502   SourceLocation ContinueLoc = ConsumeToken();  // eat the 'continue'.
   1503   return Actions.ActOnContinueStmt(ContinueLoc, getCurScope());
   1504 }
   1505 
   1506 /// ParseBreakStatement
   1507 ///       jump-statement:
   1508 ///         'break' ';'
   1509 ///
   1510 /// Note: this lets the caller parse the end ';'.
   1511 ///
   1512 StmtResult Parser::ParseBreakStatement(ParsedAttributes &attrs) {
   1513   // FIXME: Use attributes?
   1514 
   1515   SourceLocation BreakLoc = ConsumeToken();  // eat the 'break'.
   1516   return Actions.ActOnBreakStmt(BreakLoc, getCurScope());
   1517 }
   1518 
   1519 /// ParseReturnStatement
   1520 ///       jump-statement:
   1521 ///         'return' expression[opt] ';'
   1522 StmtResult Parser::ParseReturnStatement(ParsedAttributes &attrs) {
   1523   // FIXME: Use attributes?
   1524 
   1525   assert(Tok.is(tok::kw_return) && "Not a return stmt!");
   1526   SourceLocation ReturnLoc = ConsumeToken();  // eat the 'return'.
   1527 
   1528   ExprResult R;
   1529   if (Tok.isNot(tok::semi)) {
   1530     if (Tok.is(tok::code_completion)) {
   1531       Actions.CodeCompleteReturn(getCurScope());
   1532       ConsumeCodeCompletionToken();
   1533       SkipUntil(tok::semi, false, true);
   1534       return StmtError();
   1535     }
   1536 
   1537     // FIXME: This is a hack to allow something like C++0x's generalized
   1538     // initializer lists, but only enough of this feature to allow Clang to
   1539     // parse libstdc++ 4.5's headers.
   1540     if (Tok.is(tok::l_brace) && getLang().CPlusPlus) {
   1541       R = ParseInitializer();
   1542       if (R.isUsable() && !getLang().CPlusPlus0x)
   1543         Diag(R.get()->getLocStart(), diag::ext_generalized_initializer_lists)
   1544           << R.get()->getSourceRange();
   1545     } else
   1546         R = ParseExpression();
   1547     if (R.isInvalid()) {  // Skip to the semicolon, but don't consume it.
   1548       SkipUntil(tok::semi, false, true);
   1549       return StmtError();
   1550     }
   1551   }
   1552   return Actions.ActOnReturnStmt(ReturnLoc, R.take());
   1553 }
   1554 
   1555 /// FuzzyParseMicrosoftAsmStatement. When -fms-extensions is enabled, this
   1556 /// routine is called to skip/ignore tokens that comprise the MS asm statement.
   1557 StmtResult Parser::FuzzyParseMicrosoftAsmStatement(SourceLocation AsmLoc) {
   1558   SourceLocation EndLoc;
   1559   if (Tok.is(tok::l_brace)) {
   1560     unsigned short savedBraceCount = BraceCount;
   1561     do {
   1562       EndLoc = Tok.getLocation();
   1563       ConsumeAnyToken();
   1564     } while (BraceCount > savedBraceCount && Tok.isNot(tok::eof));
   1565   } else {
   1566     // From the MS website: If used without braces, the __asm keyword means
   1567     // that the rest of the line is an assembly-language statement.
   1568     SourceManager &SrcMgr = PP.getSourceManager();
   1569     SourceLocation TokLoc = Tok.getLocation();
   1570     unsigned LineNo = SrcMgr.getInstantiationLineNumber(TokLoc);
   1571     do {
   1572       EndLoc = TokLoc;
   1573       ConsumeAnyToken();
   1574       TokLoc = Tok.getLocation();
   1575     } while ((SrcMgr.getInstantiationLineNumber(TokLoc) == LineNo) &&
   1576              Tok.isNot(tok::r_brace) && Tok.isNot(tok::semi) &&
   1577              Tok.isNot(tok::eof));
   1578   }
   1579   Token t;
   1580   t.setKind(tok::string_literal);
   1581   t.setLiteralData("\"/*FIXME: not done*/\"");
   1582   t.clearFlag(Token::NeedsCleaning);
   1583   t.setLength(21);
   1584   ExprResult AsmString(Actions.ActOnStringLiteral(&t, 1));
   1585   ExprVector Constraints(Actions);
   1586   ExprVector Exprs(Actions);
   1587   ExprVector Clobbers(Actions);
   1588   return Actions.ActOnAsmStmt(AsmLoc, true, true, 0, 0, 0,
   1589                               move_arg(Constraints), move_arg(Exprs),
   1590                               AsmString.take(), move_arg(Clobbers),
   1591                               EndLoc, true);
   1592 }
   1593 
   1594 /// ParseAsmStatement - Parse a GNU extended asm statement.
   1595 ///       asm-statement:
   1596 ///         gnu-asm-statement
   1597 ///         ms-asm-statement
   1598 ///
   1599 /// [GNU] gnu-asm-statement:
   1600 ///         'asm' type-qualifier[opt] '(' asm-argument ')' ';'
   1601 ///
   1602 /// [GNU] asm-argument:
   1603 ///         asm-string-literal
   1604 ///         asm-string-literal ':' asm-operands[opt]
   1605 ///         asm-string-literal ':' asm-operands[opt] ':' asm-operands[opt]
   1606 ///         asm-string-literal ':' asm-operands[opt] ':' asm-operands[opt]
   1607 ///                 ':' asm-clobbers
   1608 ///
   1609 /// [GNU] asm-clobbers:
   1610 ///         asm-string-literal
   1611 ///         asm-clobbers ',' asm-string-literal
   1612 ///
   1613 /// [MS]  ms-asm-statement:
   1614 ///         '__asm' assembly-instruction ';'[opt]
   1615 ///         '__asm' '{' assembly-instruction-list '}' ';'[opt]
   1616 ///
   1617 /// [MS]  assembly-instruction-list:
   1618 ///         assembly-instruction ';'[opt]
   1619 ///         assembly-instruction-list ';' assembly-instruction ';'[opt]
   1620 ///
   1621 StmtResult Parser::ParseAsmStatement(bool &msAsm) {
   1622   assert(Tok.is(tok::kw_asm) && "Not an asm stmt");
   1623   SourceLocation AsmLoc = ConsumeToken();
   1624 
   1625   if (getLang().Microsoft && Tok.isNot(tok::l_paren) && !isTypeQualifier()) {
   1626     msAsm = true;
   1627     return FuzzyParseMicrosoftAsmStatement(AsmLoc);
   1628   }
   1629   DeclSpec DS(AttrFactory);
   1630   SourceLocation Loc = Tok.getLocation();
   1631   ParseTypeQualifierListOpt(DS, true, false);
   1632 
   1633   // GNU asms accept, but warn, about type-qualifiers other than volatile.
   1634   if (DS.getTypeQualifiers() & DeclSpec::TQ_const)
   1635     Diag(Loc, diag::w_asm_qualifier_ignored) << "const";
   1636   if (DS.getTypeQualifiers() & DeclSpec::TQ_restrict)
   1637     Diag(Loc, diag::w_asm_qualifier_ignored) << "restrict";
   1638 
   1639   // Remember if this was a volatile asm.
   1640   bool isVolatile = DS.getTypeQualifiers() & DeclSpec::TQ_volatile;
   1641   if (Tok.isNot(tok::l_paren)) {
   1642     Diag(Tok, diag::err_expected_lparen_after) << "asm";
   1643     SkipUntil(tok::r_paren);
   1644     return StmtError();
   1645   }
   1646   Loc = ConsumeParen();
   1647 
   1648   ExprResult AsmString(ParseAsmStringLiteral());
   1649   if (AsmString.isInvalid())
   1650     return StmtError();
   1651 
   1652   llvm::SmallVector<IdentifierInfo *, 4> Names;
   1653   ExprVector Constraints(Actions);
   1654   ExprVector Exprs(Actions);
   1655   ExprVector Clobbers(Actions);
   1656 
   1657   if (Tok.is(tok::r_paren)) {
   1658     // We have a simple asm expression like 'asm("foo")'.
   1659     SourceLocation RParenLoc = ConsumeParen();
   1660     return Actions.ActOnAsmStmt(AsmLoc, /*isSimple*/ true, isVolatile,
   1661                                 /*NumOutputs*/ 0, /*NumInputs*/ 0, 0,
   1662                                 move_arg(Constraints), move_arg(Exprs),
   1663                                 AsmString.take(), move_arg(Clobbers),
   1664                                 RParenLoc);
   1665   }
   1666 
   1667   // Parse Outputs, if present.
   1668   bool AteExtraColon = false;
   1669   if (Tok.is(tok::colon) || Tok.is(tok::coloncolon)) {
   1670     // In C++ mode, parse "::" like ": :".
   1671     AteExtraColon = Tok.is(tok::coloncolon);
   1672     ConsumeToken();
   1673 
   1674     if (!AteExtraColon &&
   1675         ParseAsmOperandsOpt(Names, Constraints, Exprs))
   1676       return StmtError();
   1677   }
   1678 
   1679   unsigned NumOutputs = Names.size();
   1680 
   1681   // Parse Inputs, if present.
   1682   if (AteExtraColon ||
   1683       Tok.is(tok::colon) || Tok.is(tok::coloncolon)) {
   1684     // In C++ mode, parse "::" like ": :".
   1685     if (AteExtraColon)
   1686       AteExtraColon = false;
   1687     else {
   1688       AteExtraColon = Tok.is(tok::coloncolon);
   1689       ConsumeToken();
   1690     }
   1691 
   1692     if (!AteExtraColon &&
   1693         ParseAsmOperandsOpt(Names, Constraints, Exprs))
   1694       return StmtError();
   1695   }
   1696 
   1697   assert(Names.size() == Constraints.size() &&
   1698          Constraints.size() == Exprs.size() &&
   1699          "Input operand size mismatch!");
   1700 
   1701   unsigned NumInputs = Names.size() - NumOutputs;
   1702 
   1703   // Parse the clobbers, if present.
   1704   if (AteExtraColon || Tok.is(tok::colon)) {
   1705     if (!AteExtraColon)
   1706       ConsumeToken();
   1707 
   1708     // Parse the asm-string list for clobbers if present.
   1709     if (Tok.isNot(tok::r_paren)) {
   1710       while (1) {
   1711         ExprResult Clobber(ParseAsmStringLiteral());
   1712 
   1713         if (Clobber.isInvalid())
   1714           break;
   1715 
   1716         Clobbers.push_back(Clobber.release());
   1717 
   1718         if (Tok.isNot(tok::comma)) break;
   1719         ConsumeToken();
   1720       }
   1721     }
   1722   }
   1723 
   1724   SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, Loc);
   1725   return Actions.ActOnAsmStmt(AsmLoc, false, isVolatile,
   1726                               NumOutputs, NumInputs, Names.data(),
   1727                               move_arg(Constraints), move_arg(Exprs),
   1728                               AsmString.take(), move_arg(Clobbers),
   1729                               RParenLoc);
   1730 }
   1731 
   1732 /// ParseAsmOperands - Parse the asm-operands production as used by
   1733 /// asm-statement, assuming the leading ':' token was eaten.
   1734 ///
   1735 /// [GNU] asm-operands:
   1736 ///         asm-operand
   1737 ///         asm-operands ',' asm-operand
   1738 ///
   1739 /// [GNU] asm-operand:
   1740 ///         asm-string-literal '(' expression ')'
   1741 ///         '[' identifier ']' asm-string-literal '(' expression ')'
   1742 ///
   1743 //
   1744 // FIXME: Avoid unnecessary std::string trashing.
   1745 bool Parser::ParseAsmOperandsOpt(llvm::SmallVectorImpl<IdentifierInfo *> &Names,
   1746                                  llvm::SmallVectorImpl<ExprTy *> &Constraints,
   1747                                  llvm::SmallVectorImpl<ExprTy *> &Exprs) {
   1748   // 'asm-operands' isn't present?
   1749   if (!isTokenStringLiteral() && Tok.isNot(tok::l_square))
   1750     return false;
   1751 
   1752   while (1) {
   1753     // Read the [id] if present.
   1754     if (Tok.is(tok::l_square)) {
   1755       SourceLocation Loc = ConsumeBracket();
   1756 
   1757       if (Tok.isNot(tok::identifier)) {
   1758         Diag(Tok, diag::err_expected_ident);
   1759         SkipUntil(tok::r_paren);
   1760         return true;
   1761       }
   1762 
   1763       IdentifierInfo *II = Tok.getIdentifierInfo();
   1764       ConsumeToken();
   1765 
   1766       Names.push_back(II);
   1767       MatchRHSPunctuation(tok::r_square, Loc);
   1768     } else
   1769       Names.push_back(0);
   1770 
   1771     ExprResult Constraint(ParseAsmStringLiteral());
   1772     if (Constraint.isInvalid()) {
   1773         SkipUntil(tok::r_paren);
   1774         return true;
   1775     }
   1776     Constraints.push_back(Constraint.release());
   1777 
   1778     if (Tok.isNot(tok::l_paren)) {
   1779       Diag(Tok, diag::err_expected_lparen_after) << "asm operand";
   1780       SkipUntil(tok::r_paren);
   1781       return true;
   1782     }
   1783 
   1784     // Read the parenthesized expression.
   1785     SourceLocation OpenLoc = ConsumeParen();
   1786     ExprResult Res(ParseExpression());
   1787     MatchRHSPunctuation(tok::r_paren, OpenLoc);
   1788     if (Res.isInvalid()) {
   1789       SkipUntil(tok::r_paren);
   1790       return true;
   1791     }
   1792     Exprs.push_back(Res.release());
   1793     // Eat the comma and continue parsing if it exists.
   1794     if (Tok.isNot(tok::comma)) return false;
   1795     ConsumeToken();
   1796   }
   1797 
   1798   return true;
   1799 }
   1800 
   1801 Decl *Parser::ParseFunctionStatementBody(Decl *Decl, ParseScope &BodyScope) {
   1802   assert(Tok.is(tok::l_brace));
   1803   SourceLocation LBraceLoc = Tok.getLocation();
   1804 
   1805   if (PP.isCodeCompletionEnabled()) {
   1806     if (trySkippingFunctionBodyForCodeCompletion()) {
   1807       BodyScope.Exit();
   1808       return Actions.ActOnFinishFunctionBody(Decl, 0);
   1809     }
   1810   }
   1811 
   1812   PrettyDeclStackTraceEntry CrashInfo(Actions, Decl, LBraceLoc,
   1813                                       "parsing function body");
   1814 
   1815   // Do not enter a scope for the brace, as the arguments are in the same scope
   1816   // (the function body) as the body itself.  Instead, just read the statement
   1817   // list and put it into a CompoundStmt for safe keeping.
   1818   StmtResult FnBody(ParseCompoundStatementBody());
   1819 
   1820   // If the function body could not be parsed, make a bogus compoundstmt.
   1821   if (FnBody.isInvalid())
   1822     FnBody = Actions.ActOnCompoundStmt(LBraceLoc, LBraceLoc,
   1823                                        MultiStmtArg(Actions), false);
   1824 
   1825   BodyScope.Exit();
   1826   return Actions.ActOnFinishFunctionBody(Decl, FnBody.take());
   1827 }
   1828 
   1829 /// ParseFunctionTryBlock - Parse a C++ function-try-block.
   1830 ///
   1831 ///       function-try-block:
   1832 ///         'try' ctor-initializer[opt] compound-statement handler-seq
   1833 ///
   1834 Decl *Parser::ParseFunctionTryBlock(Decl *Decl, ParseScope &BodyScope) {
   1835   assert(Tok.is(tok::kw_try) && "Expected 'try'");
   1836   SourceLocation TryLoc = ConsumeToken();
   1837 
   1838   PrettyDeclStackTraceEntry CrashInfo(Actions, Decl, TryLoc,
   1839                                       "parsing function try block");
   1840 
   1841   // Constructor initializer list?
   1842   if (Tok.is(tok::colon))
   1843     ParseConstructorInitializer(Decl);
   1844 
   1845   if (PP.isCodeCompletionEnabled()) {
   1846     if (trySkippingFunctionBodyForCodeCompletion()) {
   1847       BodyScope.Exit();
   1848       return Actions.ActOnFinishFunctionBody(Decl, 0);
   1849     }
   1850   }
   1851 
   1852   SourceLocation LBraceLoc = Tok.getLocation();
   1853   StmtResult FnBody(ParseCXXTryBlockCommon(TryLoc));
   1854   // If we failed to parse the try-catch, we just give the function an empty
   1855   // compound statement as the body.
   1856   if (FnBody.isInvalid())
   1857     FnBody = Actions.ActOnCompoundStmt(LBraceLoc, LBraceLoc,
   1858                                        MultiStmtArg(Actions), false);
   1859 
   1860   BodyScope.Exit();
   1861   return Actions.ActOnFinishFunctionBody(Decl, FnBody.take());
   1862 }
   1863 
   1864 bool Parser::trySkippingFunctionBodyForCodeCompletion() {
   1865   assert(Tok.is(tok::l_brace));
   1866   assert(PP.isCodeCompletionEnabled() &&
   1867          "Should only be called when in code-completion mode");
   1868 
   1869   // We're in code-completion mode. Skip parsing for all function bodies unless
   1870   // the body contains the code-completion point.
   1871   TentativeParsingAction PA(*this);
   1872   ConsumeBrace();
   1873   if (SkipUntil(tok::r_brace, /*StopAtSemi=*/false, /*DontConsume=*/false,
   1874                 /*StopAtCodeCompletion=*/true)) {
   1875     PA.Commit();
   1876     return true;
   1877   }
   1878 
   1879   PA.Revert();
   1880   return false;
   1881 }
   1882 
   1883 /// ParseCXXTryBlock - Parse a C++ try-block.
   1884 ///
   1885 ///       try-block:
   1886 ///         'try' compound-statement handler-seq
   1887 ///
   1888 StmtResult Parser::ParseCXXTryBlock(ParsedAttributes &attrs) {
   1889   // FIXME: Add attributes?
   1890 
   1891   assert(Tok.is(tok::kw_try) && "Expected 'try'");
   1892 
   1893   SourceLocation TryLoc = ConsumeToken();
   1894   return ParseCXXTryBlockCommon(TryLoc);
   1895 }
   1896 
   1897 /// ParseCXXTryBlockCommon - Parse the common part of try-block and
   1898 /// function-try-block.
   1899 ///
   1900 ///       try-block:
   1901 ///         'try' compound-statement handler-seq
   1902 ///
   1903 ///       function-try-block:
   1904 ///         'try' ctor-initializer[opt] compound-statement handler-seq
   1905 ///
   1906 ///       handler-seq:
   1907 ///         handler handler-seq[opt]
   1908 ///
   1909 ///       [Borland] try-block:
   1910 ///         'try' compound-statement seh-except-block
   1911 ///         'try' compound-statment  seh-finally-block
   1912 ///
   1913 StmtResult Parser::ParseCXXTryBlockCommon(SourceLocation TryLoc) {
   1914   if (Tok.isNot(tok::l_brace))
   1915     return StmtError(Diag(Tok, diag::err_expected_lbrace));
   1916   // FIXME: Possible draft standard bug: attribute-specifier should be allowed?
   1917   ParsedAttributesWithRange attrs(AttrFactory);
   1918   StmtResult TryBlock(ParseCompoundStatement(attrs, /*isStmtExpr=*/false,
   1919                                              Scope::DeclScope|Scope::TryScope));
   1920   if (TryBlock.isInvalid())
   1921     return move(TryBlock);
   1922 
   1923   // Borland allows SEH-handlers with 'try'
   1924   if(Tok.is(tok::kw___except) || Tok.is(tok::kw___finally)) {
   1925     // TODO: Factor into common return ParseSEHHandlerCommon(...)
   1926     StmtResult Handler;
   1927     if(Tok.is(tok::kw___except)) {
   1928       SourceLocation Loc = ConsumeToken();
   1929       Handler = ParseSEHExceptBlock(Loc);
   1930     }
   1931     else {
   1932       SourceLocation Loc = ConsumeToken();
   1933       Handler = ParseSEHFinallyBlock(Loc);
   1934     }
   1935     if(Handler.isInvalid())
   1936       return move(Handler);
   1937 
   1938     return Actions.ActOnSEHTryBlock(true /* IsCXXTry */,
   1939                                     TryLoc,
   1940                                     TryBlock.take(),
   1941                                     Handler.take());
   1942   }
   1943   else {
   1944     StmtVector Handlers(Actions);
   1945     MaybeParseCXX0XAttributes(attrs);
   1946     ProhibitAttributes(attrs);
   1947 
   1948     if (Tok.isNot(tok::kw_catch))
   1949       return StmtError(Diag(Tok, diag::err_expected_catch));
   1950     while (Tok.is(tok::kw_catch)) {
   1951       StmtResult Handler(ParseCXXCatchBlock());
   1952       if (!Handler.isInvalid())
   1953         Handlers.push_back(Handler.release());
   1954     }
   1955     // Don't bother creating the full statement if we don't have any usable
   1956     // handlers.
   1957     if (Handlers.empty())
   1958       return StmtError();
   1959 
   1960     return Actions.ActOnCXXTryBlock(TryLoc, TryBlock.take(), move_arg(Handlers));
   1961   }
   1962 }
   1963 
   1964 /// ParseCXXCatchBlock - Parse a C++ catch block, called handler in the standard
   1965 ///
   1966 ///       handler:
   1967 ///         'catch' '(' exception-declaration ')' compound-statement
   1968 ///
   1969 ///       exception-declaration:
   1970 ///         type-specifier-seq declarator
   1971 ///         type-specifier-seq abstract-declarator
   1972 ///         type-specifier-seq
   1973 ///         '...'
   1974 ///
   1975 StmtResult Parser::ParseCXXCatchBlock() {
   1976   assert(Tok.is(tok::kw_catch) && "Expected 'catch'");
   1977 
   1978   SourceLocation CatchLoc = ConsumeToken();
   1979 
   1980   SourceLocation LParenLoc = Tok.getLocation();
   1981   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen))
   1982     return StmtError();
   1983 
   1984   // C++ 3.3.2p3:
   1985   // The name in a catch exception-declaration is local to the handler and
   1986   // shall not be redeclared in the outermost block of the handler.
   1987   ParseScope CatchScope(this, Scope::DeclScope | Scope::ControlScope);
   1988 
   1989   // exception-declaration is equivalent to '...' or a parameter-declaration
   1990   // without default arguments.
   1991   Decl *ExceptionDecl = 0;
   1992   if (Tok.isNot(tok::ellipsis)) {
   1993     DeclSpec DS(AttrFactory);
   1994     if (ParseCXXTypeSpecifierSeq(DS))
   1995       return StmtError();
   1996     Declarator ExDecl(DS, Declarator::CXXCatchContext);
   1997     ParseDeclarator(ExDecl);
   1998     ExceptionDecl = Actions.ActOnExceptionDeclarator(getCurScope(), ExDecl);
   1999   } else
   2000     ConsumeToken();
   2001 
   2002   if (MatchRHSPunctuation(tok::r_paren, LParenLoc).isInvalid())
   2003     return StmtError();
   2004 
   2005   if (Tok.isNot(tok::l_brace))
   2006     return StmtError(Diag(Tok, diag::err_expected_lbrace));
   2007 
   2008   // FIXME: Possible draft standard bug: attribute-specifier should be allowed?
   2009   ParsedAttributes attrs(AttrFactory);
   2010   StmtResult Block(ParseCompoundStatement(attrs));
   2011   if (Block.isInvalid())
   2012     return move(Block);
   2013 
   2014   return Actions.ActOnCXXCatchBlock(CatchLoc, ExceptionDecl, Block.take());
   2015 }
   2016 
   2017 void Parser::ParseMicrosoftIfExistsStatement(StmtVector &Stmts) {
   2018   bool Result;
   2019   if (ParseMicrosoftIfExistsCondition(Result))
   2020     return;
   2021 
   2022   if (Tok.isNot(tok::l_brace)) {
   2023     Diag(Tok, diag::err_expected_lbrace);
   2024     return;
   2025   }
   2026   ConsumeBrace();
   2027 
   2028   // Condition is false skip all inside the {}.
   2029   if (!Result) {
   2030     SkipUntil(tok::r_brace, false);
   2031     return;
   2032   }
   2033 
   2034   // Condition is true, parse the statements.
   2035   while (Tok.isNot(tok::r_brace)) {
   2036     StmtResult R = ParseStatementOrDeclaration(Stmts, false);
   2037     if (R.isUsable())
   2038       Stmts.push_back(R.release());
   2039   }
   2040 
   2041   if (Tok.isNot(tok::r_brace)) {
   2042     Diag(Tok, diag::err_expected_rbrace);
   2043     return;
   2044   }
   2045   ConsumeBrace();
   2046 }
   2047