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