Home | History | Annotate | Download | only in Parse
      1 //===--- ParseExpr.cpp - Expression Parsing -------------------------------===//
      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 Expression parsing implementation.  Expressions in
     11 // C99 basically consist of a bunch of binary operators with unary operators and
     12 // other random stuff at the leaves.
     13 //
     14 // In the C99 grammar, these unary operators bind tightest and are represented
     15 // as the 'cast-expression' production.  Everything else is either a binary
     16 // operator (e.g. '/') or a ternary operator ("?:").  The unary leaves are
     17 // handled by ParseCastExpression, the higher level pieces are handled by
     18 // ParseBinaryExpression.
     19 //
     20 //===----------------------------------------------------------------------===//
     21 
     22 #include "clang/Parse/Parser.h"
     23 #include "clang/Sema/DeclSpec.h"
     24 #include "clang/Sema/Scope.h"
     25 #include "clang/Sema/ParsedTemplate.h"
     26 #include "clang/Basic/PrettyStackTrace.h"
     27 #include "RAIIObjectsForParser.h"
     28 #include "llvm/ADT/SmallVector.h"
     29 #include "llvm/ADT/SmallString.h"
     30 using namespace clang;
     31 
     32 /// getBinOpPrecedence - Return the precedence of the specified binary operator
     33 /// token.
     34 static prec::Level getBinOpPrecedence(tok::TokenKind Kind,
     35                                       bool GreaterThanIsOperator,
     36                                       bool CPlusPlus0x) {
     37   switch (Kind) {
     38   case tok::greater:
     39     // C++ [temp.names]p3:
     40     //   [...] When parsing a template-argument-list, the first
     41     //   non-nested > is taken as the ending delimiter rather than a
     42     //   greater-than operator. [...]
     43     if (GreaterThanIsOperator)
     44       return prec::Relational;
     45     return prec::Unknown;
     46 
     47   case tok::greatergreater:
     48     // C++0x [temp.names]p3:
     49     //
     50     //   [...] Similarly, the first non-nested >> is treated as two
     51     //   consecutive but distinct > tokens, the first of which is
     52     //   taken as the end of the template-argument-list and completes
     53     //   the template-id. [...]
     54     if (GreaterThanIsOperator || !CPlusPlus0x)
     55       return prec::Shift;
     56     return prec::Unknown;
     57 
     58   default:                        return prec::Unknown;
     59   case tok::comma:                return prec::Comma;
     60   case tok::equal:
     61   case tok::starequal:
     62   case tok::slashequal:
     63   case tok::percentequal:
     64   case tok::plusequal:
     65   case tok::minusequal:
     66   case tok::lesslessequal:
     67   case tok::greatergreaterequal:
     68   case tok::ampequal:
     69   case tok::caretequal:
     70   case tok::pipeequal:            return prec::Assignment;
     71   case tok::question:             return prec::Conditional;
     72   case tok::pipepipe:             return prec::LogicalOr;
     73   case tok::ampamp:               return prec::LogicalAnd;
     74   case tok::pipe:                 return prec::InclusiveOr;
     75   case tok::caret:                return prec::ExclusiveOr;
     76   case tok::amp:                  return prec::And;
     77   case tok::exclaimequal:
     78   case tok::equalequal:           return prec::Equality;
     79   case tok::lessequal:
     80   case tok::less:
     81   case tok::greaterequal:         return prec::Relational;
     82   case tok::lessless:             return prec::Shift;
     83   case tok::plus:
     84   case tok::minus:                return prec::Additive;
     85   case tok::percent:
     86   case tok::slash:
     87   case tok::star:                 return prec::Multiplicative;
     88   case tok::periodstar:
     89   case tok::arrowstar:            return prec::PointerToMember;
     90   }
     91 }
     92 
     93 
     94 /// ParseExpression - Simple precedence-based parser for binary/ternary
     95 /// operators.
     96 ///
     97 /// Note: we diverge from the C99 grammar when parsing the assignment-expression
     98 /// production.  C99 specifies that the LHS of an assignment operator should be
     99 /// parsed as a unary-expression, but consistency dictates that it be a
    100 /// conditional-expession.  In practice, the important thing here is that the
    101 /// LHS of an assignment has to be an l-value, which productions between
    102 /// unary-expression and conditional-expression don't produce.  Because we want
    103 /// consistency, we parse the LHS as a conditional-expression, then check for
    104 /// l-value-ness in semantic analysis stages.
    105 ///
    106 ///       pm-expression: [C++ 5.5]
    107 ///         cast-expression
    108 ///         pm-expression '.*' cast-expression
    109 ///         pm-expression '->*' cast-expression
    110 ///
    111 ///       multiplicative-expression: [C99 6.5.5]
    112 ///     Note: in C++, apply pm-expression instead of cast-expression
    113 ///         cast-expression
    114 ///         multiplicative-expression '*' cast-expression
    115 ///         multiplicative-expression '/' cast-expression
    116 ///         multiplicative-expression '%' cast-expression
    117 ///
    118 ///       additive-expression: [C99 6.5.6]
    119 ///         multiplicative-expression
    120 ///         additive-expression '+' multiplicative-expression
    121 ///         additive-expression '-' multiplicative-expression
    122 ///
    123 ///       shift-expression: [C99 6.5.7]
    124 ///         additive-expression
    125 ///         shift-expression '<<' additive-expression
    126 ///         shift-expression '>>' additive-expression
    127 ///
    128 ///       relational-expression: [C99 6.5.8]
    129 ///         shift-expression
    130 ///         relational-expression '<' shift-expression
    131 ///         relational-expression '>' shift-expression
    132 ///         relational-expression '<=' shift-expression
    133 ///         relational-expression '>=' shift-expression
    134 ///
    135 ///       equality-expression: [C99 6.5.9]
    136 ///         relational-expression
    137 ///         equality-expression '==' relational-expression
    138 ///         equality-expression '!=' relational-expression
    139 ///
    140 ///       AND-expression: [C99 6.5.10]
    141 ///         equality-expression
    142 ///         AND-expression '&' equality-expression
    143 ///
    144 ///       exclusive-OR-expression: [C99 6.5.11]
    145 ///         AND-expression
    146 ///         exclusive-OR-expression '^' AND-expression
    147 ///
    148 ///       inclusive-OR-expression: [C99 6.5.12]
    149 ///         exclusive-OR-expression
    150 ///         inclusive-OR-expression '|' exclusive-OR-expression
    151 ///
    152 ///       logical-AND-expression: [C99 6.5.13]
    153 ///         inclusive-OR-expression
    154 ///         logical-AND-expression '&&' inclusive-OR-expression
    155 ///
    156 ///       logical-OR-expression: [C99 6.5.14]
    157 ///         logical-AND-expression
    158 ///         logical-OR-expression '||' logical-AND-expression
    159 ///
    160 ///       conditional-expression: [C99 6.5.15]
    161 ///         logical-OR-expression
    162 ///         logical-OR-expression '?' expression ':' conditional-expression
    163 /// [GNU]   logical-OR-expression '?' ':' conditional-expression
    164 /// [C++] the third operand is an assignment-expression
    165 ///
    166 ///       assignment-expression: [C99 6.5.16]
    167 ///         conditional-expression
    168 ///         unary-expression assignment-operator assignment-expression
    169 /// [C++]   throw-expression [C++ 15]
    170 ///
    171 ///       assignment-operator: one of
    172 ///         = *= /= %= += -= <<= >>= &= ^= |=
    173 ///
    174 ///       expression: [C99 6.5.17]
    175 ///         assignment-expression ...[opt]
    176 ///         expression ',' assignment-expression ...[opt]
    177 ExprResult Parser::ParseExpression() {
    178   ExprResult LHS(ParseAssignmentExpression());
    179   return ParseRHSOfBinaryExpression(move(LHS), prec::Comma);
    180 }
    181 
    182 /// This routine is called when the '@' is seen and consumed.
    183 /// Current token is an Identifier and is not a 'try'. This
    184 /// routine is necessary to disambiguate @try-statement from,
    185 /// for example, @encode-expression.
    186 ///
    187 ExprResult
    188 Parser::ParseExpressionWithLeadingAt(SourceLocation AtLoc) {
    189   ExprResult LHS(ParseObjCAtExpression(AtLoc));
    190   return ParseRHSOfBinaryExpression(move(LHS), prec::Comma);
    191 }
    192 
    193 /// This routine is called when a leading '__extension__' is seen and
    194 /// consumed.  This is necessary because the token gets consumed in the
    195 /// process of disambiguating between an expression and a declaration.
    196 ExprResult
    197 Parser::ParseExpressionWithLeadingExtension(SourceLocation ExtLoc) {
    198   ExprResult LHS(true);
    199   {
    200     // Silence extension warnings in the sub-expression
    201     ExtensionRAIIObject O(Diags);
    202 
    203     LHS = ParseCastExpression(false);
    204   }
    205 
    206   if (!LHS.isInvalid())
    207     LHS = Actions.ActOnUnaryOp(getCurScope(), ExtLoc, tok::kw___extension__,
    208                                LHS.take());
    209 
    210   return ParseRHSOfBinaryExpression(move(LHS), prec::Comma);
    211 }
    212 
    213 /// ParseAssignmentExpression - Parse an expr that doesn't include commas.
    214 ExprResult Parser::ParseAssignmentExpression() {
    215   if (Tok.is(tok::code_completion)) {
    216     Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Expression);
    217     ConsumeCodeCompletionToken();
    218   }
    219 
    220   if (Tok.is(tok::kw_throw))
    221     return ParseThrowExpression();
    222 
    223   ExprResult LHS = ParseCastExpression(/*isUnaryExpression=*/false);
    224   return ParseRHSOfBinaryExpression(move(LHS), prec::Assignment);
    225 }
    226 
    227 /// ParseAssignmentExprWithObjCMessageExprStart - Parse an assignment expression
    228 /// where part of an objc message send has already been parsed.  In this case
    229 /// LBracLoc indicates the location of the '[' of the message send, and either
    230 /// ReceiverName or ReceiverExpr is non-null indicating the receiver of the
    231 /// message.
    232 ///
    233 /// Since this handles full assignment-expression's, it handles postfix
    234 /// expressions and other binary operators for these expressions as well.
    235 ExprResult
    236 Parser::ParseAssignmentExprWithObjCMessageExprStart(SourceLocation LBracLoc,
    237                                                     SourceLocation SuperLoc,
    238                                                     ParsedType ReceiverType,
    239                                                     Expr *ReceiverExpr) {
    240   ExprResult R
    241     = ParseObjCMessageExpressionBody(LBracLoc, SuperLoc,
    242                                      ReceiverType, ReceiverExpr);
    243   R = ParsePostfixExpressionSuffix(R);
    244   return ParseRHSOfBinaryExpression(R, prec::Assignment);
    245 }
    246 
    247 
    248 ExprResult Parser::ParseConstantExpression() {
    249   // C++ [basic.def.odr]p2:
    250   //   An expression is potentially evaluated unless it appears where an
    251   //   integral constant expression is required (see 5.19) [...].
    252   EnterExpressionEvaluationContext Unevaluated(Actions,
    253                                                Sema::Unevaluated);
    254 
    255   ExprResult LHS(ParseCastExpression(false));
    256   return ParseRHSOfBinaryExpression(LHS, prec::Conditional);
    257 }
    258 
    259 /// ParseRHSOfBinaryExpression - Parse a binary expression that starts with
    260 /// LHS and has a precedence of at least MinPrec.
    261 ExprResult
    262 Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) {
    263   prec::Level NextTokPrec = getBinOpPrecedence(Tok.getKind(),
    264                                                GreaterThanIsOperator,
    265                                                getLang().CPlusPlus0x);
    266   SourceLocation ColonLoc;
    267 
    268   while (1) {
    269     // If this token has a lower precedence than we are allowed to parse (e.g.
    270     // because we are called recursively, or because the token is not a binop),
    271     // then we are done!
    272     if (NextTokPrec < MinPrec)
    273       return move(LHS);
    274 
    275     // Consume the operator, saving the operator token for error reporting.
    276     Token OpToken = Tok;
    277     ConsumeToken();
    278 
    279     // Special case handling for the ternary operator.
    280     ExprResult TernaryMiddle(true);
    281     if (NextTokPrec == prec::Conditional) {
    282       if (Tok.isNot(tok::colon)) {
    283         // Don't parse FOO:BAR as if it were a typo for FOO::BAR.
    284         ColonProtectionRAIIObject X(*this);
    285 
    286         // Handle this production specially:
    287         //   logical-OR-expression '?' expression ':' conditional-expression
    288         // In particular, the RHS of the '?' is 'expression', not
    289         // 'logical-OR-expression' as we might expect.
    290         TernaryMiddle = ParseExpression();
    291         if (TernaryMiddle.isInvalid()) {
    292           LHS = ExprError();
    293           TernaryMiddle = 0;
    294         }
    295       } else {
    296         // Special case handling of "X ? Y : Z" where Y is empty:
    297         //   logical-OR-expression '?' ':' conditional-expression   [GNU]
    298         TernaryMiddle = 0;
    299         Diag(Tok, diag::ext_gnu_conditional_expr);
    300       }
    301 
    302       if (Tok.is(tok::colon)) {
    303         // Eat the colon.
    304         ColonLoc = ConsumeToken();
    305       } else {
    306         // Otherwise, we're missing a ':'.  Assume that this was a typo that the
    307         // user forgot.  If we're not in a macro instantiation, we can suggest a
    308         // fixit hint.  If there were two spaces before the current token,
    309         // suggest inserting the colon in between them, otherwise insert ": ".
    310         SourceLocation FILoc = Tok.getLocation();
    311         const char *FIText = ": ";
    312         const SourceManager &SM = PP.getSourceManager();
    313         if (FILoc.isFileID() || PP.isAtStartOfMacroExpansion(FILoc)) {
    314           FILoc = SM.getInstantiationLoc(FILoc);
    315           bool IsInvalid = false;
    316           const char *SourcePtr =
    317             SM.getCharacterData(FILoc.getFileLocWithOffset(-1), &IsInvalid);
    318           if (!IsInvalid && *SourcePtr == ' ') {
    319             SourcePtr =
    320               SM.getCharacterData(FILoc.getFileLocWithOffset(-2), &IsInvalid);
    321             if (!IsInvalid && *SourcePtr == ' ') {
    322               FILoc = FILoc.getFileLocWithOffset(-1);
    323               FIText = ":";
    324             }
    325           }
    326         }
    327 
    328         Diag(Tok, diag::err_expected_colon)
    329           << FixItHint::CreateInsertion(FILoc, FIText);
    330         Diag(OpToken, diag::note_matching) << "?";
    331         ColonLoc = Tok.getLocation();
    332       }
    333     }
    334 
    335     // Code completion for the right-hand side of an assignment expression
    336     // goes through a special hook that takes the left-hand side into account.
    337     if (Tok.is(tok::code_completion) && NextTokPrec == prec::Assignment) {
    338       Actions.CodeCompleteAssignmentRHS(getCurScope(), LHS.get());
    339       ConsumeCodeCompletionToken();
    340       return ExprError();
    341     }
    342 
    343     // Parse another leaf here for the RHS of the operator.
    344     // ParseCastExpression works here because all RHS expressions in C have it
    345     // as a prefix, at least. However, in C++, an assignment-expression could
    346     // be a throw-expression, which is not a valid cast-expression.
    347     // Therefore we need some special-casing here.
    348     // Also note that the third operand of the conditional operator is
    349     // an assignment-expression in C++.
    350     ExprResult RHS;
    351     if (getLang().CPlusPlus && NextTokPrec <= prec::Conditional)
    352       RHS = ParseAssignmentExpression();
    353     else
    354       RHS = ParseCastExpression(false);
    355 
    356     if (RHS.isInvalid())
    357       LHS = ExprError();
    358 
    359     // Remember the precedence of this operator and get the precedence of the
    360     // operator immediately to the right of the RHS.
    361     prec::Level ThisPrec = NextTokPrec;
    362     NextTokPrec = getBinOpPrecedence(Tok.getKind(), GreaterThanIsOperator,
    363                                      getLang().CPlusPlus0x);
    364 
    365     // Assignment and conditional expressions are right-associative.
    366     bool isRightAssoc = ThisPrec == prec::Conditional ||
    367                         ThisPrec == prec::Assignment;
    368 
    369     // Get the precedence of the operator to the right of the RHS.  If it binds
    370     // more tightly with RHS than we do, evaluate it completely first.
    371     if (ThisPrec < NextTokPrec ||
    372         (ThisPrec == NextTokPrec && isRightAssoc)) {
    373       // If this is left-associative, only parse things on the RHS that bind
    374       // more tightly than the current operator.  If it is left-associative, it
    375       // is okay, to bind exactly as tightly.  For example, compile A=B=C=D as
    376       // A=(B=(C=D)), where each paren is a level of recursion here.
    377       // The function takes ownership of the RHS.
    378       RHS = ParseRHSOfBinaryExpression(RHS,
    379                             static_cast<prec::Level>(ThisPrec + !isRightAssoc));
    380 
    381       if (RHS.isInvalid())
    382         LHS = ExprError();
    383 
    384       NextTokPrec = getBinOpPrecedence(Tok.getKind(), GreaterThanIsOperator,
    385                                        getLang().CPlusPlus0x);
    386     }
    387     assert(NextTokPrec <= ThisPrec && "Recursion didn't work!");
    388 
    389     if (!LHS.isInvalid()) {
    390       // Combine the LHS and RHS into the LHS (e.g. build AST).
    391       if (TernaryMiddle.isInvalid()) {
    392         // If we're using '>>' as an operator within a template
    393         // argument list (in C++98), suggest the addition of
    394         // parentheses so that the code remains well-formed in C++0x.
    395         if (!GreaterThanIsOperator && OpToken.is(tok::greatergreater))
    396           SuggestParentheses(OpToken.getLocation(),
    397                              diag::warn_cxx0x_right_shift_in_template_arg,
    398                          SourceRange(Actions.getExprRange(LHS.get()).getBegin(),
    399                                      Actions.getExprRange(RHS.get()).getEnd()));
    400 
    401         LHS = Actions.ActOnBinOp(getCurScope(), OpToken.getLocation(),
    402                                  OpToken.getKind(), LHS.take(), RHS.take());
    403       } else
    404         LHS = Actions.ActOnConditionalOp(OpToken.getLocation(), ColonLoc,
    405                                          LHS.take(), TernaryMiddle.take(),
    406                                          RHS.take());
    407     }
    408   }
    409 }
    410 
    411 /// ParseCastExpression - Parse a cast-expression, or, if isUnaryExpression is
    412 /// true, parse a unary-expression. isAddressOfOperand exists because an
    413 /// id-expression that is the operand of address-of gets special treatment
    414 /// due to member pointers.
    415 ///
    416 ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
    417                                        bool isAddressOfOperand,
    418                                        bool isTypeCast) {
    419   bool NotCastExpr;
    420   ExprResult Res = ParseCastExpression(isUnaryExpression,
    421                                        isAddressOfOperand,
    422                                        NotCastExpr,
    423                                        isTypeCast);
    424   if (NotCastExpr)
    425     Diag(Tok, diag::err_expected_expression);
    426   return move(Res);
    427 }
    428 
    429 /// ParseCastExpression - Parse a cast-expression, or, if isUnaryExpression is
    430 /// true, parse a unary-expression. isAddressOfOperand exists because an
    431 /// id-expression that is the operand of address-of gets special treatment
    432 /// due to member pointers. NotCastExpr is set to true if the token is not the
    433 /// start of a cast-expression, and no diagnostic is emitted in this case.
    434 ///
    435 ///       cast-expression: [C99 6.5.4]
    436 ///         unary-expression
    437 ///         '(' type-name ')' cast-expression
    438 ///
    439 ///       unary-expression:  [C99 6.5.3]
    440 ///         postfix-expression
    441 ///         '++' unary-expression
    442 ///         '--' unary-expression
    443 ///         unary-operator cast-expression
    444 ///         'sizeof' unary-expression
    445 ///         'sizeof' '(' type-name ')'
    446 /// [C++0x] 'sizeof' '...' '(' identifier ')'
    447 /// [GNU]   '__alignof' unary-expression
    448 /// [GNU]   '__alignof' '(' type-name ')'
    449 /// [C++0x] 'alignof' '(' type-id ')'
    450 /// [GNU]   '&&' identifier
    451 /// [C++]   new-expression
    452 /// [C++]   delete-expression
    453 /// [C++0x] 'noexcept' '(' expression ')'
    454 ///
    455 ///       unary-operator: one of
    456 ///         '&'  '*'  '+'  '-'  '~'  '!'
    457 /// [GNU]   '__extension__'  '__real'  '__imag'
    458 ///
    459 ///       primary-expression: [C99 6.5.1]
    460 /// [C99]   identifier
    461 /// [C++]   id-expression
    462 ///         constant
    463 ///         string-literal
    464 /// [C++]   boolean-literal  [C++ 2.13.5]
    465 /// [C++0x] 'nullptr'        [C++0x 2.14.7]
    466 ///         '(' expression ')'
    467 /// [C1X]   generic-selection
    468 ///         '__func__'        [C99 6.4.2.2]
    469 /// [GNU]   '__FUNCTION__'
    470 /// [GNU]   '__PRETTY_FUNCTION__'
    471 /// [GNU]   '(' compound-statement ')'
    472 /// [GNU]   '__builtin_va_arg' '(' assignment-expression ',' type-name ')'
    473 /// [GNU]   '__builtin_offsetof' '(' type-name ',' offsetof-member-designator')'
    474 /// [GNU]   '__builtin_choose_expr' '(' assign-expr ',' assign-expr ','
    475 ///                                     assign-expr ')'
    476 /// [GNU]   '__builtin_types_compatible_p' '(' type-name ',' type-name ')'
    477 /// [GNU]   '__null'
    478 /// [OBJC]  '[' objc-message-expr ']'
    479 /// [OBJC]  '@selector' '(' objc-selector-arg ')'
    480 /// [OBJC]  '@protocol' '(' identifier ')'
    481 /// [OBJC]  '@encode' '(' type-name ')'
    482 /// [OBJC]  objc-string-literal
    483 /// [C++]   simple-type-specifier '(' expression-list[opt] ')'      [C++ 5.2.3]
    484 /// [C++0x] simple-type-specifier braced-init-list                  [C++ 5.2.3]
    485 /// [C++]   typename-specifier '(' expression-list[opt] ')'         [C++ 5.2.3]
    486 /// [C++0x] typename-specifier braced-init-list                     [C++ 5.2.3]
    487 /// [C++]   'const_cast' '<' type-name '>' '(' expression ')'       [C++ 5.2p1]
    488 /// [C++]   'dynamic_cast' '<' type-name '>' '(' expression ')'     [C++ 5.2p1]
    489 /// [C++]   'reinterpret_cast' '<' type-name '>' '(' expression ')' [C++ 5.2p1]
    490 /// [C++]   'static_cast' '<' type-name '>' '(' expression ')'      [C++ 5.2p1]
    491 /// [C++]   'typeid' '(' expression ')'                             [C++ 5.2p1]
    492 /// [C++]   'typeid' '(' type-id ')'                                [C++ 5.2p1]
    493 /// [C++]   'this'          [C++ 9.3.2]
    494 /// [G++]   unary-type-trait '(' type-id ')'
    495 /// [G++]   binary-type-trait '(' type-id ',' type-id ')'           [TODO]
    496 /// [EMBT]  array-type-trait '(' type-id ',' integer ')'
    497 /// [clang] '^' block-literal
    498 ///
    499 ///       constant: [C99 6.4.4]
    500 ///         integer-constant
    501 ///         floating-constant
    502 ///         enumeration-constant -> identifier
    503 ///         character-constant
    504 ///
    505 ///       id-expression: [C++ 5.1]
    506 ///                   unqualified-id
    507 ///                   qualified-id
    508 ///
    509 ///       unqualified-id: [C++ 5.1]
    510 ///                   identifier
    511 ///                   operator-function-id
    512 ///                   conversion-function-id
    513 ///                   '~' class-name
    514 ///                   template-id
    515 ///
    516 ///       new-expression: [C++ 5.3.4]
    517 ///                   '::'[opt] 'new' new-placement[opt] new-type-id
    518 ///                                     new-initializer[opt]
    519 ///                   '::'[opt] 'new' new-placement[opt] '(' type-id ')'
    520 ///                                     new-initializer[opt]
    521 ///
    522 ///       delete-expression: [C++ 5.3.5]
    523 ///                   '::'[opt] 'delete' cast-expression
    524 ///                   '::'[opt] 'delete' '[' ']' cast-expression
    525 ///
    526 /// [GNU/Embarcadero] unary-type-trait:
    527 ///                   '__is_arithmetic'
    528 ///                   '__is_floating_point'
    529 ///                   '__is_integral'
    530 ///                   '__is_lvalue_expr'
    531 ///                   '__is_rvalue_expr'
    532 ///                   '__is_complete_type'
    533 ///                   '__is_void'
    534 ///                   '__is_array'
    535 ///                   '__is_function'
    536 ///                   '__is_reference'
    537 ///                   '__is_lvalue_reference'
    538 ///                   '__is_rvalue_reference'
    539 ///                   '__is_fundamental'
    540 ///                   '__is_object'
    541 ///                   '__is_scalar'
    542 ///                   '__is_compound'
    543 ///                   '__is_pointer'
    544 ///                   '__is_member_object_pointer'
    545 ///                   '__is_member_function_pointer'
    546 ///                   '__is_member_pointer'
    547 ///                   '__is_const'
    548 ///                   '__is_volatile'
    549 ///                   '__is_trivial'
    550 ///                   '__is_standard_layout'
    551 ///                   '__is_signed'
    552 ///                   '__is_unsigned'
    553 ///
    554 /// [GNU] unary-type-trait:
    555 ///                   '__has_nothrow_assign'
    556 ///                   '__has_nothrow_copy'
    557 ///                   '__has_nothrow_constructor'
    558 ///                   '__has_trivial_assign'                  [TODO]
    559 ///                   '__has_trivial_copy'                    [TODO]
    560 ///                   '__has_trivial_constructor'
    561 ///                   '__has_trivial_destructor'
    562 ///                   '__has_virtual_destructor'
    563 ///                   '__is_abstract'                         [TODO]
    564 ///                   '__is_class'
    565 ///                   '__is_empty'                            [TODO]
    566 ///                   '__is_enum'
    567 ///                   '__is_pod'
    568 ///                   '__is_polymorphic'
    569 ///                   '__is_trivial'
    570 ///                   '__is_union'
    571 ///
    572 /// [Clang] unary-type-trait:
    573 ///                   '__trivially_copyable'
    574 ///
    575 ///       binary-type-trait:
    576 /// [GNU]             '__is_base_of'
    577 /// [MS]              '__is_convertible_to'
    578 ///                   '__is_convertible'
    579 ///                   '__is_same'
    580 ///
    581 /// [Embarcadero] array-type-trait:
    582 ///                   '__array_rank'
    583 ///                   '__array_extent'
    584 ///
    585 /// [Embarcadero] expression-trait:
    586 ///                   '__is_lvalue_expr'
    587 ///                   '__is_rvalue_expr'
    588 ///
    589 ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
    590                                        bool isAddressOfOperand,
    591                                        bool &NotCastExpr,
    592                                        bool isTypeCast) {
    593   ExprResult Res;
    594   tok::TokenKind SavedKind = Tok.getKind();
    595   NotCastExpr = false;
    596 
    597   // This handles all of cast-expression, unary-expression, postfix-expression,
    598   // and primary-expression.  We handle them together like this for efficiency
    599   // and to simplify handling of an expression starting with a '(' token: which
    600   // may be one of a parenthesized expression, cast-expression, compound literal
    601   // expression, or statement expression.
    602   //
    603   // If the parsed tokens consist of a primary-expression, the cases below
    604   // break out of the switch;  at the end we call ParsePostfixExpressionSuffix
    605   // to handle the postfix expression suffixes.  Cases that cannot be followed
    606   // by postfix exprs should return without invoking
    607   // ParsePostfixExpressionSuffix.
    608   switch (SavedKind) {
    609   case tok::l_paren: {
    610     // If this expression is limited to being a unary-expression, the parent can
    611     // not start a cast expression.
    612     ParenParseOption ParenExprType =
    613       (isUnaryExpression && !getLang().CPlusPlus)? CompoundLiteral : CastExpr;
    614     ParsedType CastTy;
    615     SourceLocation RParenLoc;
    616 
    617     {
    618       // The inside of the parens don't need to be a colon protected scope, and
    619       // isn't immediately a message send.
    620       ColonProtectionRAIIObject X(*this, false);
    621 
    622       Res = ParseParenExpression(ParenExprType, false/*stopIfCastExr*/,
    623                                  isTypeCast, CastTy, RParenLoc);
    624     }
    625 
    626     switch (ParenExprType) {
    627     case SimpleExpr:   break;    // Nothing else to do.
    628     case CompoundStmt: break;  // Nothing else to do.
    629     case CompoundLiteral:
    630       // We parsed '(' type-name ')' '{' ... '}'.  If any suffixes of
    631       // postfix-expression exist, parse them now.
    632       break;
    633     case CastExpr:
    634       // We have parsed the cast-expression and no postfix-expr pieces are
    635       // following.
    636       return move(Res);
    637     }
    638 
    639     break;
    640   }
    641 
    642     // primary-expression
    643   case tok::numeric_constant:
    644     // constant: integer-constant
    645     // constant: floating-constant
    646 
    647     Res = Actions.ActOnNumericConstant(Tok);
    648     ConsumeToken();
    649     break;
    650 
    651   case tok::kw_true:
    652   case tok::kw_false:
    653     return ParseCXXBoolLiteral();
    654 
    655   case tok::kw_nullptr:
    656     return Actions.ActOnCXXNullPtrLiteral(ConsumeToken());
    657 
    658   case tok::annot_primary_expr:
    659     assert(Res.get() == 0 && "Stray primary-expression annotation?");
    660     Res = getExprAnnotation(Tok);
    661     ConsumeToken();
    662     break;
    663 
    664   case tok::identifier: {      // primary-expression: identifier
    665                                // unqualified-id: identifier
    666                                // constant: enumeration-constant
    667     // Turn a potentially qualified name into a annot_typename or
    668     // annot_cxxscope if it would be valid.  This handles things like x::y, etc.
    669     if (getLang().CPlusPlus) {
    670       // Avoid the unnecessary parse-time lookup in the common case
    671       // where the syntax forbids a type.
    672       const Token &Next = NextToken();
    673       if (Next.is(tok::coloncolon) ||
    674           (!ColonIsSacred && Next.is(tok::colon)) ||
    675           Next.is(tok::less) ||
    676           Next.is(tok::l_paren)) {
    677         // If TryAnnotateTypeOrScopeToken annotates the token, tail recurse.
    678         if (TryAnnotateTypeOrScopeToken())
    679           return ExprError();
    680         if (!Tok.is(tok::identifier))
    681           return ParseCastExpression(isUnaryExpression, isAddressOfOperand);
    682       }
    683     }
    684 
    685     // Consume the identifier so that we can see if it is followed by a '(' or
    686     // '.'.
    687     IdentifierInfo &II = *Tok.getIdentifierInfo();
    688     SourceLocation ILoc = ConsumeToken();
    689 
    690     // Support 'Class.property' and 'super.property' notation.
    691     if (getLang().ObjC1 && Tok.is(tok::period) &&
    692         (Actions.getTypeName(II, ILoc, getCurScope()) ||
    693          // Allow the base to be 'super' if in an objc-method.
    694          (&II == Ident_super && getCurScope()->isInObjcMethodScope()))) {
    695       ConsumeToken();
    696 
    697       if (Tok.isNot(tok::identifier)) {
    698         Diag(Tok, diag::err_expected_property_name);
    699         return ExprError();
    700       }
    701       IdentifierInfo &PropertyName = *Tok.getIdentifierInfo();
    702       SourceLocation PropertyLoc = ConsumeToken();
    703 
    704       Res = Actions.ActOnClassPropertyRefExpr(II, PropertyName,
    705                                               ILoc, PropertyLoc);
    706       break;
    707     }
    708 
    709     // In an Objective-C method, if we have "super" followed by an identifier,
    710     // the token sequence is ill-formed. However, if there's a ':' or ']' after
    711     // that identifier, this is probably a message send with a missing open
    712     // bracket. Treat it as such.
    713     if (getLang().ObjC1 && &II == Ident_super && !InMessageExpression &&
    714         getCurScope()->isInObjcMethodScope() &&
    715         ((Tok.is(tok::identifier) &&
    716          (NextToken().is(tok::colon) || NextToken().is(tok::r_square))) ||
    717          Tok.is(tok::code_completion))) {
    718       Res = ParseObjCMessageExpressionBody(SourceLocation(), ILoc, ParsedType(),
    719                                            0);
    720       break;
    721     }
    722 
    723     // If we have an Objective-C class name followed by an identifier
    724     // and either ':' or ']', this is an Objective-C class message
    725     // send that's missing the opening '['. Recovery
    726     // appropriately. Also take this path if we're performing code
    727     // completion after an Objective-C class name.
    728     if (getLang().ObjC1 &&
    729         ((Tok.is(tok::identifier) && !InMessageExpression) ||
    730          Tok.is(tok::code_completion))) {
    731       const Token& Next = NextToken();
    732       if (Tok.is(tok::code_completion) ||
    733           Next.is(tok::colon) || Next.is(tok::r_square))
    734         if (ParsedType Typ = Actions.getTypeName(II, ILoc, getCurScope()))
    735           if (Typ.get()->isObjCObjectOrInterfaceType()) {
    736             // Fake up a Declarator to use with ActOnTypeName.
    737             DeclSpec DS(AttrFactory);
    738             DS.SetRangeStart(ILoc);
    739             DS.SetRangeEnd(ILoc);
    740             const char *PrevSpec = 0;
    741             unsigned DiagID;
    742             DS.SetTypeSpecType(TST_typename, ILoc, PrevSpec, DiagID, Typ);
    743 
    744             Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
    745             TypeResult Ty = Actions.ActOnTypeName(getCurScope(),
    746                                                   DeclaratorInfo);
    747             if (Ty.isInvalid())
    748               break;
    749 
    750             Res = ParseObjCMessageExpressionBody(SourceLocation(),
    751                                                  SourceLocation(),
    752                                                  Ty.get(), 0);
    753             break;
    754           }
    755     }
    756 
    757     // Make sure to pass down the right value for isAddressOfOperand.
    758     if (isAddressOfOperand && isPostfixExpressionSuffixStart())
    759       isAddressOfOperand = false;
    760 
    761     // Function designators are allowed to be undeclared (C99 6.5.1p2), so we
    762     // need to know whether or not this identifier is a function designator or
    763     // not.
    764     UnqualifiedId Name;
    765     CXXScopeSpec ScopeSpec;
    766     Name.setIdentifier(&II, ILoc);
    767     Res = Actions.ActOnIdExpression(getCurScope(), ScopeSpec, Name,
    768                                     Tok.is(tok::l_paren), isAddressOfOperand);
    769     break;
    770   }
    771   case tok::char_constant:     // constant: character-constant
    772     Res = Actions.ActOnCharacterConstant(Tok);
    773     ConsumeToken();
    774     break;
    775   case tok::kw___func__:       // primary-expression: __func__ [C99 6.4.2.2]
    776   case tok::kw___FUNCTION__:   // primary-expression: __FUNCTION__ [GNU]
    777   case tok::kw___PRETTY_FUNCTION__:  // primary-expression: __P..Y_F..N__ [GNU]
    778     Res = Actions.ActOnPredefinedExpr(Tok.getLocation(), SavedKind);
    779     ConsumeToken();
    780     break;
    781   case tok::string_literal:    // primary-expression: string-literal
    782   case tok::wide_string_literal:
    783     Res = ParseStringLiteralExpression();
    784     break;
    785   case tok::kw__Generic:   // primary-expression: generic-selection [C1X 6.5.1]
    786     Res = ParseGenericSelectionExpression();
    787     break;
    788   case tok::kw___builtin_va_arg:
    789   case tok::kw___builtin_offsetof:
    790   case tok::kw___builtin_choose_expr:
    791   case tok::kw___builtin_astype: // primary-expression: [OCL] as_type()
    792     return ParseBuiltinPrimaryExpression();
    793   case tok::kw___null:
    794     return Actions.ActOnGNUNullExpr(ConsumeToken());
    795 
    796   case tok::plusplus:      // unary-expression: '++' unary-expression [C99]
    797   case tok::minusminus: {  // unary-expression: '--' unary-expression [C99]
    798     // C++ [expr.unary] has:
    799     //   unary-expression:
    800     //     ++ cast-expression
    801     //     -- cast-expression
    802     SourceLocation SavedLoc = ConsumeToken();
    803     Res = ParseCastExpression(!getLang().CPlusPlus);
    804     if (!Res.isInvalid())
    805       Res = Actions.ActOnUnaryOp(getCurScope(), SavedLoc, SavedKind, Res.get());
    806     return move(Res);
    807   }
    808   case tok::amp: {         // unary-expression: '&' cast-expression
    809     // Special treatment because of member pointers
    810     SourceLocation SavedLoc = ConsumeToken();
    811     Res = ParseCastExpression(false, true);
    812     if (!Res.isInvalid())
    813       Res = Actions.ActOnUnaryOp(getCurScope(), SavedLoc, SavedKind, Res.get());
    814     return move(Res);
    815   }
    816 
    817   case tok::star:          // unary-expression: '*' cast-expression
    818   case tok::plus:          // unary-expression: '+' cast-expression
    819   case tok::minus:         // unary-expression: '-' cast-expression
    820   case tok::tilde:         // unary-expression: '~' cast-expression
    821   case tok::exclaim:       // unary-expression: '!' cast-expression
    822   case tok::kw___real:     // unary-expression: '__real' cast-expression [GNU]
    823   case tok::kw___imag: {   // unary-expression: '__imag' cast-expression [GNU]
    824     SourceLocation SavedLoc = ConsumeToken();
    825     Res = ParseCastExpression(false);
    826     if (!Res.isInvalid())
    827       Res = Actions.ActOnUnaryOp(getCurScope(), SavedLoc, SavedKind, Res.get());
    828     return move(Res);
    829   }
    830 
    831   case tok::kw___extension__:{//unary-expression:'__extension__' cast-expr [GNU]
    832     // __extension__ silences extension warnings in the subexpression.
    833     ExtensionRAIIObject O(Diags);  // Use RAII to do this.
    834     SourceLocation SavedLoc = ConsumeToken();
    835     Res = ParseCastExpression(false);
    836     if (!Res.isInvalid())
    837       Res = Actions.ActOnUnaryOp(getCurScope(), SavedLoc, SavedKind, Res.get());
    838     return move(Res);
    839   }
    840   case tok::kw_sizeof:     // unary-expression: 'sizeof' unary-expression
    841                            // unary-expression: 'sizeof' '(' type-name ')'
    842   case tok::kw_alignof:
    843   case tok::kw___alignof:  // unary-expression: '__alignof' unary-expression
    844                            // unary-expression: '__alignof' '(' type-name ')'
    845                            // unary-expression: 'alignof' '(' type-id ')'
    846   case tok::kw_vec_step:   // unary-expression: OpenCL 'vec_step' expression
    847     return ParseUnaryExprOrTypeTraitExpression();
    848   case tok::ampamp: {      // unary-expression: '&&' identifier
    849     SourceLocation AmpAmpLoc = ConsumeToken();
    850     if (Tok.isNot(tok::identifier))
    851       return ExprError(Diag(Tok, diag::err_expected_ident));
    852 
    853     if (getCurScope()->getFnParent() == 0)
    854       return ExprError(Diag(Tok, diag::err_address_of_label_outside_fn));
    855 
    856     Diag(AmpAmpLoc, diag::ext_gnu_address_of_label);
    857     LabelDecl *LD = Actions.LookupOrCreateLabel(Tok.getIdentifierInfo(),
    858                                                 Tok.getLocation());
    859     Res = Actions.ActOnAddrLabel(AmpAmpLoc, Tok.getLocation(), LD);
    860     ConsumeToken();
    861     return move(Res);
    862   }
    863   case tok::kw_const_cast:
    864   case tok::kw_dynamic_cast:
    865   case tok::kw_reinterpret_cast:
    866   case tok::kw_static_cast:
    867     Res = ParseCXXCasts();
    868     break;
    869   case tok::kw_typeid:
    870     Res = ParseCXXTypeid();
    871     break;
    872   case tok::kw___uuidof:
    873     Res = ParseCXXUuidof();
    874     break;
    875   case tok::kw_this:
    876     Res = ParseCXXThis();
    877     break;
    878 
    879   case tok::annot_typename:
    880     if (isStartOfObjCClassMessageMissingOpenBracket()) {
    881       ParsedType Type = getTypeAnnotation(Tok);
    882 
    883       // Fake up a Declarator to use with ActOnTypeName.
    884       DeclSpec DS(AttrFactory);
    885       DS.SetRangeStart(Tok.getLocation());
    886       DS.SetRangeEnd(Tok.getLastLoc());
    887 
    888       const char *PrevSpec = 0;
    889       unsigned DiagID;
    890       DS.SetTypeSpecType(TST_typename, Tok.getAnnotationEndLoc(),
    891                          PrevSpec, DiagID, Type);
    892 
    893       Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
    894       TypeResult Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
    895       if (Ty.isInvalid())
    896         break;
    897 
    898       ConsumeToken();
    899       Res = ParseObjCMessageExpressionBody(SourceLocation(), SourceLocation(),
    900                                            Ty.get(), 0);
    901       break;
    902     }
    903     // Fall through
    904 
    905   case tok::kw_char:
    906   case tok::kw_wchar_t:
    907   case tok::kw_char16_t:
    908   case tok::kw_char32_t:
    909   case tok::kw_bool:
    910   case tok::kw_short:
    911   case tok::kw_int:
    912   case tok::kw_long:
    913   case tok::kw___int64:
    914   case tok::kw_signed:
    915   case tok::kw_unsigned:
    916   case tok::kw_float:
    917   case tok::kw_double:
    918   case tok::kw_void:
    919   case tok::kw_typename:
    920   case tok::kw_typeof:
    921   case tok::kw___vector: {
    922     if (!getLang().CPlusPlus) {
    923       Diag(Tok, diag::err_expected_expression);
    924       return ExprError();
    925     }
    926 
    927     if (SavedKind == tok::kw_typename) {
    928       // postfix-expression: typename-specifier '(' expression-list[opt] ')'
    929       //                     typename-specifier braced-init-list
    930       if (TryAnnotateTypeOrScopeToken())
    931         return ExprError();
    932     }
    933 
    934     // postfix-expression: simple-type-specifier '(' expression-list[opt] ')'
    935     //                     simple-type-specifier braced-init-list
    936     //
    937     DeclSpec DS(AttrFactory);
    938     ParseCXXSimpleTypeSpecifier(DS);
    939     if (Tok.isNot(tok::l_paren) &&
    940         (!getLang().CPlusPlus0x || Tok.isNot(tok::l_brace)))
    941       return ExprError(Diag(Tok, diag::err_expected_lparen_after_type)
    942                          << DS.getSourceRange());
    943 
    944     Res = ParseCXXTypeConstructExpression(DS);
    945     break;
    946   }
    947 
    948   case tok::annot_cxxscope: { // [C++] id-expression: qualified-id
    949     // If TryAnnotateTypeOrScopeToken annotates the token, tail recurse.
    950     // (We can end up in this situation after tentative parsing.)
    951     if (TryAnnotateTypeOrScopeToken())
    952       return ExprError();
    953     if (!Tok.is(tok::annot_cxxscope))
    954       return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
    955                                  NotCastExpr, isTypeCast);
    956 
    957     Token Next = NextToken();
    958     if (Next.is(tok::annot_template_id)) {
    959       TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Next);
    960       if (TemplateId->Kind == TNK_Type_template) {
    961         // We have a qualified template-id that we know refers to a
    962         // type, translate it into a type and continue parsing as a
    963         // cast expression.
    964         CXXScopeSpec SS;
    965         ParseOptionalCXXScopeSpecifier(SS, ParsedType(), false);
    966         AnnotateTemplateIdTokenAsType();
    967         return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
    968                                    NotCastExpr, isTypeCast);
    969       }
    970     }
    971 
    972     // Parse as an id-expression.
    973     Res = ParseCXXIdExpression(isAddressOfOperand);
    974     break;
    975   }
    976 
    977   case tok::annot_template_id: { // [C++]          template-id
    978     TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
    979     if (TemplateId->Kind == TNK_Type_template) {
    980       // We have a template-id that we know refers to a type,
    981       // translate it into a type and continue parsing as a cast
    982       // expression.
    983       AnnotateTemplateIdTokenAsType();
    984       return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
    985                                  NotCastExpr, isTypeCast);
    986     }
    987 
    988     // Fall through to treat the template-id as an id-expression.
    989   }
    990 
    991   case tok::kw_operator: // [C++] id-expression: operator/conversion-function-id
    992     Res = ParseCXXIdExpression(isAddressOfOperand);
    993     break;
    994 
    995   case tok::coloncolon: {
    996     // ::foo::bar -> global qualified name etc.   If TryAnnotateTypeOrScopeToken
    997     // annotates the token, tail recurse.
    998     if (TryAnnotateTypeOrScopeToken())
    999       return ExprError();
   1000     if (!Tok.is(tok::coloncolon))
   1001       return ParseCastExpression(isUnaryExpression, isAddressOfOperand);
   1002 
   1003     // ::new -> [C++] new-expression
   1004     // ::delete -> [C++] delete-expression
   1005     SourceLocation CCLoc = ConsumeToken();
   1006     if (Tok.is(tok::kw_new))
   1007       return ParseCXXNewExpression(true, CCLoc);
   1008     if (Tok.is(tok::kw_delete))
   1009       return ParseCXXDeleteExpression(true, CCLoc);
   1010 
   1011     // This is not a type name or scope specifier, it is an invalid expression.
   1012     Diag(CCLoc, diag::err_expected_expression);
   1013     return ExprError();
   1014   }
   1015 
   1016   case tok::kw_new: // [C++] new-expression
   1017     return ParseCXXNewExpression(false, Tok.getLocation());
   1018 
   1019   case tok::kw_delete: // [C++] delete-expression
   1020     return ParseCXXDeleteExpression(false, Tok.getLocation());
   1021 
   1022   case tok::kw_noexcept: { // [C++0x] 'noexcept' '(' expression ')'
   1023     SourceLocation KeyLoc = ConsumeToken();
   1024     SourceLocation LParen = Tok.getLocation();
   1025     if (ExpectAndConsume(tok::l_paren,
   1026                          diag::err_expected_lparen_after, "noexcept"))
   1027       return ExprError();
   1028     // C++ [expr.unary.noexcept]p1:
   1029     //   The noexcept operator determines whether the evaluation of its operand,
   1030     //   which is an unevaluated operand, can throw an exception.
   1031     EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated);
   1032     ExprResult Result = ParseExpression();
   1033     SourceLocation RParen = MatchRHSPunctuation(tok::r_paren, LParen);
   1034     if (!Result.isInvalid())
   1035       Result = Actions.ActOnNoexceptExpr(KeyLoc, LParen, Result.take(), RParen);
   1036     return move(Result);
   1037   }
   1038 
   1039   case tok::kw___is_abstract: // [GNU] unary-type-trait
   1040   case tok::kw___is_class:
   1041   case tok::kw___is_empty:
   1042   case tok::kw___is_enum:
   1043   case tok::kw___is_literal:
   1044   case tok::kw___is_arithmetic:
   1045   case tok::kw___is_integral:
   1046   case tok::kw___is_floating_point:
   1047   case tok::kw___is_complete_type:
   1048   case tok::kw___is_void:
   1049   case tok::kw___is_array:
   1050   case tok::kw___is_function:
   1051   case tok::kw___is_reference:
   1052   case tok::kw___is_lvalue_reference:
   1053   case tok::kw___is_rvalue_reference:
   1054   case tok::kw___is_fundamental:
   1055   case tok::kw___is_object:
   1056   case tok::kw___is_scalar:
   1057   case tok::kw___is_compound:
   1058   case tok::kw___is_pointer:
   1059   case tok::kw___is_member_object_pointer:
   1060   case tok::kw___is_member_function_pointer:
   1061   case tok::kw___is_member_pointer:
   1062   case tok::kw___is_const:
   1063   case tok::kw___is_volatile:
   1064   case tok::kw___is_standard_layout:
   1065   case tok::kw___is_signed:
   1066   case tok::kw___is_unsigned:
   1067   case tok::kw___is_literal_type:
   1068   case tok::kw___is_pod:
   1069   case tok::kw___is_polymorphic:
   1070   case tok::kw___is_trivial:
   1071   case tok::kw___is_trivially_copyable:
   1072   case tok::kw___is_union:
   1073   case tok::kw___has_trivial_constructor:
   1074   case tok::kw___has_trivial_copy:
   1075   case tok::kw___has_trivial_assign:
   1076   case tok::kw___has_trivial_destructor:
   1077   case tok::kw___has_nothrow_assign:
   1078   case tok::kw___has_nothrow_copy:
   1079   case tok::kw___has_nothrow_constructor:
   1080   case tok::kw___has_virtual_destructor:
   1081     return ParseUnaryTypeTrait();
   1082 
   1083   case tok::kw___builtin_types_compatible_p:
   1084   case tok::kw___is_base_of:
   1085   case tok::kw___is_same:
   1086   case tok::kw___is_convertible:
   1087   case tok::kw___is_convertible_to:
   1088     return ParseBinaryTypeTrait();
   1089 
   1090   case tok::kw___array_rank:
   1091   case tok::kw___array_extent:
   1092     return ParseArrayTypeTrait();
   1093 
   1094   case tok::kw___is_lvalue_expr:
   1095   case tok::kw___is_rvalue_expr:
   1096     return ParseExpressionTrait();
   1097 
   1098   case tok::at: {
   1099     SourceLocation AtLoc = ConsumeToken();
   1100     return ParseObjCAtExpression(AtLoc);
   1101   }
   1102   case tok::caret:
   1103     Res = ParseBlockLiteralExpression();
   1104     break;
   1105   case tok::code_completion: {
   1106     Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Expression);
   1107     ConsumeCodeCompletionToken();
   1108     return ParseCastExpression(isUnaryExpression, isAddressOfOperand,
   1109                                NotCastExpr, isTypeCast);
   1110   }
   1111   case tok::l_square:
   1112     if (getLang().ObjC1) {
   1113       Res = ParseObjCMessageExpression();
   1114       break;
   1115     }
   1116     // FALL THROUGH.
   1117   default:
   1118     NotCastExpr = true;
   1119     return ExprError();
   1120   }
   1121 
   1122   // These can be followed by postfix-expr pieces.
   1123   return ParsePostfixExpressionSuffix(Res);
   1124 }
   1125 
   1126 /// ParsePostfixExpressionSuffix - Once the leading part of a postfix-expression
   1127 /// is parsed, this method parses any suffixes that apply.
   1128 ///
   1129 ///       postfix-expression: [C99 6.5.2]
   1130 ///         primary-expression
   1131 ///         postfix-expression '[' expression ']'
   1132 ///         postfix-expression '[' braced-init-list ']'
   1133 ///         postfix-expression '(' argument-expression-list[opt] ')'
   1134 ///         postfix-expression '.' identifier
   1135 ///         postfix-expression '->' identifier
   1136 ///         postfix-expression '++'
   1137 ///         postfix-expression '--'
   1138 ///         '(' type-name ')' '{' initializer-list '}'
   1139 ///         '(' type-name ')' '{' initializer-list ',' '}'
   1140 ///
   1141 ///       argument-expression-list: [C99 6.5.2]
   1142 ///         argument-expression ...[opt]
   1143 ///         argument-expression-list ',' assignment-expression ...[opt]
   1144 ///
   1145 ExprResult
   1146 Parser::ParsePostfixExpressionSuffix(ExprResult LHS) {
   1147   // Now that the primary-expression piece of the postfix-expression has been
   1148   // parsed, see if there are any postfix-expression pieces here.
   1149   SourceLocation Loc;
   1150   while (1) {
   1151     switch (Tok.getKind()) {
   1152     case tok::code_completion:
   1153       if (InMessageExpression)
   1154         return move(LHS);
   1155 
   1156       Actions.CodeCompletePostfixExpression(getCurScope(), LHS);
   1157       ConsumeCodeCompletionToken();
   1158       LHS = ExprError();
   1159       break;
   1160 
   1161     case tok::identifier:
   1162       // If we see identifier: after an expression, and we're not already in a
   1163       // message send, then this is probably a message send with a missing
   1164       // opening bracket '['.
   1165       if (getLang().ObjC1 && !InMessageExpression &&
   1166           (NextToken().is(tok::colon) || NextToken().is(tok::r_square))) {
   1167         LHS = ParseObjCMessageExpressionBody(SourceLocation(), SourceLocation(),
   1168                                              ParsedType(), LHS.get());
   1169         break;
   1170       }
   1171 
   1172       // Fall through; this isn't a message send.
   1173 
   1174     default:  // Not a postfix-expression suffix.
   1175       return move(LHS);
   1176     case tok::l_square: {  // postfix-expression: p-e '[' expression ']'
   1177       // If we have a array postfix expression that starts on a new line and
   1178       // Objective-C is enabled, it is highly likely that the user forgot a
   1179       // semicolon after the base expression and that the array postfix-expr is
   1180       // actually another message send.  In this case, do some look-ahead to see
   1181       // if the contents of the square brackets are obviously not a valid
   1182       // expression and recover by pretending there is no suffix.
   1183       if (getLang().ObjC1 && Tok.isAtStartOfLine() &&
   1184           isSimpleObjCMessageExpression())
   1185         return move(LHS);
   1186 
   1187       Loc = ConsumeBracket();
   1188       ExprResult Idx;
   1189       if (getLang().CPlusPlus0x && Tok.is(tok::l_brace))
   1190         Idx = ParseBraceInitializer();
   1191       else
   1192         Idx = ParseExpression();
   1193 
   1194       SourceLocation RLoc = Tok.getLocation();
   1195 
   1196       if (!LHS.isInvalid() && !Idx.isInvalid() && Tok.is(tok::r_square)) {
   1197         LHS = Actions.ActOnArraySubscriptExpr(getCurScope(), LHS.take(), Loc,
   1198                                               Idx.take(), RLoc);
   1199       } else
   1200         LHS = ExprError();
   1201 
   1202       // Match the ']'.
   1203       MatchRHSPunctuation(tok::r_square, Loc);
   1204       break;
   1205     }
   1206 
   1207     case tok::l_paren:         // p-e: p-e '(' argument-expression-list[opt] ')'
   1208     case tok::lesslessless: {  // p-e: p-e '<<<' argument-expression-list '>>>'
   1209                                //   '(' argument-expression-list[opt] ')'
   1210       tok::TokenKind OpKind = Tok.getKind();
   1211       InMessageExpressionRAIIObject InMessage(*this, false);
   1212 
   1213       Expr *ExecConfig = 0;
   1214 
   1215       if (OpKind == tok::lesslessless) {
   1216         ExprVector ExecConfigExprs(Actions);
   1217         CommaLocsTy ExecConfigCommaLocs;
   1218         SourceLocation LLLLoc, GGGLoc;
   1219 
   1220         LLLLoc = ConsumeToken();
   1221 
   1222         if (ParseExpressionList(ExecConfigExprs, ExecConfigCommaLocs)) {
   1223           LHS = ExprError();
   1224         }
   1225 
   1226         if (LHS.isInvalid()) {
   1227           SkipUntil(tok::greatergreatergreater);
   1228         } else if (Tok.isNot(tok::greatergreatergreater)) {
   1229           MatchRHSPunctuation(tok::greatergreatergreater, LLLLoc);
   1230           LHS = ExprError();
   1231         } else {
   1232           GGGLoc = ConsumeToken();
   1233         }
   1234 
   1235         if (!LHS.isInvalid()) {
   1236           if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen, ""))
   1237             LHS = ExprError();
   1238           else
   1239             Loc = PrevTokLocation;
   1240         }
   1241 
   1242         if (!LHS.isInvalid()) {
   1243           ExprResult ECResult = Actions.ActOnCUDAExecConfigExpr(getCurScope(),
   1244                                      LLLLoc, move_arg(ExecConfigExprs), GGGLoc);
   1245           if (ECResult.isInvalid())
   1246             LHS = ExprError();
   1247           else
   1248             ExecConfig = ECResult.get();
   1249         }
   1250       } else {
   1251         Loc = ConsumeParen();
   1252       }
   1253 
   1254       ExprVector ArgExprs(Actions);
   1255       CommaLocsTy CommaLocs;
   1256 
   1257       if (Tok.is(tok::code_completion)) {
   1258         Actions.CodeCompleteCall(getCurScope(), LHS.get(), 0, 0);
   1259         ConsumeCodeCompletionToken();
   1260       }
   1261 
   1262       if (OpKind == tok::l_paren || !LHS.isInvalid()) {
   1263         if (Tok.isNot(tok::r_paren)) {
   1264           if (ParseExpressionList(ArgExprs, CommaLocs, &Sema::CodeCompleteCall,
   1265                                   LHS.get())) {
   1266             LHS = ExprError();
   1267           }
   1268         }
   1269       }
   1270 
   1271       // Match the ')'.
   1272       if (LHS.isInvalid()) {
   1273         SkipUntil(tok::r_paren);
   1274       } else if (Tok.isNot(tok::r_paren)) {
   1275         MatchRHSPunctuation(tok::r_paren, Loc);
   1276         LHS = ExprError();
   1277       } else {
   1278         assert((ArgExprs.size() == 0 ||
   1279                 ArgExprs.size()-1 == CommaLocs.size())&&
   1280                "Unexpected number of commas!");
   1281         LHS = Actions.ActOnCallExpr(getCurScope(), LHS.take(), Loc,
   1282                                     move_arg(ArgExprs), Tok.getLocation(),
   1283                                     ExecConfig);
   1284         ConsumeParen();
   1285       }
   1286 
   1287       break;
   1288     }
   1289     case tok::arrow:
   1290     case tok::period: {
   1291       // postfix-expression: p-e '->' template[opt] id-expression
   1292       // postfix-expression: p-e '.' template[opt] id-expression
   1293       tok::TokenKind OpKind = Tok.getKind();
   1294       SourceLocation OpLoc = ConsumeToken();  // Eat the "." or "->" token.
   1295 
   1296       CXXScopeSpec SS;
   1297       ParsedType ObjectType;
   1298       bool MayBePseudoDestructor = false;
   1299       if (getLang().CPlusPlus && !LHS.isInvalid()) {
   1300         LHS = Actions.ActOnStartCXXMemberReference(getCurScope(), LHS.take(),
   1301                                                    OpLoc, OpKind, ObjectType,
   1302                                                    MayBePseudoDestructor);
   1303         if (LHS.isInvalid())
   1304           break;
   1305 
   1306         ParseOptionalCXXScopeSpecifier(SS, ObjectType, false,
   1307                                        &MayBePseudoDestructor);
   1308         if (SS.isNotEmpty())
   1309           ObjectType = ParsedType();
   1310       }
   1311 
   1312       if (Tok.is(tok::code_completion)) {
   1313         // Code completion for a member access expression.
   1314         Actions.CodeCompleteMemberReferenceExpr(getCurScope(), LHS.get(),
   1315                                                 OpLoc, OpKind == tok::arrow);
   1316 
   1317         ConsumeCodeCompletionToken();
   1318       }
   1319 
   1320       if (MayBePseudoDestructor && !LHS.isInvalid()) {
   1321         LHS = ParseCXXPseudoDestructor(LHS.take(), OpLoc, OpKind, SS,
   1322                                        ObjectType);
   1323         break;
   1324       }
   1325 
   1326       // Either the action has told is that this cannot be a
   1327       // pseudo-destructor expression (based on the type of base
   1328       // expression), or we didn't see a '~' in the right place. We
   1329       // can still parse a destructor name here, but in that case it
   1330       // names a real destructor.
   1331       // Allow explicit constructor calls in Microsoft mode.
   1332       // FIXME: Add support for explicit call of template constructor.
   1333       UnqualifiedId Name;
   1334       if (ParseUnqualifiedId(SS,
   1335                              /*EnteringContext=*/false,
   1336                              /*AllowDestructorName=*/true,
   1337                              /*AllowConstructorName=*/ getLang().Microsoft,
   1338                              ObjectType,
   1339                              Name))
   1340         LHS = ExprError();
   1341 
   1342       if (!LHS.isInvalid())
   1343         LHS = Actions.ActOnMemberAccessExpr(getCurScope(), LHS.take(), OpLoc,
   1344                                             OpKind, SS, Name, ObjCImpDecl,
   1345                                             Tok.is(tok::l_paren));
   1346       break;
   1347     }
   1348     case tok::plusplus:    // postfix-expression: postfix-expression '++'
   1349     case tok::minusminus:  // postfix-expression: postfix-expression '--'
   1350       if (!LHS.isInvalid()) {
   1351         LHS = Actions.ActOnPostfixUnaryOp(getCurScope(), Tok.getLocation(),
   1352                                           Tok.getKind(), LHS.take());
   1353       }
   1354       ConsumeToken();
   1355       break;
   1356     }
   1357   }
   1358 }
   1359 
   1360 /// ParseExprAfterUnaryExprOrTypeTrait - We parsed a typeof/sizeof/alignof/
   1361 /// vec_step and we are at the start of an expression or a parenthesized
   1362 /// type-id. OpTok is the operand token (typeof/sizeof/alignof). Returns the
   1363 /// expression (isCastExpr == false) or the type (isCastExpr == true).
   1364 ///
   1365 ///       unary-expression:  [C99 6.5.3]
   1366 ///         'sizeof' unary-expression
   1367 ///         'sizeof' '(' type-name ')'
   1368 /// [GNU]   '__alignof' unary-expression
   1369 /// [GNU]   '__alignof' '(' type-name ')'
   1370 /// [C++0x] 'alignof' '(' type-id ')'
   1371 ///
   1372 /// [GNU]   typeof-specifier:
   1373 ///           typeof ( expressions )
   1374 ///           typeof ( type-name )
   1375 /// [GNU/C++] typeof unary-expression
   1376 ///
   1377 /// [OpenCL 1.1 6.11.12] vec_step built-in function:
   1378 ///           vec_step ( expressions )
   1379 ///           vec_step ( type-name )
   1380 ///
   1381 ExprResult
   1382 Parser::ParseExprAfterUnaryExprOrTypeTrait(const Token &OpTok,
   1383                                            bool &isCastExpr,
   1384                                            ParsedType &CastTy,
   1385                                            SourceRange &CastRange) {
   1386 
   1387   assert((OpTok.is(tok::kw_typeof)    || OpTok.is(tok::kw_sizeof) ||
   1388           OpTok.is(tok::kw___alignof) || OpTok.is(tok::kw_alignof) ||
   1389           OpTok.is(tok::kw_vec_step)) &&
   1390           "Not a typeof/sizeof/alignof/vec_step expression!");
   1391 
   1392   ExprResult Operand;
   1393 
   1394   // If the operand doesn't start with an '(', it must be an expression.
   1395   if (Tok.isNot(tok::l_paren)) {
   1396     isCastExpr = false;
   1397     if (OpTok.is(tok::kw_typeof) && !getLang().CPlusPlus) {
   1398       Diag(Tok,diag::err_expected_lparen_after_id) << OpTok.getIdentifierInfo();
   1399       return ExprError();
   1400     }
   1401 
   1402     // C++0x [expr.sizeof]p1:
   1403     //   [...] The operand is either an expression, which is an unevaluated
   1404     //   operand (Clause 5) [...]
   1405     //
   1406     // The GNU typeof and alignof extensions also behave as unevaluated
   1407     // operands.
   1408     EnterExpressionEvaluationContext Unevaluated(Actions,
   1409                                                  Sema::Unevaluated);
   1410     Operand = ParseCastExpression(true/*isUnaryExpression*/);
   1411   } else {
   1412     // If it starts with a '(', we know that it is either a parenthesized
   1413     // type-name, or it is a unary-expression that starts with a compound
   1414     // literal, or starts with a primary-expression that is a parenthesized
   1415     // expression.
   1416     ParenParseOption ExprType = CastExpr;
   1417     SourceLocation LParenLoc = Tok.getLocation(), RParenLoc;
   1418 
   1419     // C++0x [expr.sizeof]p1:
   1420     //   [...] The operand is either an expression, which is an unevaluated
   1421     //   operand (Clause 5) [...]
   1422     //
   1423     // The GNU typeof and alignof extensions also behave as unevaluated
   1424     // operands.
   1425     EnterExpressionEvaluationContext Unevaluated(Actions,
   1426                                                  Sema::Unevaluated);
   1427     Operand = ParseParenExpression(ExprType, true/*stopIfCastExpr*/,
   1428                                    false, CastTy, RParenLoc);
   1429     CastRange = SourceRange(LParenLoc, RParenLoc);
   1430 
   1431     // If ParseParenExpression parsed a '(typename)' sequence only, then this is
   1432     // a type.
   1433     if (ExprType == CastExpr) {
   1434       isCastExpr = true;
   1435       return ExprEmpty();
   1436     }
   1437 
   1438     if (getLang().CPlusPlus || OpTok.isNot(tok::kw_typeof)) {
   1439       // GNU typeof in C requires the expression to be parenthesized. Not so for
   1440       // sizeof/alignof or in C++. Therefore, the parenthesized expression is
   1441       // the start of a unary-expression, but doesn't include any postfix
   1442       // pieces. Parse these now if present.
   1443       if (!Operand.isInvalid())
   1444         Operand = ParsePostfixExpressionSuffix(Operand.get());
   1445     }
   1446   }
   1447 
   1448   // If we get here, the operand to the typeof/sizeof/alignof was an expresion.
   1449   isCastExpr = false;
   1450   return move(Operand);
   1451 }
   1452 
   1453 
   1454 /// ParseUnaryExprOrTypeTraitExpression - Parse a sizeof or alignof expression.
   1455 ///       unary-expression:  [C99 6.5.3]
   1456 ///         'sizeof' unary-expression
   1457 ///         'sizeof' '(' type-name ')'
   1458 /// [C++0x] 'sizeof' '...' '(' identifier ')'
   1459 /// [GNU]   '__alignof' unary-expression
   1460 /// [GNU]   '__alignof' '(' type-name ')'
   1461 /// [C++0x] 'alignof' '(' type-id ')'
   1462 ExprResult Parser::ParseUnaryExprOrTypeTraitExpression() {
   1463   assert((Tok.is(tok::kw_sizeof) || Tok.is(tok::kw___alignof)
   1464           || Tok.is(tok::kw_alignof) || Tok.is(tok::kw_vec_step)) &&
   1465          "Not a sizeof/alignof/vec_step expression!");
   1466   Token OpTok = Tok;
   1467   ConsumeToken();
   1468 
   1469   // [C++0x] 'sizeof' '...' '(' identifier ')'
   1470   if (Tok.is(tok::ellipsis) && OpTok.is(tok::kw_sizeof)) {
   1471     SourceLocation EllipsisLoc = ConsumeToken();
   1472     SourceLocation LParenLoc, RParenLoc;
   1473     IdentifierInfo *Name = 0;
   1474     SourceLocation NameLoc;
   1475     if (Tok.is(tok::l_paren)) {
   1476       LParenLoc = ConsumeParen();
   1477       if (Tok.is(tok::identifier)) {
   1478         Name = Tok.getIdentifierInfo();
   1479         NameLoc = ConsumeToken();
   1480         RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
   1481         if (RParenLoc.isInvalid())
   1482           RParenLoc = PP.getLocForEndOfToken(NameLoc);
   1483       } else {
   1484         Diag(Tok, diag::err_expected_parameter_pack);
   1485         SkipUntil(tok::r_paren);
   1486       }
   1487     } else if (Tok.is(tok::identifier)) {
   1488       Name = Tok.getIdentifierInfo();
   1489       NameLoc = ConsumeToken();
   1490       LParenLoc = PP.getLocForEndOfToken(EllipsisLoc);
   1491       RParenLoc = PP.getLocForEndOfToken(NameLoc);
   1492       Diag(LParenLoc, diag::err_paren_sizeof_parameter_pack)
   1493         << Name
   1494         << FixItHint::CreateInsertion(LParenLoc, "(")
   1495         << FixItHint::CreateInsertion(RParenLoc, ")");
   1496     } else {
   1497       Diag(Tok, diag::err_sizeof_parameter_pack);
   1498     }
   1499 
   1500     if (!Name)
   1501       return ExprError();
   1502 
   1503     return Actions.ActOnSizeofParameterPackExpr(getCurScope(),
   1504                                                 OpTok.getLocation(),
   1505                                                 *Name, NameLoc,
   1506                                                 RParenLoc);
   1507   }
   1508 
   1509   bool isCastExpr;
   1510   ParsedType CastTy;
   1511   SourceRange CastRange;
   1512   ExprResult Operand = ParseExprAfterUnaryExprOrTypeTrait(OpTok,
   1513                                                           isCastExpr,
   1514                                                           CastTy,
   1515                                                           CastRange);
   1516 
   1517   UnaryExprOrTypeTrait ExprKind = UETT_SizeOf;
   1518   if (OpTok.is(tok::kw_alignof) || OpTok.is(tok::kw___alignof))
   1519     ExprKind = UETT_AlignOf;
   1520   else if (OpTok.is(tok::kw_vec_step))
   1521     ExprKind = UETT_VecStep;
   1522 
   1523   if (isCastExpr)
   1524     return Actions.ActOnUnaryExprOrTypeTraitExpr(OpTok.getLocation(),
   1525                                                  ExprKind,
   1526                                                  /*isType=*/true,
   1527                                                  CastTy.getAsOpaquePtr(),
   1528                                                  CastRange);
   1529 
   1530   // If we get here, the operand to the sizeof/alignof was an expresion.
   1531   if (!Operand.isInvalid())
   1532     Operand = Actions.ActOnUnaryExprOrTypeTraitExpr(OpTok.getLocation(),
   1533                                                     ExprKind,
   1534                                                     /*isType=*/false,
   1535                                                     Operand.release(),
   1536                                                     CastRange);
   1537   return move(Operand);
   1538 }
   1539 
   1540 /// ParseBuiltinPrimaryExpression
   1541 ///
   1542 ///       primary-expression: [C99 6.5.1]
   1543 /// [GNU]   '__builtin_va_arg' '(' assignment-expression ',' type-name ')'
   1544 /// [GNU]   '__builtin_offsetof' '(' type-name ',' offsetof-member-designator')'
   1545 /// [GNU]   '__builtin_choose_expr' '(' assign-expr ',' assign-expr ','
   1546 ///                                     assign-expr ')'
   1547 /// [GNU]   '__builtin_types_compatible_p' '(' type-name ',' type-name ')'
   1548 /// [OCL]   '__builtin_astype' '(' type-name expr ')'
   1549 ///
   1550 /// [GNU] offsetof-member-designator:
   1551 /// [GNU]   identifier
   1552 /// [GNU]   offsetof-member-designator '.' identifier
   1553 /// [GNU]   offsetof-member-designator '[' expression ']'
   1554 ///
   1555 ExprResult Parser::ParseBuiltinPrimaryExpression() {
   1556   ExprResult Res;
   1557   const IdentifierInfo *BuiltinII = Tok.getIdentifierInfo();
   1558 
   1559   tok::TokenKind T = Tok.getKind();
   1560   SourceLocation StartLoc = ConsumeToken();   // Eat the builtin identifier.
   1561 
   1562   // All of these start with an open paren.
   1563   if (Tok.isNot(tok::l_paren))
   1564     return ExprError(Diag(Tok, diag::err_expected_lparen_after_id)
   1565                        << BuiltinII);
   1566 
   1567   SourceLocation LParenLoc = ConsumeParen();
   1568   // TODO: Build AST.
   1569 
   1570   switch (T) {
   1571   default: assert(0 && "Not a builtin primary expression!");
   1572   case tok::kw___builtin_va_arg: {
   1573     ExprResult Expr(ParseAssignmentExpression());
   1574 
   1575     if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",tok::r_paren))
   1576       Expr = ExprError();
   1577 
   1578     TypeResult Ty = ParseTypeName();
   1579 
   1580     if (Tok.isNot(tok::r_paren)) {
   1581       Diag(Tok, diag::err_expected_rparen);
   1582       Expr = ExprError();
   1583     }
   1584 
   1585     if (Expr.isInvalid() || Ty.isInvalid())
   1586       Res = ExprError();
   1587     else
   1588       Res = Actions.ActOnVAArg(StartLoc, Expr.take(), Ty.get(), ConsumeParen());
   1589     break;
   1590   }
   1591   case tok::kw___builtin_offsetof: {
   1592     SourceLocation TypeLoc = Tok.getLocation();
   1593     TypeResult Ty = ParseTypeName();
   1594     if (Ty.isInvalid()) {
   1595       SkipUntil(tok::r_paren);
   1596       return ExprError();
   1597     }
   1598 
   1599     if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",tok::r_paren))
   1600       return ExprError();
   1601 
   1602     // We must have at least one identifier here.
   1603     if (Tok.isNot(tok::identifier)) {
   1604       Diag(Tok, diag::err_expected_ident);
   1605       SkipUntil(tok::r_paren);
   1606       return ExprError();
   1607     }
   1608 
   1609     // Keep track of the various subcomponents we see.
   1610     llvm::SmallVector<Sema::OffsetOfComponent, 4> Comps;
   1611 
   1612     Comps.push_back(Sema::OffsetOfComponent());
   1613     Comps.back().isBrackets = false;
   1614     Comps.back().U.IdentInfo = Tok.getIdentifierInfo();
   1615     Comps.back().LocStart = Comps.back().LocEnd = ConsumeToken();
   1616 
   1617     // FIXME: This loop leaks the index expressions on error.
   1618     while (1) {
   1619       if (Tok.is(tok::period)) {
   1620         // offsetof-member-designator: offsetof-member-designator '.' identifier
   1621         Comps.push_back(Sema::OffsetOfComponent());
   1622         Comps.back().isBrackets = false;
   1623         Comps.back().LocStart = ConsumeToken();
   1624 
   1625         if (Tok.isNot(tok::identifier)) {
   1626           Diag(Tok, diag::err_expected_ident);
   1627           SkipUntil(tok::r_paren);
   1628           return ExprError();
   1629         }
   1630         Comps.back().U.IdentInfo = Tok.getIdentifierInfo();
   1631         Comps.back().LocEnd = ConsumeToken();
   1632 
   1633       } else if (Tok.is(tok::l_square)) {
   1634         // offsetof-member-designator: offsetof-member-design '[' expression ']'
   1635         Comps.push_back(Sema::OffsetOfComponent());
   1636         Comps.back().isBrackets = true;
   1637         Comps.back().LocStart = ConsumeBracket();
   1638         Res = ParseExpression();
   1639         if (Res.isInvalid()) {
   1640           SkipUntil(tok::r_paren);
   1641           return move(Res);
   1642         }
   1643         Comps.back().U.E = Res.release();
   1644 
   1645         Comps.back().LocEnd =
   1646           MatchRHSPunctuation(tok::r_square, Comps.back().LocStart);
   1647       } else {
   1648         if (Tok.isNot(tok::r_paren)) {
   1649           MatchRHSPunctuation(tok::r_paren, LParenLoc);
   1650           Res = ExprError();
   1651         } else if (Ty.isInvalid()) {
   1652           Res = ExprError();
   1653         } else {
   1654           Res = Actions.ActOnBuiltinOffsetOf(getCurScope(), StartLoc, TypeLoc,
   1655                                              Ty.get(), &Comps[0],
   1656                                              Comps.size(), ConsumeParen());
   1657         }
   1658         break;
   1659       }
   1660     }
   1661     break;
   1662   }
   1663   case tok::kw___builtin_choose_expr: {
   1664     ExprResult Cond(ParseAssignmentExpression());
   1665     if (Cond.isInvalid()) {
   1666       SkipUntil(tok::r_paren);
   1667       return move(Cond);
   1668     }
   1669     if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",tok::r_paren))
   1670       return ExprError();
   1671 
   1672     ExprResult Expr1(ParseAssignmentExpression());
   1673     if (Expr1.isInvalid()) {
   1674       SkipUntil(tok::r_paren);
   1675       return move(Expr1);
   1676     }
   1677     if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",tok::r_paren))
   1678       return ExprError();
   1679 
   1680     ExprResult Expr2(ParseAssignmentExpression());
   1681     if (Expr2.isInvalid()) {
   1682       SkipUntil(tok::r_paren);
   1683       return move(Expr2);
   1684     }
   1685     if (Tok.isNot(tok::r_paren)) {
   1686       Diag(Tok, diag::err_expected_rparen);
   1687       return ExprError();
   1688     }
   1689     Res = Actions.ActOnChooseExpr(StartLoc, Cond.take(), Expr1.take(),
   1690                                   Expr2.take(), ConsumeParen());
   1691     break;
   1692   }
   1693   case tok::kw___builtin_astype: {
   1694     // The first argument is an expression to be converted, followed by a comma.
   1695     ExprResult Expr(ParseAssignmentExpression());
   1696     if (Expr.isInvalid()) {
   1697       SkipUntil(tok::r_paren);
   1698       return ExprError();
   1699     }
   1700 
   1701     if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",
   1702                          tok::r_paren))
   1703       return ExprError();
   1704 
   1705     // Second argument is the type to bitcast to.
   1706     TypeResult DestTy = ParseTypeName();
   1707     if (DestTy.isInvalid())
   1708       return ExprError();
   1709 
   1710     // Attempt to consume the r-paren.
   1711     if (Tok.isNot(tok::r_paren)) {
   1712       Diag(Tok, diag::err_expected_rparen);
   1713       SkipUntil(tok::r_paren);
   1714       return ExprError();
   1715     }
   1716 
   1717     Res = Actions.ActOnAsTypeExpr(Expr.take(), DestTy.get(), StartLoc,
   1718                                   ConsumeParen());
   1719     break;
   1720   }
   1721   }
   1722 
   1723   if (Res.isInvalid())
   1724     return ExprError();
   1725 
   1726   // These can be followed by postfix-expr pieces because they are
   1727   // primary-expressions.
   1728   return ParsePostfixExpressionSuffix(Res.take());
   1729 }
   1730 
   1731 /// ParseParenExpression - This parses the unit that starts with a '(' token,
   1732 /// based on what is allowed by ExprType.  The actual thing parsed is returned
   1733 /// in ExprType. If stopIfCastExpr is true, it will only return the parsed type,
   1734 /// not the parsed cast-expression.
   1735 ///
   1736 ///       primary-expression: [C99 6.5.1]
   1737 ///         '(' expression ')'
   1738 /// [GNU]   '(' compound-statement ')'      (if !ParenExprOnly)
   1739 ///       postfix-expression: [C99 6.5.2]
   1740 ///         '(' type-name ')' '{' initializer-list '}'
   1741 ///         '(' type-name ')' '{' initializer-list ',' '}'
   1742 ///       cast-expression: [C99 6.5.4]
   1743 ///         '(' type-name ')' cast-expression
   1744 /// [ARC]   bridged-cast-expression
   1745 ///
   1746 /// [ARC] bridged-cast-expression:
   1747 ///         (__bridge type-name) cast-expression
   1748 ///         (__bridge_transfer type-name) cast-expression
   1749 ///         (__bridge_retained type-name) cast-expression
   1750 ExprResult
   1751 Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr,
   1752                              bool isTypeCast, ParsedType &CastTy,
   1753                              SourceLocation &RParenLoc) {
   1754   assert(Tok.is(tok::l_paren) && "Not a paren expr!");
   1755   GreaterThanIsOperatorScope G(GreaterThanIsOperator, true);
   1756   SourceLocation OpenLoc = ConsumeParen();
   1757   ExprResult Result(true);
   1758   bool isAmbiguousTypeId;
   1759   CastTy = ParsedType();
   1760 
   1761   if (Tok.is(tok::code_completion)) {
   1762     Actions.CodeCompleteOrdinaryName(getCurScope(),
   1763                  ExprType >= CompoundLiteral? Sema::PCC_ParenthesizedExpression
   1764                                             : Sema::PCC_Expression);
   1765     ConsumeCodeCompletionToken();
   1766     return ExprError();
   1767   }
   1768 
   1769   // None of these cases should fall through with an invalid Result
   1770   // unless they've already reported an error.
   1771 
   1772   if (ExprType >= CompoundStmt && Tok.is(tok::l_brace)) {
   1773     Diag(Tok, diag::ext_gnu_statement_expr);
   1774     ParsedAttributes attrs(AttrFactory);
   1775     StmtResult Stmt(ParseCompoundStatement(attrs, true));
   1776     ExprType = CompoundStmt;
   1777 
   1778     // If the substmt parsed correctly, build the AST node.
   1779     if (!Stmt.isInvalid())
   1780       Result = Actions.ActOnStmtExpr(OpenLoc, Stmt.take(), Tok.getLocation());
   1781   } else if (ExprType >= CompoundLiteral &&
   1782              (Tok.is(tok::kw___bridge) ||
   1783               Tok.is(tok::kw___bridge_transfer) ||
   1784               Tok.is(tok::kw___bridge_retained) ||
   1785               Tok.is(tok::kw___bridge_retain))) {
   1786     tok::TokenKind tokenKind = Tok.getKind();
   1787     SourceLocation BridgeKeywordLoc = ConsumeToken();
   1788 
   1789     // Parse an Objective-C ARC ownership cast expression.
   1790     ObjCBridgeCastKind Kind;
   1791     if (tokenKind == tok::kw___bridge)
   1792       Kind = OBC_Bridge;
   1793     else if (tokenKind == tok::kw___bridge_transfer)
   1794       Kind = OBC_BridgeTransfer;
   1795     else if (tokenKind == tok::kw___bridge_retained)
   1796       Kind = OBC_BridgeRetained;
   1797     else {
   1798       // As a hopefully temporary workaround, allow __bridge_retain as
   1799       // a synonym for __bridge_retained, but only in system headers.
   1800       assert(tokenKind == tok::kw___bridge_retain);
   1801       Kind = OBC_BridgeRetained;
   1802       if (!PP.getSourceManager().isInSystemHeader(BridgeKeywordLoc))
   1803         Diag(BridgeKeywordLoc, diag::err_arc_bridge_retain)
   1804           << FixItHint::CreateReplacement(BridgeKeywordLoc,
   1805                                           "__bridge_retained");
   1806     }
   1807 
   1808     TypeResult Ty = ParseTypeName();
   1809     SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, OpenLoc);
   1810     ExprResult SubExpr = ParseCastExpression(/*isUnaryExpression=*/false);
   1811 
   1812     if (Ty.isInvalid() || SubExpr.isInvalid())
   1813       return ExprError();
   1814 
   1815     return Actions.ActOnObjCBridgedCast(getCurScope(), OpenLoc, Kind,
   1816                                         BridgeKeywordLoc, Ty.get(),
   1817                                         RParenLoc, SubExpr.get());
   1818   } else if (ExprType >= CompoundLiteral &&
   1819              isTypeIdInParens(isAmbiguousTypeId)) {
   1820 
   1821     // Otherwise, this is a compound literal expression or cast expression.
   1822 
   1823     // In C++, if the type-id is ambiguous we disambiguate based on context.
   1824     // If stopIfCastExpr is true the context is a typeof/sizeof/alignof
   1825     // in which case we should treat it as type-id.
   1826     // if stopIfCastExpr is false, we need to determine the context past the
   1827     // parens, so we defer to ParseCXXAmbiguousParenExpression for that.
   1828     if (isAmbiguousTypeId && !stopIfCastExpr)
   1829       return ParseCXXAmbiguousParenExpression(ExprType, CastTy,
   1830                                               OpenLoc, RParenLoc);
   1831 
   1832     // Parse the type declarator.
   1833     DeclSpec DS(AttrFactory);
   1834     ParseSpecifierQualifierList(DS);
   1835     Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
   1836     ParseDeclarator(DeclaratorInfo);
   1837 
   1838     // If our type is followed by an identifier and either ':' or ']', then
   1839     // this is probably an Objective-C message send where the leading '[' is
   1840     // missing. Recover as if that were the case.
   1841     if (!DeclaratorInfo.isInvalidType() && Tok.is(tok::identifier) &&
   1842         !InMessageExpression && getLang().ObjC1 &&
   1843         (NextToken().is(tok::colon) || NextToken().is(tok::r_square))) {
   1844       TypeResult Ty;
   1845       {
   1846         InMessageExpressionRAIIObject InMessage(*this, false);
   1847         Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
   1848       }
   1849       Result = ParseObjCMessageExpressionBody(SourceLocation(),
   1850                                               SourceLocation(),
   1851                                               Ty.get(), 0);
   1852     } else {
   1853       // Match the ')'.
   1854       if (Tok.is(tok::r_paren))
   1855         RParenLoc = ConsumeParen();
   1856       else
   1857         MatchRHSPunctuation(tok::r_paren, OpenLoc);
   1858 
   1859       if (Tok.is(tok::l_brace)) {
   1860         ExprType = CompoundLiteral;
   1861         TypeResult Ty;
   1862         {
   1863           InMessageExpressionRAIIObject InMessage(*this, false);
   1864           Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
   1865         }
   1866         return ParseCompoundLiteralExpression(Ty.get(), OpenLoc, RParenLoc);
   1867       }
   1868 
   1869       if (ExprType == CastExpr) {
   1870         // We parsed '(' type-name ')' and the thing after it wasn't a '{'.
   1871 
   1872         if (DeclaratorInfo.isInvalidType())
   1873           return ExprError();
   1874 
   1875         // Note that this doesn't parse the subsequent cast-expression, it just
   1876         // returns the parsed type to the callee.
   1877         if (stopIfCastExpr) {
   1878           TypeResult Ty;
   1879           {
   1880             InMessageExpressionRAIIObject InMessage(*this, false);
   1881             Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
   1882           }
   1883           CastTy = Ty.get();
   1884           return ExprResult();
   1885         }
   1886 
   1887         // Reject the cast of super idiom in ObjC.
   1888         if (Tok.is(tok::identifier) && getLang().ObjC1 &&
   1889             Tok.getIdentifierInfo() == Ident_super &&
   1890             getCurScope()->isInObjcMethodScope() &&
   1891             GetLookAheadToken(1).isNot(tok::period)) {
   1892           Diag(Tok.getLocation(), diag::err_illegal_super_cast)
   1893             << SourceRange(OpenLoc, RParenLoc);
   1894           return ExprError();
   1895         }
   1896 
   1897         // Parse the cast-expression that follows it next.
   1898         // TODO: For cast expression with CastTy.
   1899         Result = ParseCastExpression(/*isUnaryExpression=*/false,
   1900                                      /*isAddressOfOperand=*/false,
   1901                                      /*isTypeCast=*/true);
   1902         if (!Result.isInvalid()) {
   1903           Result = Actions.ActOnCastExpr(getCurScope(), OpenLoc,
   1904                                          DeclaratorInfo, CastTy,
   1905                                          RParenLoc, Result.take());
   1906         }
   1907         return move(Result);
   1908       }
   1909 
   1910       Diag(Tok, diag::err_expected_lbrace_in_compound_literal);
   1911       return ExprError();
   1912     }
   1913   } else if (isTypeCast) {
   1914     // Parse the expression-list.
   1915     InMessageExpressionRAIIObject InMessage(*this, false);
   1916 
   1917     ExprVector ArgExprs(Actions);
   1918     CommaLocsTy CommaLocs;
   1919 
   1920     if (!ParseExpressionList(ArgExprs, CommaLocs)) {
   1921       ExprType = SimpleExpr;
   1922       Result = Actions.ActOnParenOrParenListExpr(OpenLoc, Tok.getLocation(),
   1923                                                  move_arg(ArgExprs));
   1924     }
   1925   } else {
   1926     InMessageExpressionRAIIObject InMessage(*this, false);
   1927 
   1928     Result = ParseExpression();
   1929     ExprType = SimpleExpr;
   1930 
   1931     // Don't build a paren expression unless we actually match a ')'.
   1932     if (!Result.isInvalid() && Tok.is(tok::r_paren))
   1933       Result = Actions.ActOnParenExpr(OpenLoc, Tok.getLocation(), Result.take());
   1934   }
   1935 
   1936   // Match the ')'.
   1937   if (Result.isInvalid()) {
   1938     SkipUntil(tok::r_paren);
   1939     return ExprError();
   1940   }
   1941 
   1942   if (Tok.is(tok::r_paren))
   1943     RParenLoc = ConsumeParen();
   1944   else
   1945     MatchRHSPunctuation(tok::r_paren, OpenLoc);
   1946 
   1947   return move(Result);
   1948 }
   1949 
   1950 /// ParseCompoundLiteralExpression - We have parsed the parenthesized type-name
   1951 /// and we are at the left brace.
   1952 ///
   1953 ///       postfix-expression: [C99 6.5.2]
   1954 ///         '(' type-name ')' '{' initializer-list '}'
   1955 ///         '(' type-name ')' '{' initializer-list ',' '}'
   1956 ///
   1957 ExprResult
   1958 Parser::ParseCompoundLiteralExpression(ParsedType Ty,
   1959                                        SourceLocation LParenLoc,
   1960                                        SourceLocation RParenLoc) {
   1961   assert(Tok.is(tok::l_brace) && "Not a compound literal!");
   1962   if (!getLang().C99)   // Compound literals don't exist in C90.
   1963     Diag(LParenLoc, diag::ext_c99_compound_literal);
   1964   ExprResult Result = ParseInitializer();
   1965   if (!Result.isInvalid() && Ty)
   1966     return Actions.ActOnCompoundLiteral(LParenLoc, Ty, RParenLoc, Result.take());
   1967   return move(Result);
   1968 }
   1969 
   1970 /// ParseStringLiteralExpression - This handles the various token types that
   1971 /// form string literals, and also handles string concatenation [C99 5.1.1.2,
   1972 /// translation phase #6].
   1973 ///
   1974 ///       primary-expression: [C99 6.5.1]
   1975 ///         string-literal
   1976 ExprResult Parser::ParseStringLiteralExpression() {
   1977   assert(isTokenStringLiteral() && "Not a string literal!");
   1978 
   1979   // String concat.  Note that keywords like __func__ and __FUNCTION__ are not
   1980   // considered to be strings for concatenation purposes.
   1981   llvm::SmallVector<Token, 4> StringToks;
   1982 
   1983   do {
   1984     StringToks.push_back(Tok);
   1985     ConsumeStringToken();
   1986   } while (isTokenStringLiteral());
   1987 
   1988   // Pass the set of string tokens, ready for concatenation, to the actions.
   1989   return Actions.ActOnStringLiteral(&StringToks[0], StringToks.size());
   1990 }
   1991 
   1992 /// ParseGenericSelectionExpression - Parse a C1X generic-selection
   1993 /// [C1X 6.5.1.1].
   1994 ///
   1995 ///    generic-selection:
   1996 ///           _Generic ( assignment-expression , generic-assoc-list )
   1997 ///    generic-assoc-list:
   1998 ///           generic-association
   1999 ///           generic-assoc-list , generic-association
   2000 ///    generic-association:
   2001 ///           type-name : assignment-expression
   2002 ///           default : assignment-expression
   2003 ExprResult Parser::ParseGenericSelectionExpression() {
   2004   assert(Tok.is(tok::kw__Generic) && "_Generic keyword expected");
   2005   SourceLocation KeyLoc = ConsumeToken();
   2006 
   2007   if (!getLang().C1X)
   2008     Diag(KeyLoc, diag::ext_c1x_generic_selection);
   2009 
   2010   SourceLocation LParenLoc = Tok.getLocation();
   2011   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen, ""))
   2012     return ExprError();
   2013 
   2014   ExprResult ControllingExpr;
   2015   {
   2016     // C1X 6.5.1.1p3 "The controlling expression of a generic selection is
   2017     // not evaluated."
   2018     EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated);
   2019     ControllingExpr = ParseAssignmentExpression();
   2020     if (ControllingExpr.isInvalid()) {
   2021       SkipUntil(tok::r_paren);
   2022       return ExprError();
   2023     }
   2024   }
   2025 
   2026   if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "")) {
   2027     SkipUntil(tok::r_paren);
   2028     return ExprError();
   2029   }
   2030 
   2031   SourceLocation DefaultLoc;
   2032   TypeVector Types(Actions);
   2033   ExprVector Exprs(Actions);
   2034   while (1) {
   2035     ParsedType Ty;
   2036     if (Tok.is(tok::kw_default)) {
   2037       // C1X 6.5.1.1p2 "A generic selection shall have no more than one default
   2038       // generic association."
   2039       if (!DefaultLoc.isInvalid()) {
   2040         Diag(Tok, diag::err_duplicate_default_assoc);
   2041         Diag(DefaultLoc, diag::note_previous_default_assoc);
   2042         SkipUntil(tok::r_paren);
   2043         return ExprError();
   2044       }
   2045       DefaultLoc = ConsumeToken();
   2046       Ty = ParsedType();
   2047     } else {
   2048       ColonProtectionRAIIObject X(*this);
   2049       TypeResult TR = ParseTypeName();
   2050       if (TR.isInvalid()) {
   2051         SkipUntil(tok::r_paren);
   2052         return ExprError();
   2053       }
   2054       Ty = TR.release();
   2055     }
   2056     Types.push_back(Ty);
   2057 
   2058     if (ExpectAndConsume(tok::colon, diag::err_expected_colon, "")) {
   2059       SkipUntil(tok::r_paren);
   2060       return ExprError();
   2061     }
   2062 
   2063     // FIXME: These expressions should be parsed in a potentially potentially
   2064     // evaluated context.
   2065     ExprResult ER(ParseAssignmentExpression());
   2066     if (ER.isInvalid()) {
   2067       SkipUntil(tok::r_paren);
   2068       return ExprError();
   2069     }
   2070     Exprs.push_back(ER.release());
   2071 
   2072     if (Tok.isNot(tok::comma))
   2073       break;
   2074     ConsumeToken();
   2075   }
   2076 
   2077   SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
   2078   if (RParenLoc.isInvalid())
   2079     return ExprError();
   2080 
   2081   return Actions.ActOnGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
   2082                                            ControllingExpr.release(),
   2083                                            move_arg(Types), move_arg(Exprs));
   2084 }
   2085 
   2086 /// ParseExpressionList - Used for C/C++ (argument-)expression-list.
   2087 ///
   2088 ///       argument-expression-list:
   2089 ///         assignment-expression
   2090 ///         argument-expression-list , assignment-expression
   2091 ///
   2092 /// [C++] expression-list:
   2093 /// [C++]   assignment-expression
   2094 /// [C++]   expression-list , assignment-expression
   2095 ///
   2096 /// [C++0x] expression-list:
   2097 /// [C++0x]   initializer-list
   2098 ///
   2099 /// [C++0x] initializer-list
   2100 /// [C++0x]   initializer-clause ...[opt]
   2101 /// [C++0x]   initializer-list , initializer-clause ...[opt]
   2102 ///
   2103 /// [C++0x] initializer-clause:
   2104 /// [C++0x]   assignment-expression
   2105 /// [C++0x]   braced-init-list
   2106 ///
   2107 bool Parser::ParseExpressionList(llvm::SmallVectorImpl<Expr*> &Exprs,
   2108                             llvm::SmallVectorImpl<SourceLocation> &CommaLocs,
   2109                                  void (Sema::*Completer)(Scope *S,
   2110                                                            Expr *Data,
   2111                                                            Expr **Args,
   2112                                                            unsigned NumArgs),
   2113                                  Expr *Data) {
   2114   while (1) {
   2115     if (Tok.is(tok::code_completion)) {
   2116       if (Completer)
   2117         (Actions.*Completer)(getCurScope(), Data, Exprs.data(), Exprs.size());
   2118       else
   2119         Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Expression);
   2120       ConsumeCodeCompletionToken();
   2121     }
   2122 
   2123     ExprResult Expr;
   2124     if (getLang().CPlusPlus0x && Tok.is(tok::l_brace))
   2125       Expr = ParseBraceInitializer();
   2126     else
   2127       Expr = ParseAssignmentExpression();
   2128 
   2129     if (Tok.is(tok::ellipsis))
   2130       Expr = Actions.ActOnPackExpansion(Expr.get(), ConsumeToken());
   2131     if (Expr.isInvalid())
   2132       return true;
   2133 
   2134     Exprs.push_back(Expr.release());
   2135 
   2136     if (Tok.isNot(tok::comma))
   2137       return false;
   2138     // Move to the next argument, remember where the comma was.
   2139     CommaLocs.push_back(ConsumeToken());
   2140   }
   2141 }
   2142 
   2143 /// ParseBlockId - Parse a block-id, which roughly looks like int (int x).
   2144 ///
   2145 /// [clang] block-id:
   2146 /// [clang]   specifier-qualifier-list block-declarator
   2147 ///
   2148 void Parser::ParseBlockId() {
   2149   if (Tok.is(tok::code_completion)) {
   2150     Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Type);
   2151     ConsumeCodeCompletionToken();
   2152   }
   2153 
   2154   // Parse the specifier-qualifier-list piece.
   2155   DeclSpec DS(AttrFactory);
   2156   ParseSpecifierQualifierList(DS);
   2157 
   2158   // Parse the block-declarator.
   2159   Declarator DeclaratorInfo(DS, Declarator::BlockLiteralContext);
   2160   ParseDeclarator(DeclaratorInfo);
   2161 
   2162   // We do this for: ^ __attribute__((noreturn)) {, as DS has the attributes.
   2163   DeclaratorInfo.takeAttributes(DS.getAttributes(), SourceLocation());
   2164 
   2165   MaybeParseGNUAttributes(DeclaratorInfo);
   2166 
   2167   // Inform sema that we are starting a block.
   2168   Actions.ActOnBlockArguments(DeclaratorInfo, getCurScope());
   2169 }
   2170 
   2171 /// ParseBlockLiteralExpression - Parse a block literal, which roughly looks
   2172 /// like ^(int x){ return x+1; }
   2173 ///
   2174 ///         block-literal:
   2175 /// [clang]   '^' block-args[opt] compound-statement
   2176 /// [clang]   '^' block-id compound-statement
   2177 /// [clang] block-args:
   2178 /// [clang]   '(' parameter-list ')'
   2179 ///
   2180 ExprResult Parser::ParseBlockLiteralExpression() {
   2181   assert(Tok.is(tok::caret) && "block literal starts with ^");
   2182   SourceLocation CaretLoc = ConsumeToken();
   2183 
   2184   PrettyStackTraceLoc CrashInfo(PP.getSourceManager(), CaretLoc,
   2185                                 "block literal parsing");
   2186 
   2187   // Enter a scope to hold everything within the block.  This includes the
   2188   // argument decls, decls within the compound expression, etc.  This also
   2189   // allows determining whether a variable reference inside the block is
   2190   // within or outside of the block.
   2191   ParseScope BlockScope(this, Scope::BlockScope | Scope::FnScope |
   2192                               Scope::BreakScope | Scope::ContinueScope |
   2193                               Scope::DeclScope);
   2194 
   2195   // Inform sema that we are starting a block.
   2196   Actions.ActOnBlockStart(CaretLoc, getCurScope());
   2197 
   2198   // Parse the return type if present.
   2199   DeclSpec DS(AttrFactory);
   2200   Declarator ParamInfo(DS, Declarator::BlockLiteralContext);
   2201   // FIXME: Since the return type isn't actually parsed, it can't be used to
   2202   // fill ParamInfo with an initial valid range, so do it manually.
   2203   ParamInfo.SetSourceRange(SourceRange(Tok.getLocation(), Tok.getLocation()));
   2204 
   2205   // If this block has arguments, parse them.  There is no ambiguity here with
   2206   // the expression case, because the expression case requires a parameter list.
   2207   if (Tok.is(tok::l_paren)) {
   2208     ParseParenDeclarator(ParamInfo);
   2209     // Parse the pieces after the identifier as if we had "int(...)".
   2210     // SetIdentifier sets the source range end, but in this case we're past
   2211     // that location.
   2212     SourceLocation Tmp = ParamInfo.getSourceRange().getEnd();
   2213     ParamInfo.SetIdentifier(0, CaretLoc);
   2214     ParamInfo.SetRangeEnd(Tmp);
   2215     if (ParamInfo.isInvalidType()) {
   2216       // If there was an error parsing the arguments, they may have
   2217       // tried to use ^(x+y) which requires an argument list.  Just
   2218       // skip the whole block literal.
   2219       Actions.ActOnBlockError(CaretLoc, getCurScope());
   2220       return ExprError();
   2221     }
   2222 
   2223     MaybeParseGNUAttributes(ParamInfo);
   2224 
   2225     // Inform sema that we are starting a block.
   2226     Actions.ActOnBlockArguments(ParamInfo, getCurScope());
   2227   } else if (!Tok.is(tok::l_brace)) {
   2228     ParseBlockId();
   2229   } else {
   2230     // Otherwise, pretend we saw (void).
   2231     ParsedAttributes attrs(AttrFactory);
   2232     ParamInfo.AddTypeInfo(DeclaratorChunk::getFunction(true, false,
   2233                                                        SourceLocation(),
   2234                                                        0, 0, 0,
   2235                                                        true, SourceLocation(),
   2236                                                        SourceLocation(),
   2237                                                        EST_None,
   2238                                                        SourceLocation(),
   2239                                                        0, 0, 0, 0,
   2240                                                        CaretLoc, CaretLoc,
   2241                                                        ParamInfo),
   2242                           attrs, CaretLoc);
   2243 
   2244     MaybeParseGNUAttributes(ParamInfo);
   2245 
   2246     // Inform sema that we are starting a block.
   2247     Actions.ActOnBlockArguments(ParamInfo, getCurScope());
   2248   }
   2249 
   2250 
   2251   ExprResult Result(true);
   2252   if (!Tok.is(tok::l_brace)) {
   2253     // Saw something like: ^expr
   2254     Diag(Tok, diag::err_expected_expression);
   2255     Actions.ActOnBlockError(CaretLoc, getCurScope());
   2256     return ExprError();
   2257   }
   2258 
   2259   StmtResult Stmt(ParseCompoundStatementBody());
   2260   BlockScope.Exit();
   2261   if (!Stmt.isInvalid())
   2262     Result = Actions.ActOnBlockStmtExpr(CaretLoc, Stmt.take(), getCurScope());
   2263   else
   2264     Actions.ActOnBlockError(CaretLoc, getCurScope());
   2265   return move(Result);
   2266 }
   2267