Home | History | Annotate | Download | only in Parse
      1 //===--- ParseExprCXX.cpp - C++ 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 for C++.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "clang/Parse/ParseDiagnostic.h"
     15 #include "clang/Parse/Parser.h"
     16 #include "RAIIObjectsForParser.h"
     17 #include "clang/Sema/DeclSpec.h"
     18 #include "clang/Sema/ParsedTemplate.h"
     19 #include "llvm/Support/ErrorHandling.h"
     20 
     21 using namespace clang;
     22 
     23 static int SelectDigraphErrorMessage(tok::TokenKind Kind) {
     24   switch (Kind) {
     25     case tok::kw_template:         return 0;
     26     case tok::kw_const_cast:       return 1;
     27     case tok::kw_dynamic_cast:     return 2;
     28     case tok::kw_reinterpret_cast: return 3;
     29     case tok::kw_static_cast:      return 4;
     30     default:
     31       assert(0 && "Unknown type for digraph error message.");
     32       return -1;
     33   }
     34 }
     35 
     36 // Are the two tokens adjacent in the same source file?
     37 static bool AreTokensAdjacent(Preprocessor &PP, Token &First, Token &Second) {
     38   SourceManager &SM = PP.getSourceManager();
     39   SourceLocation FirstLoc = SM.getSpellingLoc(First.getLocation());
     40   SourceLocation FirstEnd = FirstLoc.getFileLocWithOffset(First.getLength());
     41   return FirstEnd == SM.getSpellingLoc(Second.getLocation());
     42 }
     43 
     44 // Suggest fixit for "<::" after a cast.
     45 static void FixDigraph(Parser &P, Preprocessor &PP, Token &DigraphToken,
     46                        Token &ColonToken, tok::TokenKind Kind, bool AtDigraph) {
     47   // Pull '<:' and ':' off token stream.
     48   if (!AtDigraph)
     49     PP.Lex(DigraphToken);
     50   PP.Lex(ColonToken);
     51 
     52   SourceRange Range;
     53   Range.setBegin(DigraphToken.getLocation());
     54   Range.setEnd(ColonToken.getLocation());
     55   P.Diag(DigraphToken.getLocation(), diag::err_missing_whitespace_digraph)
     56       << SelectDigraphErrorMessage(Kind)
     57       << FixItHint::CreateReplacement(Range, "< ::");
     58 
     59   // Update token information to reflect their change in token type.
     60   ColonToken.setKind(tok::coloncolon);
     61   ColonToken.setLocation(ColonToken.getLocation().getFileLocWithOffset(-1));
     62   ColonToken.setLength(2);
     63   DigraphToken.setKind(tok::less);
     64   DigraphToken.setLength(1);
     65 
     66   // Push new tokens back to token stream.
     67   PP.EnterToken(ColonToken);
     68   if (!AtDigraph)
     69     PP.EnterToken(DigraphToken);
     70 }
     71 
     72 /// \brief Parse global scope or nested-name-specifier if present.
     73 ///
     74 /// Parses a C++ global scope specifier ('::') or nested-name-specifier (which
     75 /// may be preceded by '::'). Note that this routine will not parse ::new or
     76 /// ::delete; it will just leave them in the token stream.
     77 ///
     78 ///       '::'[opt] nested-name-specifier
     79 ///       '::'
     80 ///
     81 ///       nested-name-specifier:
     82 ///         type-name '::'
     83 ///         namespace-name '::'
     84 ///         nested-name-specifier identifier '::'
     85 ///         nested-name-specifier 'template'[opt] simple-template-id '::'
     86 ///
     87 ///
     88 /// \param SS the scope specifier that will be set to the parsed
     89 /// nested-name-specifier (or empty)
     90 ///
     91 /// \param ObjectType if this nested-name-specifier is being parsed following
     92 /// the "." or "->" of a member access expression, this parameter provides the
     93 /// type of the object whose members are being accessed.
     94 ///
     95 /// \param EnteringContext whether we will be entering into the context of
     96 /// the nested-name-specifier after parsing it.
     97 ///
     98 /// \param MayBePseudoDestructor When non-NULL, points to a flag that
     99 /// indicates whether this nested-name-specifier may be part of a
    100 /// pseudo-destructor name. In this case, the flag will be set false
    101 /// if we don't actually end up parsing a destructor name. Moreorover,
    102 /// if we do end up determining that we are parsing a destructor name,
    103 /// the last component of the nested-name-specifier is not parsed as
    104 /// part of the scope specifier.
    105 
    106 /// member access expression, e.g., the \p T:: in \p p->T::m.
    107 ///
    108 /// \returns true if there was an error parsing a scope specifier
    109 bool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS,
    110                                             ParsedType ObjectType,
    111                                             bool EnteringContext,
    112                                             bool *MayBePseudoDestructor,
    113                                             bool IsTypename) {
    114   assert(getLang().CPlusPlus &&
    115          "Call sites of this function should be guarded by checking for C++");
    116 
    117   if (Tok.is(tok::annot_cxxscope)) {
    118     Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(),
    119                                                  Tok.getAnnotationRange(),
    120                                                  SS);
    121     ConsumeToken();
    122     return false;
    123   }
    124 
    125   bool HasScopeSpecifier = false;
    126 
    127   if (Tok.is(tok::coloncolon)) {
    128     // ::new and ::delete aren't nested-name-specifiers.
    129     tok::TokenKind NextKind = NextToken().getKind();
    130     if (NextKind == tok::kw_new || NextKind == tok::kw_delete)
    131       return false;
    132 
    133     // '::' - Global scope qualifier.
    134     if (Actions.ActOnCXXGlobalScopeSpecifier(getCurScope(), ConsumeToken(), SS))
    135       return true;
    136 
    137     HasScopeSpecifier = true;
    138   }
    139 
    140   bool CheckForDestructor = false;
    141   if (MayBePseudoDestructor && *MayBePseudoDestructor) {
    142     CheckForDestructor = true;
    143     *MayBePseudoDestructor = false;
    144   }
    145 
    146   while (true) {
    147     if (HasScopeSpecifier) {
    148       // C++ [basic.lookup.classref]p5:
    149       //   If the qualified-id has the form
    150       //
    151       //       ::class-name-or-namespace-name::...
    152       //
    153       //   the class-name-or-namespace-name is looked up in global scope as a
    154       //   class-name or namespace-name.
    155       //
    156       // To implement this, we clear out the object type as soon as we've
    157       // seen a leading '::' or part of a nested-name-specifier.
    158       ObjectType = ParsedType();
    159 
    160       if (Tok.is(tok::code_completion)) {
    161         // Code completion for a nested-name-specifier, where the code
    162         // code completion token follows the '::'.
    163         Actions.CodeCompleteQualifiedId(getCurScope(), SS, EnteringContext);
    164         SourceLocation ccLoc = ConsumeCodeCompletionToken();
    165         // Include code completion token into the range of the scope otherwise
    166         // when we try to annotate the scope tokens the dangling code completion
    167         // token will cause assertion in
    168         // Preprocessor::AnnotatePreviousCachedTokens.
    169         SS.setEndLoc(ccLoc);
    170       }
    171     }
    172 
    173     // nested-name-specifier:
    174     //   nested-name-specifier 'template'[opt] simple-template-id '::'
    175 
    176     // Parse the optional 'template' keyword, then make sure we have
    177     // 'identifier <' after it.
    178     if (Tok.is(tok::kw_template)) {
    179       // If we don't have a scope specifier or an object type, this isn't a
    180       // nested-name-specifier, since they aren't allowed to start with
    181       // 'template'.
    182       if (!HasScopeSpecifier && !ObjectType)
    183         break;
    184 
    185       TentativeParsingAction TPA(*this);
    186       SourceLocation TemplateKWLoc = ConsumeToken();
    187 
    188       UnqualifiedId TemplateName;
    189       if (Tok.is(tok::identifier)) {
    190         // Consume the identifier.
    191         TemplateName.setIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
    192         ConsumeToken();
    193       } else if (Tok.is(tok::kw_operator)) {
    194         if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType,
    195                                        TemplateName)) {
    196           TPA.Commit();
    197           break;
    198         }
    199 
    200         if (TemplateName.getKind() != UnqualifiedId::IK_OperatorFunctionId &&
    201             TemplateName.getKind() != UnqualifiedId::IK_LiteralOperatorId) {
    202           Diag(TemplateName.getSourceRange().getBegin(),
    203                diag::err_id_after_template_in_nested_name_spec)
    204             << TemplateName.getSourceRange();
    205           TPA.Commit();
    206           break;
    207         }
    208       } else {
    209         TPA.Revert();
    210         break;
    211       }
    212 
    213       // If the next token is not '<', we have a qualified-id that refers
    214       // to a template name, such as T::template apply, but is not a
    215       // template-id.
    216       if (Tok.isNot(tok::less)) {
    217         TPA.Revert();
    218         break;
    219       }
    220 
    221       // Commit to parsing the template-id.
    222       TPA.Commit();
    223       TemplateTy Template;
    224       if (TemplateNameKind TNK = Actions.ActOnDependentTemplateName(getCurScope(),
    225                                                                 TemplateKWLoc,
    226                                                                     SS,
    227                                                                   TemplateName,
    228                                                                     ObjectType,
    229                                                                 EnteringContext,
    230                                                                     Template)) {
    231         if (AnnotateTemplateIdToken(Template, TNK, SS, TemplateName,
    232                                     TemplateKWLoc, false))
    233           return true;
    234       } else
    235         return true;
    236 
    237       continue;
    238     }
    239 
    240     if (Tok.is(tok::annot_template_id) && NextToken().is(tok::coloncolon)) {
    241       // We have
    242       //
    243       //   simple-template-id '::'
    244       //
    245       // So we need to check whether the simple-template-id is of the
    246       // right kind (it should name a type or be dependent), and then
    247       // convert it into a type within the nested-name-specifier.
    248       TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
    249       if (CheckForDestructor && GetLookAheadToken(2).is(tok::tilde)) {
    250         *MayBePseudoDestructor = true;
    251         return false;
    252       }
    253 
    254       // Consume the template-id token.
    255       ConsumeToken();
    256 
    257       assert(Tok.is(tok::coloncolon) && "NextToken() not working properly!");
    258       SourceLocation CCLoc = ConsumeToken();
    259 
    260       if (!HasScopeSpecifier)
    261         HasScopeSpecifier = true;
    262 
    263       ASTTemplateArgsPtr TemplateArgsPtr(Actions,
    264                                          TemplateId->getTemplateArgs(),
    265                                          TemplateId->NumArgs);
    266 
    267       if (Actions.ActOnCXXNestedNameSpecifier(getCurScope(),
    268                                               /*FIXME:*/SourceLocation(),
    269                                               SS,
    270                                               TemplateId->Template,
    271                                               TemplateId->TemplateNameLoc,
    272                                               TemplateId->LAngleLoc,
    273                                               TemplateArgsPtr,
    274                                               TemplateId->RAngleLoc,
    275                                               CCLoc,
    276                                               EnteringContext)) {
    277         SourceLocation StartLoc
    278           = SS.getBeginLoc().isValid()? SS.getBeginLoc()
    279                                       : TemplateId->TemplateNameLoc;
    280         SS.SetInvalid(SourceRange(StartLoc, CCLoc));
    281       }
    282 
    283       continue;
    284     }
    285 
    286 
    287     // The rest of the nested-name-specifier possibilities start with
    288     // tok::identifier.
    289     if (Tok.isNot(tok::identifier))
    290       break;
    291 
    292     IdentifierInfo &II = *Tok.getIdentifierInfo();
    293 
    294     // nested-name-specifier:
    295     //   type-name '::'
    296     //   namespace-name '::'
    297     //   nested-name-specifier identifier '::'
    298     Token Next = NextToken();
    299 
    300     // If we get foo:bar, this is almost certainly a typo for foo::bar.  Recover
    301     // and emit a fixit hint for it.
    302     if (Next.is(tok::colon) && !ColonIsSacred) {
    303       if (Actions.IsInvalidUnlessNestedName(getCurScope(), SS, II,
    304                                             Tok.getLocation(),
    305                                             Next.getLocation(), ObjectType,
    306                                             EnteringContext) &&
    307           // If the token after the colon isn't an identifier, it's still an
    308           // error, but they probably meant something else strange so don't
    309           // recover like this.
    310           PP.LookAhead(1).is(tok::identifier)) {
    311         Diag(Next, diag::err_unexected_colon_in_nested_name_spec)
    312           << FixItHint::CreateReplacement(Next.getLocation(), "::");
    313 
    314         // Recover as if the user wrote '::'.
    315         Next.setKind(tok::coloncolon);
    316       }
    317     }
    318 
    319     if (Next.is(tok::coloncolon)) {
    320       if (CheckForDestructor && GetLookAheadToken(2).is(tok::tilde) &&
    321           !Actions.isNonTypeNestedNameSpecifier(getCurScope(), SS, Tok.getLocation(),
    322                                                 II, ObjectType)) {
    323         *MayBePseudoDestructor = true;
    324         return false;
    325       }
    326 
    327       // We have an identifier followed by a '::'. Lookup this name
    328       // as the name in a nested-name-specifier.
    329       SourceLocation IdLoc = ConsumeToken();
    330       assert((Tok.is(tok::coloncolon) || Tok.is(tok::colon)) &&
    331              "NextToken() not working properly!");
    332       SourceLocation CCLoc = ConsumeToken();
    333 
    334       HasScopeSpecifier = true;
    335       if (Actions.ActOnCXXNestedNameSpecifier(getCurScope(), II, IdLoc, CCLoc,
    336                                               ObjectType, EnteringContext, SS))
    337         SS.SetInvalid(SourceRange(IdLoc, CCLoc));
    338 
    339       continue;
    340     }
    341 
    342     // Check for '<::' which should be '< ::' instead of '[:' when following
    343     // a template name.
    344     if (Next.is(tok::l_square) && Next.getLength() == 2) {
    345       Token SecondToken = GetLookAheadToken(2);
    346       if (SecondToken.is(tok::colon) &&
    347           AreTokensAdjacent(PP, Next, SecondToken)) {
    348         TemplateTy Template;
    349         UnqualifiedId TemplateName;
    350         TemplateName.setIdentifier(&II, Tok.getLocation());
    351         bool MemberOfUnknownSpecialization;
    352         if (Actions.isTemplateName(getCurScope(), SS,
    353                                    /*hasTemplateKeyword=*/false,
    354                                    TemplateName,
    355                                    ObjectType,
    356                                    EnteringContext,
    357                                    Template,
    358                                    MemberOfUnknownSpecialization)) {
    359           FixDigraph(*this, PP, Next, SecondToken, tok::kw_template,
    360                      /*AtDigraph*/false);
    361         }
    362       }
    363     }
    364 
    365     // nested-name-specifier:
    366     //   type-name '<'
    367     if (Next.is(tok::less)) {
    368       TemplateTy Template;
    369       UnqualifiedId TemplateName;
    370       TemplateName.setIdentifier(&II, Tok.getLocation());
    371       bool MemberOfUnknownSpecialization;
    372       if (TemplateNameKind TNK = Actions.isTemplateName(getCurScope(), SS,
    373                                               /*hasTemplateKeyword=*/false,
    374                                                         TemplateName,
    375                                                         ObjectType,
    376                                                         EnteringContext,
    377                                                         Template,
    378                                               MemberOfUnknownSpecialization)) {
    379         // We have found a template name, so annotate this this token
    380         // with a template-id annotation. We do not permit the
    381         // template-id to be translated into a type annotation,
    382         // because some clients (e.g., the parsing of class template
    383         // specializations) still want to see the original template-id
    384         // token.
    385         ConsumeToken();
    386         if (AnnotateTemplateIdToken(Template, TNK, SS, TemplateName,
    387                                     SourceLocation(), false))
    388           return true;
    389         continue;
    390       }
    391 
    392       if (MemberOfUnknownSpecialization && (ObjectType || SS.isSet()) &&
    393           (IsTypename || IsTemplateArgumentList(1))) {
    394         // We have something like t::getAs<T>, where getAs is a
    395         // member of an unknown specialization. However, this will only
    396         // parse correctly as a template, so suggest the keyword 'template'
    397         // before 'getAs' and treat this as a dependent template name.
    398         unsigned DiagID = diag::err_missing_dependent_template_keyword;
    399         if (getLang().Microsoft)
    400           DiagID = diag::warn_missing_dependent_template_keyword;
    401 
    402         Diag(Tok.getLocation(), DiagID)
    403           << II.getName()
    404           << FixItHint::CreateInsertion(Tok.getLocation(), "template ");
    405 
    406         if (TemplateNameKind TNK
    407               = Actions.ActOnDependentTemplateName(getCurScope(),
    408                                                    Tok.getLocation(), SS,
    409                                                    TemplateName, ObjectType,
    410                                                    EnteringContext, Template)) {
    411           // Consume the identifier.
    412           ConsumeToken();
    413           if (AnnotateTemplateIdToken(Template, TNK, SS, TemplateName,
    414                                       SourceLocation(), false))
    415             return true;
    416         }
    417         else
    418           return true;
    419 
    420         continue;
    421       }
    422     }
    423 
    424     // We don't have any tokens that form the beginning of a
    425     // nested-name-specifier, so we're done.
    426     break;
    427   }
    428 
    429   // Even if we didn't see any pieces of a nested-name-specifier, we
    430   // still check whether there is a tilde in this position, which
    431   // indicates a potential pseudo-destructor.
    432   if (CheckForDestructor && Tok.is(tok::tilde))
    433     *MayBePseudoDestructor = true;
    434 
    435   return false;
    436 }
    437 
    438 /// ParseCXXIdExpression - Handle id-expression.
    439 ///
    440 ///       id-expression:
    441 ///         unqualified-id
    442 ///         qualified-id
    443 ///
    444 ///       qualified-id:
    445 ///         '::'[opt] nested-name-specifier 'template'[opt] unqualified-id
    446 ///         '::' identifier
    447 ///         '::' operator-function-id
    448 ///         '::' template-id
    449 ///
    450 /// NOTE: The standard specifies that, for qualified-id, the parser does not
    451 /// expect:
    452 ///
    453 ///   '::' conversion-function-id
    454 ///   '::' '~' class-name
    455 ///
    456 /// This may cause a slight inconsistency on diagnostics:
    457 ///
    458 /// class C {};
    459 /// namespace A {}
    460 /// void f() {
    461 ///   :: A :: ~ C(); // Some Sema error about using destructor with a
    462 ///                  // namespace.
    463 ///   :: ~ C(); // Some Parser error like 'unexpected ~'.
    464 /// }
    465 ///
    466 /// We simplify the parser a bit and make it work like:
    467 ///
    468 ///       qualified-id:
    469 ///         '::'[opt] nested-name-specifier 'template'[opt] unqualified-id
    470 ///         '::' unqualified-id
    471 ///
    472 /// That way Sema can handle and report similar errors for namespaces and the
    473 /// global scope.
    474 ///
    475 /// The isAddressOfOperand parameter indicates that this id-expression is a
    476 /// direct operand of the address-of operator. This is, besides member contexts,
    477 /// the only place where a qualified-id naming a non-static class member may
    478 /// appear.
    479 ///
    480 ExprResult Parser::ParseCXXIdExpression(bool isAddressOfOperand) {
    481   // qualified-id:
    482   //   '::'[opt] nested-name-specifier 'template'[opt] unqualified-id
    483   //   '::' unqualified-id
    484   //
    485   CXXScopeSpec SS;
    486   ParseOptionalCXXScopeSpecifier(SS, ParsedType(), false);
    487 
    488   UnqualifiedId Name;
    489   if (ParseUnqualifiedId(SS,
    490                          /*EnteringContext=*/false,
    491                          /*AllowDestructorName=*/false,
    492                          /*AllowConstructorName=*/false,
    493                          /*ObjectType=*/ ParsedType(),
    494                          Name))
    495     return ExprError();
    496 
    497   // This is only the direct operand of an & operator if it is not
    498   // followed by a postfix-expression suffix.
    499   if (isAddressOfOperand && isPostfixExpressionSuffixStart())
    500     isAddressOfOperand = false;
    501 
    502   return Actions.ActOnIdExpression(getCurScope(), SS, Name, Tok.is(tok::l_paren),
    503                                    isAddressOfOperand);
    504 
    505 }
    506 
    507 /// ParseCXXCasts - This handles the various ways to cast expressions to another
    508 /// type.
    509 ///
    510 ///       postfix-expression: [C++ 5.2p1]
    511 ///         'dynamic_cast' '<' type-name '>' '(' expression ')'
    512 ///         'static_cast' '<' type-name '>' '(' expression ')'
    513 ///         'reinterpret_cast' '<' type-name '>' '(' expression ')'
    514 ///         'const_cast' '<' type-name '>' '(' expression ')'
    515 ///
    516 ExprResult Parser::ParseCXXCasts() {
    517   tok::TokenKind Kind = Tok.getKind();
    518   const char *CastName = 0;     // For error messages
    519 
    520   switch (Kind) {
    521   default: assert(0 && "Unknown C++ cast!"); abort();
    522   case tok::kw_const_cast:       CastName = "const_cast";       break;
    523   case tok::kw_dynamic_cast:     CastName = "dynamic_cast";     break;
    524   case tok::kw_reinterpret_cast: CastName = "reinterpret_cast"; break;
    525   case tok::kw_static_cast:      CastName = "static_cast";      break;
    526   }
    527 
    528   SourceLocation OpLoc = ConsumeToken();
    529   SourceLocation LAngleBracketLoc = Tok.getLocation();
    530 
    531   // Check for "<::" which is parsed as "[:".  If found, fix token stream,
    532   // diagnose error, suggest fix, and recover parsing.
    533   Token Next = NextToken();
    534   if (Tok.is(tok::l_square) && Tok.getLength() == 2 && Next.is(tok::colon) &&
    535       AreTokensAdjacent(PP, Tok, Next))
    536     FixDigraph(*this, PP, Tok, Next, Kind, /*AtDigraph*/true);
    537 
    538   if (ExpectAndConsume(tok::less, diag::err_expected_less_after, CastName))
    539     return ExprError();
    540 
    541   // Parse the common declaration-specifiers piece.
    542   DeclSpec DS(AttrFactory);
    543   ParseSpecifierQualifierList(DS);
    544 
    545   // Parse the abstract-declarator, if present.
    546   Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
    547   ParseDeclarator(DeclaratorInfo);
    548 
    549   SourceLocation RAngleBracketLoc = Tok.getLocation();
    550 
    551   if (ExpectAndConsume(tok::greater, diag::err_expected_greater))
    552     return ExprError(Diag(LAngleBracketLoc, diag::note_matching) << "<");
    553 
    554   SourceLocation LParenLoc = Tok.getLocation(), RParenLoc;
    555 
    556   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after, CastName))
    557     return ExprError();
    558 
    559   ExprResult Result = ParseExpression();
    560 
    561   // Match the ')'.
    562   RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
    563 
    564   if (!Result.isInvalid() && !DeclaratorInfo.isInvalidType())
    565     Result = Actions.ActOnCXXNamedCast(OpLoc, Kind,
    566                                        LAngleBracketLoc, DeclaratorInfo,
    567                                        RAngleBracketLoc,
    568                                        LParenLoc, Result.take(), RParenLoc);
    569 
    570   return move(Result);
    571 }
    572 
    573 /// ParseCXXTypeid - This handles the C++ typeid expression.
    574 ///
    575 ///       postfix-expression: [C++ 5.2p1]
    576 ///         'typeid' '(' expression ')'
    577 ///         'typeid' '(' type-id ')'
    578 ///
    579 ExprResult Parser::ParseCXXTypeid() {
    580   assert(Tok.is(tok::kw_typeid) && "Not 'typeid'!");
    581 
    582   SourceLocation OpLoc = ConsumeToken();
    583   SourceLocation LParenLoc = Tok.getLocation();
    584   SourceLocation RParenLoc;
    585 
    586   // typeid expressions are always parenthesized.
    587   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after,
    588       "typeid"))
    589     return ExprError();
    590 
    591   ExprResult Result;
    592 
    593   if (isTypeIdInParens()) {
    594     TypeResult Ty = ParseTypeName();
    595 
    596     // Match the ')'.
    597     RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
    598 
    599     if (Ty.isInvalid() || RParenLoc.isInvalid())
    600       return ExprError();
    601 
    602     Result = Actions.ActOnCXXTypeid(OpLoc, LParenLoc, /*isType=*/true,
    603                                     Ty.get().getAsOpaquePtr(), RParenLoc);
    604   } else {
    605     // C++0x [expr.typeid]p3:
    606     //   When typeid is applied to an expression other than an lvalue of a
    607     //   polymorphic class type [...] The expression is an unevaluated
    608     //   operand (Clause 5).
    609     //
    610     // Note that we can't tell whether the expression is an lvalue of a
    611     // polymorphic class type until after we've parsed the expression, so
    612     // we the expression is potentially potentially evaluated.
    613     EnterExpressionEvaluationContext Unevaluated(Actions,
    614                                        Sema::PotentiallyPotentiallyEvaluated);
    615     Result = ParseExpression();
    616 
    617     // Match the ')'.
    618     if (Result.isInvalid())
    619       SkipUntil(tok::r_paren);
    620     else {
    621       RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
    622       if (RParenLoc.isInvalid())
    623         return ExprError();
    624 
    625       // If we are a foo<int> that identifies a single function, resolve it now...
    626       Expr* e = Result.get();
    627       if (e->getType() == Actions.Context.OverloadTy) {
    628         ExprResult er =
    629               Actions.ResolveAndFixSingleFunctionTemplateSpecialization(e);
    630         if (er.isUsable())
    631           Result = er.release();
    632       }
    633       Result = Actions.ActOnCXXTypeid(OpLoc, LParenLoc, /*isType=*/false,
    634                                       Result.release(), RParenLoc);
    635     }
    636   }
    637 
    638   return move(Result);
    639 }
    640 
    641 /// ParseCXXUuidof - This handles the Microsoft C++ __uuidof expression.
    642 ///
    643 ///         '__uuidof' '(' expression ')'
    644 ///         '__uuidof' '(' type-id ')'
    645 ///
    646 ExprResult Parser::ParseCXXUuidof() {
    647   assert(Tok.is(tok::kw___uuidof) && "Not '__uuidof'!");
    648 
    649   SourceLocation OpLoc = ConsumeToken();
    650   SourceLocation LParenLoc = Tok.getLocation();
    651   SourceLocation RParenLoc;
    652 
    653   // __uuidof expressions are always parenthesized.
    654   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after,
    655       "__uuidof"))
    656     return ExprError();
    657 
    658   ExprResult Result;
    659 
    660   if (isTypeIdInParens()) {
    661     TypeResult Ty = ParseTypeName();
    662 
    663     // Match the ')'.
    664     RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
    665 
    666     if (Ty.isInvalid())
    667       return ExprError();
    668 
    669     Result = Actions.ActOnCXXUuidof(OpLoc, LParenLoc, /*isType=*/true,
    670                                     Ty.get().getAsOpaquePtr(), RParenLoc);
    671   } else {
    672     EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated);
    673     Result = ParseExpression();
    674 
    675     // Match the ')'.
    676     if (Result.isInvalid())
    677       SkipUntil(tok::r_paren);
    678     else {
    679       RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
    680 
    681       Result = Actions.ActOnCXXUuidof(OpLoc, LParenLoc, /*isType=*/false,
    682                                       Result.release(), RParenLoc);
    683     }
    684   }
    685 
    686   return move(Result);
    687 }
    688 
    689 /// \brief Parse a C++ pseudo-destructor expression after the base,
    690 /// . or -> operator, and nested-name-specifier have already been
    691 /// parsed.
    692 ///
    693 ///       postfix-expression: [C++ 5.2]
    694 ///         postfix-expression . pseudo-destructor-name
    695 ///         postfix-expression -> pseudo-destructor-name
    696 ///
    697 ///       pseudo-destructor-name:
    698 ///         ::[opt] nested-name-specifier[opt] type-name :: ~type-name
    699 ///         ::[opt] nested-name-specifier template simple-template-id ::
    700 ///                 ~type-name
    701 ///         ::[opt] nested-name-specifier[opt] ~type-name
    702 ///
    703 ExprResult
    704 Parser::ParseCXXPseudoDestructor(ExprArg Base, SourceLocation OpLoc,
    705                                  tok::TokenKind OpKind,
    706                                  CXXScopeSpec &SS,
    707                                  ParsedType ObjectType) {
    708   // We're parsing either a pseudo-destructor-name or a dependent
    709   // member access that has the same form as a
    710   // pseudo-destructor-name. We parse both in the same way and let
    711   // the action model sort them out.
    712   //
    713   // Note that the ::[opt] nested-name-specifier[opt] has already
    714   // been parsed, and if there was a simple-template-id, it has
    715   // been coalesced into a template-id annotation token.
    716   UnqualifiedId FirstTypeName;
    717   SourceLocation CCLoc;
    718   if (Tok.is(tok::identifier)) {
    719     FirstTypeName.setIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
    720     ConsumeToken();
    721     assert(Tok.is(tok::coloncolon) &&"ParseOptionalCXXScopeSpecifier fail");
    722     CCLoc = ConsumeToken();
    723   } else if (Tok.is(tok::annot_template_id)) {
    724     FirstTypeName.setTemplateId(
    725                               (TemplateIdAnnotation *)Tok.getAnnotationValue());
    726     ConsumeToken();
    727     assert(Tok.is(tok::coloncolon) &&"ParseOptionalCXXScopeSpecifier fail");
    728     CCLoc = ConsumeToken();
    729   } else {
    730     FirstTypeName.setIdentifier(0, SourceLocation());
    731   }
    732 
    733   // Parse the tilde.
    734   assert(Tok.is(tok::tilde) && "ParseOptionalCXXScopeSpecifier fail");
    735   SourceLocation TildeLoc = ConsumeToken();
    736   if (!Tok.is(tok::identifier)) {
    737     Diag(Tok, diag::err_destructor_tilde_identifier);
    738     return ExprError();
    739   }
    740 
    741   // Parse the second type.
    742   UnqualifiedId SecondTypeName;
    743   IdentifierInfo *Name = Tok.getIdentifierInfo();
    744   SourceLocation NameLoc = ConsumeToken();
    745   SecondTypeName.setIdentifier(Name, NameLoc);
    746 
    747   // If there is a '<', the second type name is a template-id. Parse
    748   // it as such.
    749   if (Tok.is(tok::less) &&
    750       ParseUnqualifiedIdTemplateId(SS, Name, NameLoc, false, ObjectType,
    751                                    SecondTypeName, /*AssumeTemplateName=*/true,
    752                                    /*TemplateKWLoc*/SourceLocation()))
    753     return ExprError();
    754 
    755   return Actions.ActOnPseudoDestructorExpr(getCurScope(), Base,
    756                                            OpLoc, OpKind,
    757                                            SS, FirstTypeName, CCLoc,
    758                                            TildeLoc, SecondTypeName,
    759                                            Tok.is(tok::l_paren));
    760 }
    761 
    762 /// ParseCXXBoolLiteral - This handles the C++ Boolean literals.
    763 ///
    764 ///       boolean-literal: [C++ 2.13.5]
    765 ///         'true'
    766 ///         'false'
    767 ExprResult Parser::ParseCXXBoolLiteral() {
    768   tok::TokenKind Kind = Tok.getKind();
    769   return Actions.ActOnCXXBoolLiteral(ConsumeToken(), Kind);
    770 }
    771 
    772 /// ParseThrowExpression - This handles the C++ throw expression.
    773 ///
    774 ///       throw-expression: [C++ 15]
    775 ///         'throw' assignment-expression[opt]
    776 ExprResult Parser::ParseThrowExpression() {
    777   assert(Tok.is(tok::kw_throw) && "Not throw!");
    778   SourceLocation ThrowLoc = ConsumeToken();           // Eat the throw token.
    779 
    780   // If the current token isn't the start of an assignment-expression,
    781   // then the expression is not present.  This handles things like:
    782   //   "C ? throw : (void)42", which is crazy but legal.
    783   switch (Tok.getKind()) {  // FIXME: move this predicate somewhere common.
    784   case tok::semi:
    785   case tok::r_paren:
    786   case tok::r_square:
    787   case tok::r_brace:
    788   case tok::colon:
    789   case tok::comma:
    790     return Actions.ActOnCXXThrow(getCurScope(), ThrowLoc, 0);
    791 
    792   default:
    793     ExprResult Expr(ParseAssignmentExpression());
    794     if (Expr.isInvalid()) return move(Expr);
    795     return Actions.ActOnCXXThrow(getCurScope(), ThrowLoc, Expr.take());
    796   }
    797 }
    798 
    799 /// ParseCXXThis - This handles the C++ 'this' pointer.
    800 ///
    801 /// C++ 9.3.2: In the body of a non-static member function, the keyword this is
    802 /// a non-lvalue expression whose value is the address of the object for which
    803 /// the function is called.
    804 ExprResult Parser::ParseCXXThis() {
    805   assert(Tok.is(tok::kw_this) && "Not 'this'!");
    806   SourceLocation ThisLoc = ConsumeToken();
    807   return Actions.ActOnCXXThis(ThisLoc);
    808 }
    809 
    810 /// ParseCXXTypeConstructExpression - Parse construction of a specified type.
    811 /// Can be interpreted either as function-style casting ("int(x)")
    812 /// or class type construction ("ClassType(x,y,z)")
    813 /// or creation of a value-initialized type ("int()").
    814 /// See [C++ 5.2.3].
    815 ///
    816 ///       postfix-expression: [C++ 5.2p1]
    817 ///         simple-type-specifier '(' expression-list[opt] ')'
    818 /// [C++0x] simple-type-specifier braced-init-list
    819 ///         typename-specifier '(' expression-list[opt] ')'
    820 /// [C++0x] typename-specifier braced-init-list
    821 ///
    822 ExprResult
    823 Parser::ParseCXXTypeConstructExpression(const DeclSpec &DS) {
    824   Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
    825   ParsedType TypeRep = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo).get();
    826 
    827   assert((Tok.is(tok::l_paren) ||
    828           (getLang().CPlusPlus0x && Tok.is(tok::l_brace)))
    829          && "Expected '(' or '{'!");
    830 
    831   if (Tok.is(tok::l_brace)) {
    832 
    833     // FIXME: Convert to a proper type construct expression.
    834     return ParseBraceInitializer();
    835 
    836   } else {
    837     GreaterThanIsOperatorScope G(GreaterThanIsOperator, true);
    838 
    839     SourceLocation LParenLoc = ConsumeParen();
    840 
    841     ExprVector Exprs(Actions);
    842     CommaLocsTy CommaLocs;
    843 
    844     if (Tok.isNot(tok::r_paren)) {
    845       if (ParseExpressionList(Exprs, CommaLocs)) {
    846         SkipUntil(tok::r_paren);
    847         return ExprError();
    848       }
    849     }
    850 
    851     // Match the ')'.
    852     SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
    853 
    854     // TypeRep could be null, if it references an invalid typedef.
    855     if (!TypeRep)
    856       return ExprError();
    857 
    858     assert((Exprs.size() == 0 || Exprs.size()-1 == CommaLocs.size())&&
    859            "Unexpected number of commas!");
    860     return Actions.ActOnCXXTypeConstructExpr(TypeRep, LParenLoc, move_arg(Exprs),
    861                                              RParenLoc);
    862   }
    863 }
    864 
    865 /// ParseCXXCondition - if/switch/while condition expression.
    866 ///
    867 ///       condition:
    868 ///         expression
    869 ///         type-specifier-seq declarator '=' assignment-expression
    870 /// [GNU]   type-specifier-seq declarator simple-asm-expr[opt] attributes[opt]
    871 ///             '=' assignment-expression
    872 ///
    873 /// \param ExprResult if the condition was parsed as an expression, the
    874 /// parsed expression.
    875 ///
    876 /// \param DeclResult if the condition was parsed as a declaration, the
    877 /// parsed declaration.
    878 ///
    879 /// \param Loc The location of the start of the statement that requires this
    880 /// condition, e.g., the "for" in a for loop.
    881 ///
    882 /// \param ConvertToBoolean Whether the condition expression should be
    883 /// converted to a boolean value.
    884 ///
    885 /// \returns true if there was a parsing, false otherwise.
    886 bool Parser::ParseCXXCondition(ExprResult &ExprOut,
    887                                Decl *&DeclOut,
    888                                SourceLocation Loc,
    889                                bool ConvertToBoolean) {
    890   if (Tok.is(tok::code_completion)) {
    891     Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Condition);
    892     ConsumeCodeCompletionToken();
    893   }
    894 
    895   if (!isCXXConditionDeclaration()) {
    896     // Parse the expression.
    897     ExprOut = ParseExpression(); // expression
    898     DeclOut = 0;
    899     if (ExprOut.isInvalid())
    900       return true;
    901 
    902     // If required, convert to a boolean value.
    903     if (ConvertToBoolean)
    904       ExprOut
    905         = Actions.ActOnBooleanCondition(getCurScope(), Loc, ExprOut.get());
    906     return ExprOut.isInvalid();
    907   }
    908 
    909   // type-specifier-seq
    910   DeclSpec DS(AttrFactory);
    911   ParseSpecifierQualifierList(DS);
    912 
    913   // declarator
    914   Declarator DeclaratorInfo(DS, Declarator::ConditionContext);
    915   ParseDeclarator(DeclaratorInfo);
    916 
    917   // simple-asm-expr[opt]
    918   if (Tok.is(tok::kw_asm)) {
    919     SourceLocation Loc;
    920     ExprResult AsmLabel(ParseSimpleAsm(&Loc));
    921     if (AsmLabel.isInvalid()) {
    922       SkipUntil(tok::semi);
    923       return true;
    924     }
    925     DeclaratorInfo.setAsmLabel(AsmLabel.release());
    926     DeclaratorInfo.SetRangeEnd(Loc);
    927   }
    928 
    929   // If attributes are present, parse them.
    930   MaybeParseGNUAttributes(DeclaratorInfo);
    931 
    932   // Type-check the declaration itself.
    933   DeclResult Dcl = Actions.ActOnCXXConditionDeclaration(getCurScope(),
    934                                                         DeclaratorInfo);
    935   DeclOut = Dcl.get();
    936   ExprOut = ExprError();
    937 
    938   // '=' assignment-expression
    939   if (isTokenEqualOrMistypedEqualEqual(
    940                                diag::err_invalid_equalequal_after_declarator)) {
    941     ConsumeToken();
    942     ExprResult AssignExpr(ParseAssignmentExpression());
    943     if (!AssignExpr.isInvalid())
    944       Actions.AddInitializerToDecl(DeclOut, AssignExpr.take(), false,
    945                                    DS.getTypeSpecType() == DeclSpec::TST_auto);
    946   } else {
    947     // FIXME: C++0x allows a braced-init-list
    948     Diag(Tok, diag::err_expected_equal_after_declarator);
    949   }
    950 
    951   // FIXME: Build a reference to this declaration? Convert it to bool?
    952   // (This is currently handled by Sema).
    953 
    954   Actions.FinalizeDeclaration(DeclOut);
    955 
    956   return false;
    957 }
    958 
    959 /// \brief Determine whether the current token starts a C++
    960 /// simple-type-specifier.
    961 bool Parser::isCXXSimpleTypeSpecifier() const {
    962   switch (Tok.getKind()) {
    963   case tok::annot_typename:
    964   case tok::kw_short:
    965   case tok::kw_long:
    966   case tok::kw___int64:
    967   case tok::kw_signed:
    968   case tok::kw_unsigned:
    969   case tok::kw_void:
    970   case tok::kw_char:
    971   case tok::kw_int:
    972   case tok::kw_float:
    973   case tok::kw_double:
    974   case tok::kw_wchar_t:
    975   case tok::kw_char16_t:
    976   case tok::kw_char32_t:
    977   case tok::kw_bool:
    978   case tok::kw_decltype:
    979   case tok::kw_typeof:
    980   case tok::kw___underlying_type:
    981     return true;
    982 
    983   default:
    984     break;
    985   }
    986 
    987   return false;
    988 }
    989 
    990 /// ParseCXXSimpleTypeSpecifier - [C++ 7.1.5.2] Simple type specifiers.
    991 /// This should only be called when the current token is known to be part of
    992 /// simple-type-specifier.
    993 ///
    994 ///       simple-type-specifier:
    995 ///         '::'[opt] nested-name-specifier[opt] type-name
    996 ///         '::'[opt] nested-name-specifier 'template' simple-template-id [TODO]
    997 ///         char
    998 ///         wchar_t
    999 ///         bool
   1000 ///         short
   1001 ///         int
   1002 ///         long
   1003 ///         signed
   1004 ///         unsigned
   1005 ///         float
   1006 ///         double
   1007 ///         void
   1008 /// [GNU]   typeof-specifier
   1009 /// [C++0x] auto               [TODO]
   1010 ///
   1011 ///       type-name:
   1012 ///         class-name
   1013 ///         enum-name
   1014 ///         typedef-name
   1015 ///
   1016 void Parser::ParseCXXSimpleTypeSpecifier(DeclSpec &DS) {
   1017   DS.SetRangeStart(Tok.getLocation());
   1018   const char *PrevSpec;
   1019   unsigned DiagID;
   1020   SourceLocation Loc = Tok.getLocation();
   1021 
   1022   switch (Tok.getKind()) {
   1023   case tok::identifier:   // foo::bar
   1024   case tok::coloncolon:   // ::foo::bar
   1025     assert(0 && "Annotation token should already be formed!");
   1026   default:
   1027     assert(0 && "Not a simple-type-specifier token!");
   1028     abort();
   1029 
   1030   // type-name
   1031   case tok::annot_typename: {
   1032     if (getTypeAnnotation(Tok))
   1033       DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec, DiagID,
   1034                          getTypeAnnotation(Tok));
   1035     else
   1036       DS.SetTypeSpecError();
   1037 
   1038     DS.SetRangeEnd(Tok.getAnnotationEndLoc());
   1039     ConsumeToken();
   1040 
   1041     // Objective-C supports syntax of the form 'id<proto1,proto2>' where 'id'
   1042     // is a specific typedef and 'itf<proto1,proto2>' where 'itf' is an
   1043     // Objective-C interface.  If we don't have Objective-C or a '<', this is
   1044     // just a normal reference to a typedef name.
   1045     if (Tok.is(tok::less) && getLang().ObjC1)
   1046       ParseObjCProtocolQualifiers(DS);
   1047 
   1048     DS.Finish(Diags, PP);
   1049     return;
   1050   }
   1051 
   1052   // builtin types
   1053   case tok::kw_short:
   1054     DS.SetTypeSpecWidth(DeclSpec::TSW_short, Loc, PrevSpec, DiagID);
   1055     break;
   1056   case tok::kw_long:
   1057     DS.SetTypeSpecWidth(DeclSpec::TSW_long, Loc, PrevSpec, DiagID);
   1058     break;
   1059   case tok::kw___int64:
   1060     DS.SetTypeSpecWidth(DeclSpec::TSW_longlong, Loc, PrevSpec, DiagID);
   1061     break;
   1062   case tok::kw_signed:
   1063     DS.SetTypeSpecSign(DeclSpec::TSS_signed, Loc, PrevSpec, DiagID);
   1064     break;
   1065   case tok::kw_unsigned:
   1066     DS.SetTypeSpecSign(DeclSpec::TSS_unsigned, Loc, PrevSpec, DiagID);
   1067     break;
   1068   case tok::kw_void:
   1069     DS.SetTypeSpecType(DeclSpec::TST_void, Loc, PrevSpec, DiagID);
   1070     break;
   1071   case tok::kw_char:
   1072     DS.SetTypeSpecType(DeclSpec::TST_char, Loc, PrevSpec, DiagID);
   1073     break;
   1074   case tok::kw_int:
   1075     DS.SetTypeSpecType(DeclSpec::TST_int, Loc, PrevSpec, DiagID);
   1076     break;
   1077   case tok::kw_float:
   1078     DS.SetTypeSpecType(DeclSpec::TST_float, Loc, PrevSpec, DiagID);
   1079     break;
   1080   case tok::kw_double:
   1081     DS.SetTypeSpecType(DeclSpec::TST_double, Loc, PrevSpec, DiagID);
   1082     break;
   1083   case tok::kw_wchar_t:
   1084     DS.SetTypeSpecType(DeclSpec::TST_wchar, Loc, PrevSpec, DiagID);
   1085     break;
   1086   case tok::kw_char16_t:
   1087     DS.SetTypeSpecType(DeclSpec::TST_char16, Loc, PrevSpec, DiagID);
   1088     break;
   1089   case tok::kw_char32_t:
   1090     DS.SetTypeSpecType(DeclSpec::TST_char32, Loc, PrevSpec, DiagID);
   1091     break;
   1092   case tok::kw_bool:
   1093     DS.SetTypeSpecType(DeclSpec::TST_bool, Loc, PrevSpec, DiagID);
   1094     break;
   1095 
   1096     // FIXME: C++0x decltype support.
   1097   // GNU typeof support.
   1098   case tok::kw_typeof:
   1099     ParseTypeofSpecifier(DS);
   1100     DS.Finish(Diags, PP);
   1101     return;
   1102   }
   1103   if (Tok.is(tok::annot_typename))
   1104     DS.SetRangeEnd(Tok.getAnnotationEndLoc());
   1105   else
   1106     DS.SetRangeEnd(Tok.getLocation());
   1107   ConsumeToken();
   1108   DS.Finish(Diags, PP);
   1109 }
   1110 
   1111 /// ParseCXXTypeSpecifierSeq - Parse a C++ type-specifier-seq (C++
   1112 /// [dcl.name]), which is a non-empty sequence of type-specifiers,
   1113 /// e.g., "const short int". Note that the DeclSpec is *not* finished
   1114 /// by parsing the type-specifier-seq, because these sequences are
   1115 /// typically followed by some form of declarator. Returns true and
   1116 /// emits diagnostics if this is not a type-specifier-seq, false
   1117 /// otherwise.
   1118 ///
   1119 ///   type-specifier-seq: [C++ 8.1]
   1120 ///     type-specifier type-specifier-seq[opt]
   1121 ///
   1122 bool Parser::ParseCXXTypeSpecifierSeq(DeclSpec &DS) {
   1123   DS.SetRangeStart(Tok.getLocation());
   1124   const char *PrevSpec = 0;
   1125   unsigned DiagID;
   1126   bool isInvalid = 0;
   1127 
   1128   // Parse one or more of the type specifiers.
   1129   if (!ParseOptionalTypeSpecifier(DS, isInvalid, PrevSpec, DiagID,
   1130       ParsedTemplateInfo(), /*SuppressDeclarations*/true)) {
   1131     Diag(Tok, diag::err_expected_type);
   1132     return true;
   1133   }
   1134 
   1135   while (ParseOptionalTypeSpecifier(DS, isInvalid, PrevSpec, DiagID,
   1136          ParsedTemplateInfo(), /*SuppressDeclarations*/true))
   1137   {}
   1138 
   1139   DS.Finish(Diags, PP);
   1140   return false;
   1141 }
   1142 
   1143 /// \brief Finish parsing a C++ unqualified-id that is a template-id of
   1144 /// some form.
   1145 ///
   1146 /// This routine is invoked when a '<' is encountered after an identifier or
   1147 /// operator-function-id is parsed by \c ParseUnqualifiedId() to determine
   1148 /// whether the unqualified-id is actually a template-id. This routine will
   1149 /// then parse the template arguments and form the appropriate template-id to
   1150 /// return to the caller.
   1151 ///
   1152 /// \param SS the nested-name-specifier that precedes this template-id, if
   1153 /// we're actually parsing a qualified-id.
   1154 ///
   1155 /// \param Name for constructor and destructor names, this is the actual
   1156 /// identifier that may be a template-name.
   1157 ///
   1158 /// \param NameLoc the location of the class-name in a constructor or
   1159 /// destructor.
   1160 ///
   1161 /// \param EnteringContext whether we're entering the scope of the
   1162 /// nested-name-specifier.
   1163 ///
   1164 /// \param ObjectType if this unqualified-id occurs within a member access
   1165 /// expression, the type of the base object whose member is being accessed.
   1166 ///
   1167 /// \param Id as input, describes the template-name or operator-function-id
   1168 /// that precedes the '<'. If template arguments were parsed successfully,
   1169 /// will be updated with the template-id.
   1170 ///
   1171 /// \param AssumeTemplateId When true, this routine will assume that the name
   1172 /// refers to a template without performing name lookup to verify.
   1173 ///
   1174 /// \returns true if a parse error occurred, false otherwise.
   1175 bool Parser::ParseUnqualifiedIdTemplateId(CXXScopeSpec &SS,
   1176                                           IdentifierInfo *Name,
   1177                                           SourceLocation NameLoc,
   1178                                           bool EnteringContext,
   1179                                           ParsedType ObjectType,
   1180                                           UnqualifiedId &Id,
   1181                                           bool AssumeTemplateId,
   1182                                           SourceLocation TemplateKWLoc) {
   1183   assert((AssumeTemplateId || Tok.is(tok::less)) &&
   1184          "Expected '<' to finish parsing a template-id");
   1185 
   1186   TemplateTy Template;
   1187   TemplateNameKind TNK = TNK_Non_template;
   1188   switch (Id.getKind()) {
   1189   case UnqualifiedId::IK_Identifier:
   1190   case UnqualifiedId::IK_OperatorFunctionId:
   1191   case UnqualifiedId::IK_LiteralOperatorId:
   1192     if (AssumeTemplateId) {
   1193       TNK = Actions.ActOnDependentTemplateName(getCurScope(), TemplateKWLoc, SS,
   1194                                                Id, ObjectType, EnteringContext,
   1195                                                Template);
   1196       if (TNK == TNK_Non_template)
   1197         return true;
   1198     } else {
   1199       bool MemberOfUnknownSpecialization;
   1200       TNK = Actions.isTemplateName(getCurScope(), SS,
   1201                                    TemplateKWLoc.isValid(), Id,
   1202                                    ObjectType, EnteringContext, Template,
   1203                                    MemberOfUnknownSpecialization);
   1204 
   1205       if (TNK == TNK_Non_template && MemberOfUnknownSpecialization &&
   1206           ObjectType && IsTemplateArgumentList()) {
   1207         // We have something like t->getAs<T>(), where getAs is a
   1208         // member of an unknown specialization. However, this will only
   1209         // parse correctly as a template, so suggest the keyword 'template'
   1210         // before 'getAs' and treat this as a dependent template name.
   1211         std::string Name;
   1212         if (Id.getKind() == UnqualifiedId::IK_Identifier)
   1213           Name = Id.Identifier->getName();
   1214         else {
   1215           Name = "operator ";
   1216           if (Id.getKind() == UnqualifiedId::IK_OperatorFunctionId)
   1217             Name += getOperatorSpelling(Id.OperatorFunctionId.Operator);
   1218           else
   1219             Name += Id.Identifier->getName();
   1220         }
   1221         Diag(Id.StartLocation, diag::err_missing_dependent_template_keyword)
   1222           << Name
   1223           << FixItHint::CreateInsertion(Id.StartLocation, "template ");
   1224         TNK = Actions.ActOnDependentTemplateName(getCurScope(), TemplateKWLoc,
   1225                                                  SS, Id, ObjectType,
   1226                                                  EnteringContext, Template);
   1227         if (TNK == TNK_Non_template)
   1228           return true;
   1229       }
   1230     }
   1231     break;
   1232 
   1233   case UnqualifiedId::IK_ConstructorName: {
   1234     UnqualifiedId TemplateName;
   1235     bool MemberOfUnknownSpecialization;
   1236     TemplateName.setIdentifier(Name, NameLoc);
   1237     TNK = Actions.isTemplateName(getCurScope(), SS, TemplateKWLoc.isValid(),
   1238                                  TemplateName, ObjectType,
   1239                                  EnteringContext, Template,
   1240                                  MemberOfUnknownSpecialization);
   1241     break;
   1242   }
   1243 
   1244   case UnqualifiedId::IK_DestructorName: {
   1245     UnqualifiedId TemplateName;
   1246     bool MemberOfUnknownSpecialization;
   1247     TemplateName.setIdentifier(Name, NameLoc);
   1248     if (ObjectType) {
   1249       TNK = Actions.ActOnDependentTemplateName(getCurScope(), TemplateKWLoc, SS,
   1250                                                TemplateName, ObjectType,
   1251                                                EnteringContext, Template);
   1252       if (TNK == TNK_Non_template)
   1253         return true;
   1254     } else {
   1255       TNK = Actions.isTemplateName(getCurScope(), SS, TemplateKWLoc.isValid(),
   1256                                    TemplateName, ObjectType,
   1257                                    EnteringContext, Template,
   1258                                    MemberOfUnknownSpecialization);
   1259 
   1260       if (TNK == TNK_Non_template && !Id.DestructorName.get()) {
   1261         Diag(NameLoc, diag::err_destructor_template_id)
   1262           << Name << SS.getRange();
   1263         return true;
   1264       }
   1265     }
   1266     break;
   1267   }
   1268 
   1269   default:
   1270     return false;
   1271   }
   1272 
   1273   if (TNK == TNK_Non_template)
   1274     return false;
   1275 
   1276   // Parse the enclosed template argument list.
   1277   SourceLocation LAngleLoc, RAngleLoc;
   1278   TemplateArgList TemplateArgs;
   1279   if (Tok.is(tok::less) &&
   1280       ParseTemplateIdAfterTemplateName(Template, Id.StartLocation,
   1281                                        SS, true, LAngleLoc,
   1282                                        TemplateArgs,
   1283                                        RAngleLoc))
   1284     return true;
   1285 
   1286   if (Id.getKind() == UnqualifiedId::IK_Identifier ||
   1287       Id.getKind() == UnqualifiedId::IK_OperatorFunctionId ||
   1288       Id.getKind() == UnqualifiedId::IK_LiteralOperatorId) {
   1289     // Form a parsed representation of the template-id to be stored in the
   1290     // UnqualifiedId.
   1291     TemplateIdAnnotation *TemplateId
   1292       = TemplateIdAnnotation::Allocate(TemplateArgs.size());
   1293 
   1294     if (Id.getKind() == UnqualifiedId::IK_Identifier) {
   1295       TemplateId->Name = Id.Identifier;
   1296       TemplateId->Operator = OO_None;
   1297       TemplateId->TemplateNameLoc = Id.StartLocation;
   1298     } else {
   1299       TemplateId->Name = 0;
   1300       TemplateId->Operator = Id.OperatorFunctionId.Operator;
   1301       TemplateId->TemplateNameLoc = Id.StartLocation;
   1302     }
   1303 
   1304     TemplateId->SS = SS;
   1305     TemplateId->Template = Template;
   1306     TemplateId->Kind = TNK;
   1307     TemplateId->LAngleLoc = LAngleLoc;
   1308     TemplateId->RAngleLoc = RAngleLoc;
   1309     ParsedTemplateArgument *Args = TemplateId->getTemplateArgs();
   1310     for (unsigned Arg = 0, ArgEnd = TemplateArgs.size();
   1311          Arg != ArgEnd; ++Arg)
   1312       Args[Arg] = TemplateArgs[Arg];
   1313 
   1314     Id.setTemplateId(TemplateId);
   1315     return false;
   1316   }
   1317 
   1318   // Bundle the template arguments together.
   1319   ASTTemplateArgsPtr TemplateArgsPtr(Actions, TemplateArgs.data(),
   1320                                      TemplateArgs.size());
   1321 
   1322   // Constructor and destructor names.
   1323   TypeResult Type
   1324     = Actions.ActOnTemplateIdType(SS, Template, NameLoc,
   1325                                   LAngleLoc, TemplateArgsPtr,
   1326                                   RAngleLoc);
   1327   if (Type.isInvalid())
   1328     return true;
   1329 
   1330   if (Id.getKind() == UnqualifiedId::IK_ConstructorName)
   1331     Id.setConstructorName(Type.get(), NameLoc, RAngleLoc);
   1332   else
   1333     Id.setDestructorName(Id.StartLocation, Type.get(), RAngleLoc);
   1334 
   1335   return false;
   1336 }
   1337 
   1338 /// \brief Parse an operator-function-id or conversion-function-id as part
   1339 /// of a C++ unqualified-id.
   1340 ///
   1341 /// This routine is responsible only for parsing the operator-function-id or
   1342 /// conversion-function-id; it does not handle template arguments in any way.
   1343 ///
   1344 /// \code
   1345 ///       operator-function-id: [C++ 13.5]
   1346 ///         'operator' operator
   1347 ///
   1348 ///       operator: one of
   1349 ///            new   delete  new[]   delete[]
   1350 ///            +     -    *  /    %  ^    &   |   ~
   1351 ///            !     =    <  >    += -=   *=  /=  %=
   1352 ///            ^=    &=   |= <<   >> >>= <<=  ==  !=
   1353 ///            <=    >=   && ||   ++ --   ,   ->* ->
   1354 ///            ()    []
   1355 ///
   1356 ///       conversion-function-id: [C++ 12.3.2]
   1357 ///         operator conversion-type-id
   1358 ///
   1359 ///       conversion-type-id:
   1360 ///         type-specifier-seq conversion-declarator[opt]
   1361 ///
   1362 ///       conversion-declarator:
   1363 ///         ptr-operator conversion-declarator[opt]
   1364 /// \endcode
   1365 ///
   1366 /// \param The nested-name-specifier that preceded this unqualified-id. If
   1367 /// non-empty, then we are parsing the unqualified-id of a qualified-id.
   1368 ///
   1369 /// \param EnteringContext whether we are entering the scope of the
   1370 /// nested-name-specifier.
   1371 ///
   1372 /// \param ObjectType if this unqualified-id occurs within a member access
   1373 /// expression, the type of the base object whose member is being accessed.
   1374 ///
   1375 /// \param Result on a successful parse, contains the parsed unqualified-id.
   1376 ///
   1377 /// \returns true if parsing fails, false otherwise.
   1378 bool Parser::ParseUnqualifiedIdOperator(CXXScopeSpec &SS, bool EnteringContext,
   1379                                         ParsedType ObjectType,
   1380                                         UnqualifiedId &Result) {
   1381   assert(Tok.is(tok::kw_operator) && "Expected 'operator' keyword");
   1382 
   1383   // Consume the 'operator' keyword.
   1384   SourceLocation KeywordLoc = ConsumeToken();
   1385 
   1386   // Determine what kind of operator name we have.
   1387   unsigned SymbolIdx = 0;
   1388   SourceLocation SymbolLocations[3];
   1389   OverloadedOperatorKind Op = OO_None;
   1390   switch (Tok.getKind()) {
   1391     case tok::kw_new:
   1392     case tok::kw_delete: {
   1393       bool isNew = Tok.getKind() == tok::kw_new;
   1394       // Consume the 'new' or 'delete'.
   1395       SymbolLocations[SymbolIdx++] = ConsumeToken();
   1396       if (Tok.is(tok::l_square)) {
   1397         // Consume the '['.
   1398         SourceLocation LBracketLoc = ConsumeBracket();
   1399         // Consume the ']'.
   1400         SourceLocation RBracketLoc = MatchRHSPunctuation(tok::r_square,
   1401                                                          LBracketLoc);
   1402         if (RBracketLoc.isInvalid())
   1403           return true;
   1404 
   1405         SymbolLocations[SymbolIdx++] = LBracketLoc;
   1406         SymbolLocations[SymbolIdx++] = RBracketLoc;
   1407         Op = isNew? OO_Array_New : OO_Array_Delete;
   1408       } else {
   1409         Op = isNew? OO_New : OO_Delete;
   1410       }
   1411       break;
   1412     }
   1413 
   1414 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
   1415     case tok::Token:                                                     \
   1416       SymbolLocations[SymbolIdx++] = ConsumeToken();                     \
   1417       Op = OO_##Name;                                                    \
   1418       break;
   1419 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
   1420 #include "clang/Basic/OperatorKinds.def"
   1421 
   1422     case tok::l_paren: {
   1423       // Consume the '('.
   1424       SourceLocation LParenLoc = ConsumeParen();
   1425       // Consume the ')'.
   1426       SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren,
   1427                                                      LParenLoc);
   1428       if (RParenLoc.isInvalid())
   1429         return true;
   1430 
   1431       SymbolLocations[SymbolIdx++] = LParenLoc;
   1432       SymbolLocations[SymbolIdx++] = RParenLoc;
   1433       Op = OO_Call;
   1434       break;
   1435     }
   1436 
   1437     case tok::l_square: {
   1438       // Consume the '['.
   1439       SourceLocation LBracketLoc = ConsumeBracket();
   1440       // Consume the ']'.
   1441       SourceLocation RBracketLoc = MatchRHSPunctuation(tok::r_square,
   1442                                                        LBracketLoc);
   1443       if (RBracketLoc.isInvalid())
   1444         return true;
   1445 
   1446       SymbolLocations[SymbolIdx++] = LBracketLoc;
   1447       SymbolLocations[SymbolIdx++] = RBracketLoc;
   1448       Op = OO_Subscript;
   1449       break;
   1450     }
   1451 
   1452     case tok::code_completion: {
   1453       // Code completion for the operator name.
   1454       Actions.CodeCompleteOperatorName(getCurScope());
   1455 
   1456       // Consume the operator token.
   1457       ConsumeCodeCompletionToken();
   1458 
   1459       // Don't try to parse any further.
   1460       return true;
   1461     }
   1462 
   1463     default:
   1464       break;
   1465   }
   1466 
   1467   if (Op != OO_None) {
   1468     // We have parsed an operator-function-id.
   1469     Result.setOperatorFunctionId(KeywordLoc, Op, SymbolLocations);
   1470     return false;
   1471   }
   1472 
   1473   // Parse a literal-operator-id.
   1474   //
   1475   //   literal-operator-id: [C++0x 13.5.8]
   1476   //     operator "" identifier
   1477 
   1478   if (getLang().CPlusPlus0x && Tok.is(tok::string_literal)) {
   1479     if (Tok.getLength() != 2)
   1480       Diag(Tok.getLocation(), diag::err_operator_string_not_empty);
   1481     ConsumeStringToken();
   1482 
   1483     if (Tok.isNot(tok::identifier)) {
   1484       Diag(Tok.getLocation(), diag::err_expected_ident);
   1485       return true;
   1486     }
   1487 
   1488     IdentifierInfo *II = Tok.getIdentifierInfo();
   1489     Result.setLiteralOperatorId(II, KeywordLoc, ConsumeToken());
   1490     return false;
   1491   }
   1492 
   1493   // Parse a conversion-function-id.
   1494   //
   1495   //   conversion-function-id: [C++ 12.3.2]
   1496   //     operator conversion-type-id
   1497   //
   1498   //   conversion-type-id:
   1499   //     type-specifier-seq conversion-declarator[opt]
   1500   //
   1501   //   conversion-declarator:
   1502   //     ptr-operator conversion-declarator[opt]
   1503 
   1504   // Parse the type-specifier-seq.
   1505   DeclSpec DS(AttrFactory);
   1506   if (ParseCXXTypeSpecifierSeq(DS)) // FIXME: ObjectType?
   1507     return true;
   1508 
   1509   // Parse the conversion-declarator, which is merely a sequence of
   1510   // ptr-operators.
   1511   Declarator D(DS, Declarator::TypeNameContext);
   1512   ParseDeclaratorInternal(D, /*DirectDeclParser=*/0);
   1513 
   1514   // Finish up the type.
   1515   TypeResult Ty = Actions.ActOnTypeName(getCurScope(), D);
   1516   if (Ty.isInvalid())
   1517     return true;
   1518 
   1519   // Note that this is a conversion-function-id.
   1520   Result.setConversionFunctionId(KeywordLoc, Ty.get(),
   1521                                  D.getSourceRange().getEnd());
   1522   return false;
   1523 }
   1524 
   1525 /// \brief Parse a C++ unqualified-id (or a C identifier), which describes the
   1526 /// name of an entity.
   1527 ///
   1528 /// \code
   1529 ///       unqualified-id: [C++ expr.prim.general]
   1530 ///         identifier
   1531 ///         operator-function-id
   1532 ///         conversion-function-id
   1533 /// [C++0x] literal-operator-id [TODO]
   1534 ///         ~ class-name
   1535 ///         template-id
   1536 ///
   1537 /// \endcode
   1538 ///
   1539 /// \param The nested-name-specifier that preceded this unqualified-id. If
   1540 /// non-empty, then we are parsing the unqualified-id of a qualified-id.
   1541 ///
   1542 /// \param EnteringContext whether we are entering the scope of the
   1543 /// nested-name-specifier.
   1544 ///
   1545 /// \param AllowDestructorName whether we allow parsing of a destructor name.
   1546 ///
   1547 /// \param AllowConstructorName whether we allow parsing a constructor name.
   1548 ///
   1549 /// \param ObjectType if this unqualified-id occurs within a member access
   1550 /// expression, the type of the base object whose member is being accessed.
   1551 ///
   1552 /// \param Result on a successful parse, contains the parsed unqualified-id.
   1553 ///
   1554 /// \returns true if parsing fails, false otherwise.
   1555 bool Parser::ParseUnqualifiedId(CXXScopeSpec &SS, bool EnteringContext,
   1556                                 bool AllowDestructorName,
   1557                                 bool AllowConstructorName,
   1558                                 ParsedType ObjectType,
   1559                                 UnqualifiedId &Result) {
   1560 
   1561   // Handle 'A::template B'. This is for template-ids which have not
   1562   // already been annotated by ParseOptionalCXXScopeSpecifier().
   1563   bool TemplateSpecified = false;
   1564   SourceLocation TemplateKWLoc;
   1565   if (getLang().CPlusPlus && Tok.is(tok::kw_template) &&
   1566       (ObjectType || SS.isSet())) {
   1567     TemplateSpecified = true;
   1568     TemplateKWLoc = ConsumeToken();
   1569   }
   1570 
   1571   // unqualified-id:
   1572   //   identifier
   1573   //   template-id (when it hasn't already been annotated)
   1574   if (Tok.is(tok::identifier)) {
   1575     // Consume the identifier.
   1576     IdentifierInfo *Id = Tok.getIdentifierInfo();
   1577     SourceLocation IdLoc = ConsumeToken();
   1578 
   1579     if (!getLang().CPlusPlus) {
   1580       // If we're not in C++, only identifiers matter. Record the
   1581       // identifier and return.
   1582       Result.setIdentifier(Id, IdLoc);
   1583       return false;
   1584     }
   1585 
   1586     if (AllowConstructorName &&
   1587         Actions.isCurrentClassName(*Id, getCurScope(), &SS)) {
   1588       // We have parsed a constructor name.
   1589       Result.setConstructorName(Actions.getTypeName(*Id, IdLoc, getCurScope(),
   1590                                                     &SS, false, false,
   1591                                                     ParsedType(),
   1592                                             /*NonTrivialTypeSourceInfo=*/true),
   1593                                 IdLoc, IdLoc);
   1594     } else {
   1595       // We have parsed an identifier.
   1596       Result.setIdentifier(Id, IdLoc);
   1597     }
   1598 
   1599     // If the next token is a '<', we may have a template.
   1600     if (TemplateSpecified || Tok.is(tok::less))
   1601       return ParseUnqualifiedIdTemplateId(SS, Id, IdLoc, EnteringContext,
   1602                                           ObjectType, Result,
   1603                                           TemplateSpecified, TemplateKWLoc);
   1604 
   1605     return false;
   1606   }
   1607 
   1608   // unqualified-id:
   1609   //   template-id (already parsed and annotated)
   1610   if (Tok.is(tok::annot_template_id)) {
   1611     TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
   1612 
   1613     // If the template-name names the current class, then this is a constructor
   1614     if (AllowConstructorName && TemplateId->Name &&
   1615         Actions.isCurrentClassName(*TemplateId->Name, getCurScope(), &SS)) {
   1616       if (SS.isSet()) {
   1617         // C++ [class.qual]p2 specifies that a qualified template-name
   1618         // is taken as the constructor name where a constructor can be
   1619         // declared. Thus, the template arguments are extraneous, so
   1620         // complain about them and remove them entirely.
   1621         Diag(TemplateId->TemplateNameLoc,
   1622              diag::err_out_of_line_constructor_template_id)
   1623           << TemplateId->Name
   1624           << FixItHint::CreateRemoval(
   1625                     SourceRange(TemplateId->LAngleLoc, TemplateId->RAngleLoc));
   1626         Result.setConstructorName(Actions.getTypeName(*TemplateId->Name,
   1627                                                   TemplateId->TemplateNameLoc,
   1628                                                       getCurScope(),
   1629                                                       &SS, false, false,
   1630                                                       ParsedType(),
   1631                                             /*NontrivialTypeSourceInfo=*/true),
   1632                                   TemplateId->TemplateNameLoc,
   1633                                   TemplateId->RAngleLoc);
   1634         ConsumeToken();
   1635         return false;
   1636       }
   1637 
   1638       Result.setConstructorTemplateId(TemplateId);
   1639       ConsumeToken();
   1640       return false;
   1641     }
   1642 
   1643     // We have already parsed a template-id; consume the annotation token as
   1644     // our unqualified-id.
   1645     Result.setTemplateId(TemplateId);
   1646     ConsumeToken();
   1647     return false;
   1648   }
   1649 
   1650   // unqualified-id:
   1651   //   operator-function-id
   1652   //   conversion-function-id
   1653   if (Tok.is(tok::kw_operator)) {
   1654     if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType, Result))
   1655       return true;
   1656 
   1657     // If we have an operator-function-id or a literal-operator-id and the next
   1658     // token is a '<', we may have a
   1659     //
   1660     //   template-id:
   1661     //     operator-function-id < template-argument-list[opt] >
   1662     if ((Result.getKind() == UnqualifiedId::IK_OperatorFunctionId ||
   1663          Result.getKind() == UnqualifiedId::IK_LiteralOperatorId) &&
   1664         (TemplateSpecified || Tok.is(tok::less)))
   1665       return ParseUnqualifiedIdTemplateId(SS, 0, SourceLocation(),
   1666                                           EnteringContext, ObjectType,
   1667                                           Result,
   1668                                           TemplateSpecified, TemplateKWLoc);
   1669 
   1670     return false;
   1671   }
   1672 
   1673   if (getLang().CPlusPlus &&
   1674       (AllowDestructorName || SS.isSet()) && Tok.is(tok::tilde)) {
   1675     // C++ [expr.unary.op]p10:
   1676     //   There is an ambiguity in the unary-expression ~X(), where X is a
   1677     //   class-name. The ambiguity is resolved in favor of treating ~ as a
   1678     //    unary complement rather than treating ~X as referring to a destructor.
   1679 
   1680     // Parse the '~'.
   1681     SourceLocation TildeLoc = ConsumeToken();
   1682 
   1683     // Parse the class-name.
   1684     if (Tok.isNot(tok::identifier)) {
   1685       Diag(Tok, diag::err_destructor_tilde_identifier);
   1686       return true;
   1687     }
   1688 
   1689     // Parse the class-name (or template-name in a simple-template-id).
   1690     IdentifierInfo *ClassName = Tok.getIdentifierInfo();
   1691     SourceLocation ClassNameLoc = ConsumeToken();
   1692 
   1693     if (TemplateSpecified || Tok.is(tok::less)) {
   1694       Result.setDestructorName(TildeLoc, ParsedType(), ClassNameLoc);
   1695       return ParseUnqualifiedIdTemplateId(SS, ClassName, ClassNameLoc,
   1696                                           EnteringContext, ObjectType, Result,
   1697                                           TemplateSpecified, TemplateKWLoc);
   1698     }
   1699 
   1700     // Note that this is a destructor name.
   1701     ParsedType Ty = Actions.getDestructorName(TildeLoc, *ClassName,
   1702                                               ClassNameLoc, getCurScope(),
   1703                                               SS, ObjectType,
   1704                                               EnteringContext);
   1705     if (!Ty)
   1706       return true;
   1707 
   1708     Result.setDestructorName(TildeLoc, Ty, ClassNameLoc);
   1709     return false;
   1710   }
   1711 
   1712   Diag(Tok, diag::err_expected_unqualified_id)
   1713     << getLang().CPlusPlus;
   1714   return true;
   1715 }
   1716 
   1717 /// ParseCXXNewExpression - Parse a C++ new-expression. New is used to allocate
   1718 /// memory in a typesafe manner and call constructors.
   1719 ///
   1720 /// This method is called to parse the new expression after the optional :: has
   1721 /// been already parsed.  If the :: was present, "UseGlobal" is true and "Start"
   1722 /// is its location.  Otherwise, "Start" is the location of the 'new' token.
   1723 ///
   1724 ///        new-expression:
   1725 ///                   '::'[opt] 'new' new-placement[opt] new-type-id
   1726 ///                                     new-initializer[opt]
   1727 ///                   '::'[opt] 'new' new-placement[opt] '(' type-id ')'
   1728 ///                                     new-initializer[opt]
   1729 ///
   1730 ///        new-placement:
   1731 ///                   '(' expression-list ')'
   1732 ///
   1733 ///        new-type-id:
   1734 ///                   type-specifier-seq new-declarator[opt]
   1735 /// [GNU]             attributes type-specifier-seq new-declarator[opt]
   1736 ///
   1737 ///        new-declarator:
   1738 ///                   ptr-operator new-declarator[opt]
   1739 ///                   direct-new-declarator
   1740 ///
   1741 ///        new-initializer:
   1742 ///                   '(' expression-list[opt] ')'
   1743 /// [C++0x]           braced-init-list
   1744 ///
   1745 ExprResult
   1746 Parser::ParseCXXNewExpression(bool UseGlobal, SourceLocation Start) {
   1747   assert(Tok.is(tok::kw_new) && "expected 'new' token");
   1748   ConsumeToken();   // Consume 'new'
   1749 
   1750   // A '(' now can be a new-placement or the '(' wrapping the type-id in the
   1751   // second form of new-expression. It can't be a new-type-id.
   1752 
   1753   ExprVector PlacementArgs(Actions);
   1754   SourceLocation PlacementLParen, PlacementRParen;
   1755 
   1756   SourceRange TypeIdParens;
   1757   DeclSpec DS(AttrFactory);
   1758   Declarator DeclaratorInfo(DS, Declarator::CXXNewContext);
   1759   if (Tok.is(tok::l_paren)) {
   1760     // If it turns out to be a placement, we change the type location.
   1761     PlacementLParen = ConsumeParen();
   1762     if (ParseExpressionListOrTypeId(PlacementArgs, DeclaratorInfo)) {
   1763       SkipUntil(tok::semi, /*StopAtSemi=*/true, /*DontConsume=*/true);
   1764       return ExprError();
   1765     }
   1766 
   1767     PlacementRParen = MatchRHSPunctuation(tok::r_paren, PlacementLParen);
   1768     if (PlacementRParen.isInvalid()) {
   1769       SkipUntil(tok::semi, /*StopAtSemi=*/true, /*DontConsume=*/true);
   1770       return ExprError();
   1771     }
   1772 
   1773     if (PlacementArgs.empty()) {
   1774       // Reset the placement locations. There was no placement.
   1775       TypeIdParens = SourceRange(PlacementLParen, PlacementRParen);
   1776       PlacementLParen = PlacementRParen = SourceLocation();
   1777     } else {
   1778       // We still need the type.
   1779       if (Tok.is(tok::l_paren)) {
   1780         TypeIdParens.setBegin(ConsumeParen());
   1781         MaybeParseGNUAttributes(DeclaratorInfo);
   1782         ParseSpecifierQualifierList(DS);
   1783         DeclaratorInfo.SetSourceRange(DS.getSourceRange());
   1784         ParseDeclarator(DeclaratorInfo);
   1785         TypeIdParens.setEnd(MatchRHSPunctuation(tok::r_paren,
   1786                                                 TypeIdParens.getBegin()));
   1787       } else {
   1788         MaybeParseGNUAttributes(DeclaratorInfo);
   1789         if (ParseCXXTypeSpecifierSeq(DS))
   1790           DeclaratorInfo.setInvalidType(true);
   1791         else {
   1792           DeclaratorInfo.SetSourceRange(DS.getSourceRange());
   1793           ParseDeclaratorInternal(DeclaratorInfo,
   1794                                   &Parser::ParseDirectNewDeclarator);
   1795         }
   1796       }
   1797     }
   1798   } else {
   1799     // A new-type-id is a simplified type-id, where essentially the
   1800     // direct-declarator is replaced by a direct-new-declarator.
   1801     MaybeParseGNUAttributes(DeclaratorInfo);
   1802     if (ParseCXXTypeSpecifierSeq(DS))
   1803       DeclaratorInfo.setInvalidType(true);
   1804     else {
   1805       DeclaratorInfo.SetSourceRange(DS.getSourceRange());
   1806       ParseDeclaratorInternal(DeclaratorInfo,
   1807                               &Parser::ParseDirectNewDeclarator);
   1808     }
   1809   }
   1810   if (DeclaratorInfo.isInvalidType()) {
   1811     SkipUntil(tok::semi, /*StopAtSemi=*/true, /*DontConsume=*/true);
   1812     return ExprError();
   1813   }
   1814 
   1815   ExprVector ConstructorArgs(Actions);
   1816   SourceLocation ConstructorLParen, ConstructorRParen;
   1817 
   1818   if (Tok.is(tok::l_paren)) {
   1819     ConstructorLParen = ConsumeParen();
   1820     if (Tok.isNot(tok::r_paren)) {
   1821       CommaLocsTy CommaLocs;
   1822       if (ParseExpressionList(ConstructorArgs, CommaLocs)) {
   1823         SkipUntil(tok::semi, /*StopAtSemi=*/true, /*DontConsume=*/true);
   1824         return ExprError();
   1825       }
   1826     }
   1827     ConstructorRParen = MatchRHSPunctuation(tok::r_paren, ConstructorLParen);
   1828     if (ConstructorRParen.isInvalid()) {
   1829       SkipUntil(tok::semi, /*StopAtSemi=*/true, /*DontConsume=*/true);
   1830       return ExprError();
   1831     }
   1832   } else if (Tok.is(tok::l_brace)) {
   1833     // FIXME: Have to communicate the init-list to ActOnCXXNew.
   1834     ParseBraceInitializer();
   1835   }
   1836 
   1837   return Actions.ActOnCXXNew(Start, UseGlobal, PlacementLParen,
   1838                              move_arg(PlacementArgs), PlacementRParen,
   1839                              TypeIdParens, DeclaratorInfo, ConstructorLParen,
   1840                              move_arg(ConstructorArgs), ConstructorRParen);
   1841 }
   1842 
   1843 /// ParseDirectNewDeclarator - Parses a direct-new-declarator. Intended to be
   1844 /// passed to ParseDeclaratorInternal.
   1845 ///
   1846 ///        direct-new-declarator:
   1847 ///                   '[' expression ']'
   1848 ///                   direct-new-declarator '[' constant-expression ']'
   1849 ///
   1850 void Parser::ParseDirectNewDeclarator(Declarator &D) {
   1851   // Parse the array dimensions.
   1852   bool first = true;
   1853   while (Tok.is(tok::l_square)) {
   1854     SourceLocation LLoc = ConsumeBracket();
   1855     ExprResult Size(first ? ParseExpression()
   1856                                 : ParseConstantExpression());
   1857     if (Size.isInvalid()) {
   1858       // Recover
   1859       SkipUntil(tok::r_square);
   1860       return;
   1861     }
   1862     first = false;
   1863 
   1864     SourceLocation RLoc = MatchRHSPunctuation(tok::r_square, LLoc);
   1865 
   1866     ParsedAttributes attrs(AttrFactory);
   1867     D.AddTypeInfo(DeclaratorChunk::getArray(0,
   1868                                             /*static=*/false, /*star=*/false,
   1869                                             Size.release(), LLoc, RLoc),
   1870                   attrs, RLoc);
   1871 
   1872     if (RLoc.isInvalid())
   1873       return;
   1874   }
   1875 }
   1876 
   1877 /// ParseExpressionListOrTypeId - Parse either an expression-list or a type-id.
   1878 /// This ambiguity appears in the syntax of the C++ new operator.
   1879 ///
   1880 ///        new-expression:
   1881 ///                   '::'[opt] 'new' new-placement[opt] '(' type-id ')'
   1882 ///                                     new-initializer[opt]
   1883 ///
   1884 ///        new-placement:
   1885 ///                   '(' expression-list ')'
   1886 ///
   1887 bool Parser::ParseExpressionListOrTypeId(
   1888                                    llvm::SmallVectorImpl<Expr*> &PlacementArgs,
   1889                                          Declarator &D) {
   1890   // The '(' was already consumed.
   1891   if (isTypeIdInParens()) {
   1892     ParseSpecifierQualifierList(D.getMutableDeclSpec());
   1893     D.SetSourceRange(D.getDeclSpec().getSourceRange());
   1894     ParseDeclarator(D);
   1895     return D.isInvalidType();
   1896   }
   1897 
   1898   // It's not a type, it has to be an expression list.
   1899   // Discard the comma locations - ActOnCXXNew has enough parameters.
   1900   CommaLocsTy CommaLocs;
   1901   return ParseExpressionList(PlacementArgs, CommaLocs);
   1902 }
   1903 
   1904 /// ParseCXXDeleteExpression - Parse a C++ delete-expression. Delete is used
   1905 /// to free memory allocated by new.
   1906 ///
   1907 /// This method is called to parse the 'delete' expression after the optional
   1908 /// '::' has been already parsed.  If the '::' was present, "UseGlobal" is true
   1909 /// and "Start" is its location.  Otherwise, "Start" is the location of the
   1910 /// 'delete' token.
   1911 ///
   1912 ///        delete-expression:
   1913 ///                   '::'[opt] 'delete' cast-expression
   1914 ///                   '::'[opt] 'delete' '[' ']' cast-expression
   1915 ExprResult
   1916 Parser::ParseCXXDeleteExpression(bool UseGlobal, SourceLocation Start) {
   1917   assert(Tok.is(tok::kw_delete) && "Expected 'delete' keyword");
   1918   ConsumeToken(); // Consume 'delete'
   1919 
   1920   // Array delete?
   1921   bool ArrayDelete = false;
   1922   if (Tok.is(tok::l_square)) {
   1923     ArrayDelete = true;
   1924     SourceLocation LHS = ConsumeBracket();
   1925     SourceLocation RHS = MatchRHSPunctuation(tok::r_square, LHS);
   1926     if (RHS.isInvalid())
   1927       return ExprError();
   1928   }
   1929 
   1930   ExprResult Operand(ParseCastExpression(false));
   1931   if (Operand.isInvalid())
   1932     return move(Operand);
   1933 
   1934   return Actions.ActOnCXXDelete(Start, UseGlobal, ArrayDelete, Operand.take());
   1935 }
   1936 
   1937 static UnaryTypeTrait UnaryTypeTraitFromTokKind(tok::TokenKind kind) {
   1938   switch(kind) {
   1939   default: assert(false && "Not a known unary type trait.");
   1940   case tok::kw___has_nothrow_assign:      return UTT_HasNothrowAssign;
   1941   case tok::kw___has_nothrow_constructor: return UTT_HasNothrowConstructor;
   1942   case tok::kw___has_nothrow_copy:           return UTT_HasNothrowCopy;
   1943   case tok::kw___has_trivial_assign:      return UTT_HasTrivialAssign;
   1944   case tok::kw___has_trivial_constructor:
   1945                                     return UTT_HasTrivialDefaultConstructor;
   1946   case tok::kw___has_trivial_copy:           return UTT_HasTrivialCopy;
   1947   case tok::kw___has_trivial_destructor:  return UTT_HasTrivialDestructor;
   1948   case tok::kw___has_virtual_destructor:  return UTT_HasVirtualDestructor;
   1949   case tok::kw___is_abstract:             return UTT_IsAbstract;
   1950   case tok::kw___is_arithmetic:              return UTT_IsArithmetic;
   1951   case tok::kw___is_array:                   return UTT_IsArray;
   1952   case tok::kw___is_class:                return UTT_IsClass;
   1953   case tok::kw___is_complete_type:           return UTT_IsCompleteType;
   1954   case tok::kw___is_compound:                return UTT_IsCompound;
   1955   case tok::kw___is_const:                   return UTT_IsConst;
   1956   case tok::kw___is_empty:                return UTT_IsEmpty;
   1957   case tok::kw___is_enum:                 return UTT_IsEnum;
   1958   case tok::kw___is_floating_point:          return UTT_IsFloatingPoint;
   1959   case tok::kw___is_function:                return UTT_IsFunction;
   1960   case tok::kw___is_fundamental:             return UTT_IsFundamental;
   1961   case tok::kw___is_integral:                return UTT_IsIntegral;
   1962   case tok::kw___is_lvalue_reference:        return UTT_IsLvalueReference;
   1963   case tok::kw___is_member_function_pointer: return UTT_IsMemberFunctionPointer;
   1964   case tok::kw___is_member_object_pointer:   return UTT_IsMemberObjectPointer;
   1965   case tok::kw___is_member_pointer:          return UTT_IsMemberPointer;
   1966   case tok::kw___is_object:                  return UTT_IsObject;
   1967   case tok::kw___is_literal:              return UTT_IsLiteral;
   1968   case tok::kw___is_literal_type:         return UTT_IsLiteral;
   1969   case tok::kw___is_pod:                  return UTT_IsPOD;
   1970   case tok::kw___is_pointer:                 return UTT_IsPointer;
   1971   case tok::kw___is_polymorphic:          return UTT_IsPolymorphic;
   1972   case tok::kw___is_reference:               return UTT_IsReference;
   1973   case tok::kw___is_rvalue_reference:        return UTT_IsRvalueReference;
   1974   case tok::kw___is_scalar:                  return UTT_IsScalar;
   1975   case tok::kw___is_signed:                  return UTT_IsSigned;
   1976   case tok::kw___is_standard_layout:         return UTT_IsStandardLayout;
   1977   case tok::kw___is_trivial:                 return UTT_IsTrivial;
   1978   case tok::kw___is_trivially_copyable:      return UTT_IsTriviallyCopyable;
   1979   case tok::kw___is_union:                return UTT_IsUnion;
   1980   case tok::kw___is_unsigned:                return UTT_IsUnsigned;
   1981   case tok::kw___is_void:                    return UTT_IsVoid;
   1982   case tok::kw___is_volatile:                return UTT_IsVolatile;
   1983   }
   1984 }
   1985 
   1986 static BinaryTypeTrait BinaryTypeTraitFromTokKind(tok::TokenKind kind) {
   1987   switch(kind) {
   1988   default: llvm_unreachable("Not a known binary type trait");
   1989   case tok::kw___is_base_of:                 return BTT_IsBaseOf;
   1990   case tok::kw___is_convertible:             return BTT_IsConvertible;
   1991   case tok::kw___is_same:                    return BTT_IsSame;
   1992   case tok::kw___builtin_types_compatible_p: return BTT_TypeCompatible;
   1993   case tok::kw___is_convertible_to:          return BTT_IsConvertibleTo;
   1994   }
   1995 }
   1996 
   1997 static ArrayTypeTrait ArrayTypeTraitFromTokKind(tok::TokenKind kind) {
   1998   switch(kind) {
   1999   default: llvm_unreachable("Not a known binary type trait");
   2000   case tok::kw___array_rank:                 return ATT_ArrayRank;
   2001   case tok::kw___array_extent:               return ATT_ArrayExtent;
   2002   }
   2003 }
   2004 
   2005 static ExpressionTrait ExpressionTraitFromTokKind(tok::TokenKind kind) {
   2006   switch(kind) {
   2007   default: assert(false && "Not a known unary expression trait.");
   2008   case tok::kw___is_lvalue_expr:             return ET_IsLValueExpr;
   2009   case tok::kw___is_rvalue_expr:             return ET_IsRValueExpr;
   2010   }
   2011 }
   2012 
   2013 /// ParseUnaryTypeTrait - Parse the built-in unary type-trait
   2014 /// pseudo-functions that allow implementation of the TR1/C++0x type traits
   2015 /// templates.
   2016 ///
   2017 ///       primary-expression:
   2018 /// [GNU]             unary-type-trait '(' type-id ')'
   2019 ///
   2020 ExprResult Parser::ParseUnaryTypeTrait() {
   2021   UnaryTypeTrait UTT = UnaryTypeTraitFromTokKind(Tok.getKind());
   2022   SourceLocation Loc = ConsumeToken();
   2023 
   2024   SourceLocation LParen = Tok.getLocation();
   2025   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen))
   2026     return ExprError();
   2027 
   2028   // FIXME: Error reporting absolutely sucks! If the this fails to parse a type
   2029   // there will be cryptic errors about mismatched parentheses and missing
   2030   // specifiers.
   2031   TypeResult Ty = ParseTypeName();
   2032 
   2033   SourceLocation RParen = MatchRHSPunctuation(tok::r_paren, LParen);
   2034 
   2035   if (Ty.isInvalid())
   2036     return ExprError();
   2037 
   2038   return Actions.ActOnUnaryTypeTrait(UTT, Loc, Ty.get(), RParen);
   2039 }
   2040 
   2041 /// ParseBinaryTypeTrait - Parse the built-in binary type-trait
   2042 /// pseudo-functions that allow implementation of the TR1/C++0x type traits
   2043 /// templates.
   2044 ///
   2045 ///       primary-expression:
   2046 /// [GNU]             binary-type-trait '(' type-id ',' type-id ')'
   2047 ///
   2048 ExprResult Parser::ParseBinaryTypeTrait() {
   2049   BinaryTypeTrait BTT = BinaryTypeTraitFromTokKind(Tok.getKind());
   2050   SourceLocation Loc = ConsumeToken();
   2051 
   2052   SourceLocation LParen = Tok.getLocation();
   2053   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen))
   2054     return ExprError();
   2055 
   2056   TypeResult LhsTy = ParseTypeName();
   2057   if (LhsTy.isInvalid()) {
   2058     SkipUntil(tok::r_paren);
   2059     return ExprError();
   2060   }
   2061 
   2062   if (ExpectAndConsume(tok::comma, diag::err_expected_comma)) {
   2063     SkipUntil(tok::r_paren);
   2064     return ExprError();
   2065   }
   2066 
   2067   TypeResult RhsTy = ParseTypeName();
   2068   if (RhsTy.isInvalid()) {
   2069     SkipUntil(tok::r_paren);
   2070     return ExprError();
   2071   }
   2072 
   2073   SourceLocation RParen = MatchRHSPunctuation(tok::r_paren, LParen);
   2074 
   2075   return Actions.ActOnBinaryTypeTrait(BTT, Loc, LhsTy.get(), RhsTy.get(), RParen);
   2076 }
   2077 
   2078 /// ParseArrayTypeTrait - Parse the built-in array type-trait
   2079 /// pseudo-functions.
   2080 ///
   2081 ///       primary-expression:
   2082 /// [Embarcadero]     '__array_rank' '(' type-id ')'
   2083 /// [Embarcadero]     '__array_extent' '(' type-id ',' expression ')'
   2084 ///
   2085 ExprResult Parser::ParseArrayTypeTrait() {
   2086   ArrayTypeTrait ATT = ArrayTypeTraitFromTokKind(Tok.getKind());
   2087   SourceLocation Loc = ConsumeToken();
   2088 
   2089   SourceLocation LParen = Tok.getLocation();
   2090   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen))
   2091     return ExprError();
   2092 
   2093   TypeResult Ty = ParseTypeName();
   2094   if (Ty.isInvalid()) {
   2095     SkipUntil(tok::comma);
   2096     SkipUntil(tok::r_paren);
   2097     return ExprError();
   2098   }
   2099 
   2100   switch (ATT) {
   2101   case ATT_ArrayRank: {
   2102     SourceLocation RParen = MatchRHSPunctuation(tok::r_paren, LParen);
   2103     return Actions.ActOnArrayTypeTrait(ATT, Loc, Ty.get(), NULL, RParen);
   2104   }
   2105   case ATT_ArrayExtent: {
   2106     if (ExpectAndConsume(tok::comma, diag::err_expected_comma)) {
   2107       SkipUntil(tok::r_paren);
   2108       return ExprError();
   2109     }
   2110 
   2111     ExprResult DimExpr = ParseExpression();
   2112     SourceLocation RParen = MatchRHSPunctuation(tok::r_paren, LParen);
   2113 
   2114     return Actions.ActOnArrayTypeTrait(ATT, Loc, Ty.get(), DimExpr.get(), RParen);
   2115   }
   2116   default:
   2117     break;
   2118   }
   2119   return ExprError();
   2120 }
   2121 
   2122 /// ParseExpressionTrait - Parse built-in expression-trait
   2123 /// pseudo-functions like __is_lvalue_expr( xxx ).
   2124 ///
   2125 ///       primary-expression:
   2126 /// [Embarcadero]     expression-trait '(' expression ')'
   2127 ///
   2128 ExprResult Parser::ParseExpressionTrait() {
   2129   ExpressionTrait ET = ExpressionTraitFromTokKind(Tok.getKind());
   2130   SourceLocation Loc = ConsumeToken();
   2131 
   2132   SourceLocation LParen = Tok.getLocation();
   2133   if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen))
   2134     return ExprError();
   2135 
   2136   ExprResult Expr = ParseExpression();
   2137 
   2138   SourceLocation RParen = MatchRHSPunctuation(tok::r_paren, LParen);
   2139 
   2140   return Actions.ActOnExpressionTrait(ET, Loc, Expr.get(), RParen);
   2141 }
   2142 
   2143 
   2144 /// ParseCXXAmbiguousParenExpression - We have parsed the left paren of a
   2145 /// parenthesized ambiguous type-id. This uses tentative parsing to disambiguate
   2146 /// based on the context past the parens.
   2147 ExprResult
   2148 Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType,
   2149                                          ParsedType &CastTy,
   2150                                          SourceLocation LParenLoc,
   2151                                          SourceLocation &RParenLoc) {
   2152   assert(getLang().CPlusPlus && "Should only be called for C++!");
   2153   assert(ExprType == CastExpr && "Compound literals are not ambiguous!");
   2154   assert(isTypeIdInParens() && "Not a type-id!");
   2155 
   2156   ExprResult Result(true);
   2157   CastTy = ParsedType();
   2158 
   2159   // We need to disambiguate a very ugly part of the C++ syntax:
   2160   //
   2161   // (T())x;  - type-id
   2162   // (T())*x; - type-id
   2163   // (T())/x; - expression
   2164   // (T());   - expression
   2165   //
   2166   // The bad news is that we cannot use the specialized tentative parser, since
   2167   // it can only verify that the thing inside the parens can be parsed as
   2168   // type-id, it is not useful for determining the context past the parens.
   2169   //
   2170   // The good news is that the parser can disambiguate this part without
   2171   // making any unnecessary Action calls.
   2172   //
   2173   // It uses a scheme similar to parsing inline methods. The parenthesized
   2174   // tokens are cached, the context that follows is determined (possibly by
   2175   // parsing a cast-expression), and then we re-introduce the cached tokens
   2176   // into the token stream and parse them appropriately.
   2177 
   2178   ParenParseOption ParseAs;
   2179   CachedTokens Toks;
   2180 
   2181   // Store the tokens of the parentheses. We will parse them after we determine
   2182   // the context that follows them.
   2183   if (!ConsumeAndStoreUntil(tok::r_paren, Toks)) {
   2184     // We didn't find the ')' we expected.
   2185     MatchRHSPunctuation(tok::r_paren, LParenLoc);
   2186     return ExprError();
   2187   }
   2188 
   2189   if (Tok.is(tok::l_brace)) {
   2190     ParseAs = CompoundLiteral;
   2191   } else {
   2192     bool NotCastExpr;
   2193     // FIXME: Special-case ++ and --: "(S())++;" is not a cast-expression
   2194     if (Tok.is(tok::l_paren) && NextToken().is(tok::r_paren)) {
   2195       NotCastExpr = true;
   2196     } else {
   2197       // Try parsing the cast-expression that may follow.
   2198       // If it is not a cast-expression, NotCastExpr will be true and no token
   2199       // will be consumed.
   2200       Result = ParseCastExpression(false/*isUnaryExpression*/,
   2201                                    false/*isAddressofOperand*/,
   2202                                    NotCastExpr,
   2203                                    // type-id has priority.
   2204                                    true/*isTypeCast*/);
   2205     }
   2206 
   2207     // If we parsed a cast-expression, it's really a type-id, otherwise it's
   2208     // an expression.
   2209     ParseAs = NotCastExpr ? SimpleExpr : CastExpr;
   2210   }
   2211 
   2212   // The current token should go after the cached tokens.
   2213   Toks.push_back(Tok);
   2214   // Re-enter the stored parenthesized tokens into the token stream, so we may
   2215   // parse them now.
   2216   PP.EnterTokenStream(Toks.data(), Toks.size(),
   2217                       true/*DisableMacroExpansion*/, false/*OwnsTokens*/);
   2218   // Drop the current token and bring the first cached one. It's the same token
   2219   // as when we entered this function.
   2220   ConsumeAnyToken();
   2221 
   2222   if (ParseAs >= CompoundLiteral) {
   2223     // Parse the type declarator.
   2224     DeclSpec DS(AttrFactory);
   2225     ParseSpecifierQualifierList(DS);
   2226     Declarator DeclaratorInfo(DS, Declarator::TypeNameContext);
   2227     ParseDeclarator(DeclaratorInfo);
   2228 
   2229     // Match the ')'.
   2230     if (Tok.is(tok::r_paren))
   2231       RParenLoc = ConsumeParen();
   2232     else
   2233       MatchRHSPunctuation(tok::r_paren, LParenLoc);
   2234 
   2235     if (ParseAs == CompoundLiteral) {
   2236       ExprType = CompoundLiteral;
   2237       TypeResult Ty = ParseTypeName();
   2238       return ParseCompoundLiteralExpression(Ty.get(), LParenLoc, RParenLoc);
   2239     }
   2240 
   2241     // We parsed '(' type-id ')' and the thing after it wasn't a '{'.
   2242     assert(ParseAs == CastExpr);
   2243 
   2244     if (DeclaratorInfo.isInvalidType())
   2245       return ExprError();
   2246 
   2247     // Result is what ParseCastExpression returned earlier.
   2248     if (!Result.isInvalid())
   2249       Result = Actions.ActOnCastExpr(getCurScope(), LParenLoc,
   2250                                      DeclaratorInfo, CastTy,
   2251                                      RParenLoc, Result.take());
   2252     return move(Result);
   2253   }
   2254 
   2255   // Not a compound literal, and not followed by a cast-expression.
   2256   assert(ParseAs == SimpleExpr);
   2257 
   2258   ExprType = SimpleExpr;
   2259   Result = ParseExpression();
   2260   if (!Result.isInvalid() && Tok.is(tok::r_paren))
   2261     Result = Actions.ActOnParenExpr(LParenLoc, Tok.getLocation(), Result.take());
   2262 
   2263   // Match the ')'.
   2264   if (Result.isInvalid()) {
   2265     SkipUntil(tok::r_paren);
   2266     return ExprError();
   2267   }
   2268 
   2269   if (Tok.is(tok::r_paren))
   2270     RParenLoc = ConsumeParen();
   2271   else
   2272     MatchRHSPunctuation(tok::r_paren, LParenLoc);
   2273 
   2274   return move(Result);
   2275 }
   2276