Home | History | Annotate | Line # | Download | only in Parse
      1 //===--- ParseExprCXX.cpp - C++ Expression Parsing ------------------------===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 // This file implements the Expression parsing implementation for C++.
     10 //
     11 //===----------------------------------------------------------------------===//
     12 #include "clang/Parse/Parser.h"
     13 #include "clang/AST/ASTContext.h"
     14 #include "clang/AST/Decl.h"
     15 #include "clang/AST/DeclTemplate.h"
     16 #include "clang/AST/ExprCXX.h"
     17 #include "clang/Basic/PrettyStackTrace.h"
     18 #include "clang/Lex/LiteralSupport.h"
     19 #include "clang/Parse/ParseDiagnostic.h"
     20 #include "clang/Parse/RAIIObjectsForParser.h"
     21 #include "clang/Sema/DeclSpec.h"
     22 #include "clang/Sema/ParsedTemplate.h"
     23 #include "clang/Sema/Scope.h"
     24 #include "llvm/Support/ErrorHandling.h"
     25 #include <numeric>
     26 
     27 using namespace clang;
     28 
     29 static int SelectDigraphErrorMessage(tok::TokenKind Kind) {
     30   switch (Kind) {
     31     // template name
     32     case tok::unknown:             return 0;
     33     // casts
     34     case tok::kw_addrspace_cast:   return 1;
     35     case tok::kw_const_cast:       return 2;
     36     case tok::kw_dynamic_cast:     return 3;
     37     case tok::kw_reinterpret_cast: return 4;
     38     case tok::kw_static_cast:      return 5;
     39     default:
     40       llvm_unreachable("Unknown type for digraph error message.");
     41   }
     42 }
     43 
     44 // Are the two tokens adjacent in the same source file?
     45 bool Parser::areTokensAdjacent(const Token &First, const Token &Second) {
     46   SourceManager &SM = PP.getSourceManager();
     47   SourceLocation FirstLoc = SM.getSpellingLoc(First.getLocation());
     48   SourceLocation FirstEnd = FirstLoc.getLocWithOffset(First.getLength());
     49   return FirstEnd == SM.getSpellingLoc(Second.getLocation());
     50 }
     51 
     52 // Suggest fixit for "<::" after a cast.
     53 static void FixDigraph(Parser &P, Preprocessor &PP, Token &DigraphToken,
     54                        Token &ColonToken, tok::TokenKind Kind, bool AtDigraph) {
     55   // Pull '<:' and ':' off token stream.
     56   if (!AtDigraph)
     57     PP.Lex(DigraphToken);
     58   PP.Lex(ColonToken);
     59 
     60   SourceRange Range;
     61   Range.setBegin(DigraphToken.getLocation());
     62   Range.setEnd(ColonToken.getLocation());
     63   P.Diag(DigraphToken.getLocation(), diag::err_missing_whitespace_digraph)
     64       << SelectDigraphErrorMessage(Kind)
     65       << FixItHint::CreateReplacement(Range, "< ::");
     66 
     67   // Update token information to reflect their change in token type.
     68   ColonToken.setKind(tok::coloncolon);
     69   ColonToken.setLocation(ColonToken.getLocation().getLocWithOffset(-1));
     70   ColonToken.setLength(2);
     71   DigraphToken.setKind(tok::less);
     72   DigraphToken.setLength(1);
     73 
     74   // Push new tokens back to token stream.
     75   PP.EnterToken(ColonToken, /*IsReinject*/ true);
     76   if (!AtDigraph)
     77     PP.EnterToken(DigraphToken, /*IsReinject*/ true);
     78 }
     79 
     80 // Check for '<::' which should be '< ::' instead of '[:' when following
     81 // a template name.
     82 void Parser::CheckForTemplateAndDigraph(Token &Next, ParsedType ObjectType,
     83                                         bool EnteringContext,
     84                                         IdentifierInfo &II, CXXScopeSpec &SS) {
     85   if (!Next.is(tok::l_square) || Next.getLength() != 2)
     86     return;
     87 
     88   Token SecondToken = GetLookAheadToken(2);
     89   if (!SecondToken.is(tok::colon) || !areTokensAdjacent(Next, SecondToken))
     90     return;
     91 
     92   TemplateTy Template;
     93   UnqualifiedId TemplateName;
     94   TemplateName.setIdentifier(&II, Tok.getLocation());
     95   bool MemberOfUnknownSpecialization;
     96   if (!Actions.isTemplateName(getCurScope(), SS, /*hasTemplateKeyword=*/false,
     97                               TemplateName, ObjectType, EnteringContext,
     98                               Template, MemberOfUnknownSpecialization))
     99     return;
    100 
    101   FixDigraph(*this, PP, Next, SecondToken, tok::unknown,
    102              /*AtDigraph*/false);
    103 }
    104 
    105 /// Parse global scope or nested-name-specifier if present.
    106 ///
    107 /// Parses a C++ global scope specifier ('::') or nested-name-specifier (which
    108 /// may be preceded by '::'). Note that this routine will not parse ::new or
    109 /// ::delete; it will just leave them in the token stream.
    110 ///
    111 ///       '::'[opt] nested-name-specifier
    112 ///       '::'
    113 ///
    114 ///       nested-name-specifier:
    115 ///         type-name '::'
    116 ///         namespace-name '::'
    117 ///         nested-name-specifier identifier '::'
    118 ///         nested-name-specifier 'template'[opt] simple-template-id '::'
    119 ///
    120 ///
    121 /// \param SS the scope specifier that will be set to the parsed
    122 /// nested-name-specifier (or empty)
    123 ///
    124 /// \param ObjectType if this nested-name-specifier is being parsed following
    125 /// the "." or "->" of a member access expression, this parameter provides the
    126 /// type of the object whose members are being accessed.
    127 ///
    128 /// \param ObjectHadErrors if this unqualified-id occurs within a member access
    129 /// expression, indicates whether the original subexpressions had any errors.
    130 /// When true, diagnostics for missing 'template' keyword will be supressed.
    131 ///
    132 /// \param EnteringContext whether we will be entering into the context of
    133 /// the nested-name-specifier after parsing it.
    134 ///
    135 /// \param MayBePseudoDestructor When non-NULL, points to a flag that
    136 /// indicates whether this nested-name-specifier may be part of a
    137 /// pseudo-destructor name. In this case, the flag will be set false
    138 /// if we don't actually end up parsing a destructor name. Moreover,
    139 /// if we do end up determining that we are parsing a destructor name,
    140 /// the last component of the nested-name-specifier is not parsed as
    141 /// part of the scope specifier.
    142 ///
    143 /// \param IsTypename If \c true, this nested-name-specifier is known to be
    144 /// part of a type name. This is used to improve error recovery.
    145 ///
    146 /// \param LastII When non-NULL, points to an IdentifierInfo* that will be
    147 /// filled in with the leading identifier in the last component of the
    148 /// nested-name-specifier, if any.
    149 ///
    150 /// \param OnlyNamespace If true, only considers namespaces in lookup.
    151 ///
    152 ///
    153 /// \returns true if there was an error parsing a scope specifier
    154 bool Parser::ParseOptionalCXXScopeSpecifier(
    155     CXXScopeSpec &SS, ParsedType ObjectType, bool ObjectHadErrors,
    156     bool EnteringContext, bool *MayBePseudoDestructor, bool IsTypename,
    157     IdentifierInfo **LastII, bool OnlyNamespace, bool InUsingDeclaration) {
    158   assert(getLangOpts().CPlusPlus &&
    159          "Call sites of this function should be guarded by checking for C++");
    160 
    161   if (Tok.is(tok::annot_cxxscope)) {
    162     assert(!LastII && "want last identifier but have already annotated scope");
    163     assert(!MayBePseudoDestructor && "unexpected annot_cxxscope");
    164     Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(),
    165                                                  Tok.getAnnotationRange(),
    166                                                  SS);
    167     ConsumeAnnotationToken();
    168     return false;
    169   }
    170 
    171   // Has to happen before any "return false"s in this function.
    172   bool CheckForDestructor = false;
    173   if (MayBePseudoDestructor && *MayBePseudoDestructor) {
    174     CheckForDestructor = true;
    175     *MayBePseudoDestructor = false;
    176   }
    177 
    178   if (LastII)
    179     *LastII = nullptr;
    180 
    181   bool HasScopeSpecifier = false;
    182 
    183   if (Tok.is(tok::coloncolon)) {
    184     // ::new and ::delete aren't nested-name-specifiers.
    185     tok::TokenKind NextKind = NextToken().getKind();
    186     if (NextKind == tok::kw_new || NextKind == tok::kw_delete)
    187       return false;
    188 
    189     if (NextKind == tok::l_brace) {
    190       // It is invalid to have :: {, consume the scope qualifier and pretend
    191       // like we never saw it.
    192       Diag(ConsumeToken(), diag::err_expected) << tok::identifier;
    193     } else {
    194       // '::' - Global scope qualifier.
    195       if (Actions.ActOnCXXGlobalScopeSpecifier(ConsumeToken(), SS))
    196         return true;
    197 
    198       HasScopeSpecifier = true;
    199     }
    200   }
    201 
    202   if (Tok.is(tok::kw___super)) {
    203     SourceLocation SuperLoc = ConsumeToken();
    204     if (!Tok.is(tok::coloncolon)) {
    205       Diag(Tok.getLocation(), diag::err_expected_coloncolon_after_super);
    206       return true;
    207     }
    208 
    209     return Actions.ActOnSuperScopeSpecifier(SuperLoc, ConsumeToken(), SS);
    210   }
    211 
    212   if (!HasScopeSpecifier &&
    213       Tok.isOneOf(tok::kw_decltype, tok::annot_decltype)) {
    214     DeclSpec DS(AttrFactory);
    215     SourceLocation DeclLoc = Tok.getLocation();
    216     SourceLocation EndLoc  = ParseDecltypeSpecifier(DS);
    217 
    218     SourceLocation CCLoc;
    219     // Work around a standard defect: 'decltype(auto)::' is not a
    220     // nested-name-specifier.
    221     if (DS.getTypeSpecType() == DeclSpec::TST_decltype_auto ||
    222         !TryConsumeToken(tok::coloncolon, CCLoc)) {
    223       AnnotateExistingDecltypeSpecifier(DS, DeclLoc, EndLoc);
    224       return false;
    225     }
    226 
    227     if (Actions.ActOnCXXNestedNameSpecifierDecltype(SS, DS, CCLoc))
    228       SS.SetInvalid(SourceRange(DeclLoc, CCLoc));
    229 
    230     HasScopeSpecifier = true;
    231   }
    232 
    233   // Preferred type might change when parsing qualifiers, we need the original.
    234   auto SavedType = PreferredType;
    235   while (true) {
    236     if (HasScopeSpecifier) {
    237       if (Tok.is(tok::code_completion)) {
    238         cutOffParsing();
    239         // Code completion for a nested-name-specifier, where the code
    240         // completion token follows the '::'.
    241         Actions.CodeCompleteQualifiedId(getCurScope(), SS, EnteringContext,
    242                                         InUsingDeclaration, ObjectType.get(),
    243                                         SavedType.get(SS.getBeginLoc()));
    244         // Include code completion token into the range of the scope otherwise
    245         // when we try to annotate the scope tokens the dangling code completion
    246         // token will cause assertion in
    247         // Preprocessor::AnnotatePreviousCachedTokens.
    248         SS.setEndLoc(Tok.getLocation());
    249         return true;
    250       }
    251 
    252       // C++ [basic.lookup.classref]p5:
    253       //   If the qualified-id has the form
    254       //
    255       //       ::class-name-or-namespace-name::...
    256       //
    257       //   the class-name-or-namespace-name is looked up in global scope as a
    258       //   class-name or namespace-name.
    259       //
    260       // To implement this, we clear out the object type as soon as we've
    261       // seen a leading '::' or part of a nested-name-specifier.
    262       ObjectType = nullptr;
    263     }
    264 
    265     // nested-name-specifier:
    266     //   nested-name-specifier 'template'[opt] simple-template-id '::'
    267 
    268     // Parse the optional 'template' keyword, then make sure we have
    269     // 'identifier <' after it.
    270     if (Tok.is(tok::kw_template)) {
    271       // If we don't have a scope specifier or an object type, this isn't a
    272       // nested-name-specifier, since they aren't allowed to start with
    273       // 'template'.
    274       if (!HasScopeSpecifier && !ObjectType)
    275         break;
    276 
    277       TentativeParsingAction TPA(*this);
    278       SourceLocation TemplateKWLoc = ConsumeToken();
    279 
    280       UnqualifiedId TemplateName;
    281       if (Tok.is(tok::identifier)) {
    282         // Consume the identifier.
    283         TemplateName.setIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
    284         ConsumeToken();
    285       } else if (Tok.is(tok::kw_operator)) {
    286         // We don't need to actually parse the unqualified-id in this case,
    287         // because a simple-template-id cannot start with 'operator', but
    288         // go ahead and parse it anyway for consistency with the case where
    289         // we already annotated the template-id.
    290         if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType,
    291                                        TemplateName)) {
    292           TPA.Commit();
    293           break;
    294         }
    295 
    296         if (TemplateName.getKind() != UnqualifiedIdKind::IK_OperatorFunctionId &&
    297             TemplateName.getKind() != UnqualifiedIdKind::IK_LiteralOperatorId) {
    298           Diag(TemplateName.getSourceRange().getBegin(),
    299                diag::err_id_after_template_in_nested_name_spec)
    300             << TemplateName.getSourceRange();
    301           TPA.Commit();
    302           break;
    303         }
    304       } else {
    305         TPA.Revert();
    306         break;
    307       }
    308 
    309       // If the next token is not '<', we have a qualified-id that refers
    310       // to a template name, such as T::template apply, but is not a
    311       // template-id.
    312       if (Tok.isNot(tok::less)) {
    313         TPA.Revert();
    314         break;
    315       }
    316 
    317       // Commit to parsing the template-id.
    318       TPA.Commit();
    319       TemplateTy Template;
    320       TemplateNameKind TNK = Actions.ActOnTemplateName(
    321           getCurScope(), SS, TemplateKWLoc, TemplateName, ObjectType,
    322           EnteringContext, Template, /*AllowInjectedClassName*/ true);
    323       if (AnnotateTemplateIdToken(Template, TNK, SS, TemplateKWLoc,
    324                                   TemplateName, false))
    325         return true;
    326 
    327       continue;
    328     }
    329 
    330     if (Tok.is(tok::annot_template_id) && NextToken().is(tok::coloncolon)) {
    331       // We have
    332       //
    333       //   template-id '::'
    334       //
    335       // So we need to check whether the template-id is a simple-template-id of
    336       // the right kind (it should name a type or be dependent), and then
    337       // convert it into a type within the nested-name-specifier.
    338       TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
    339       if (CheckForDestructor && GetLookAheadToken(2).is(tok::tilde)) {
    340         *MayBePseudoDestructor = true;
    341         return false;
    342       }
    343 
    344       if (LastII)
    345         *LastII = TemplateId->Name;
    346 
    347       // Consume the template-id token.
    348       ConsumeAnnotationToken();
    349 
    350       assert(Tok.is(tok::coloncolon) && "NextToken() not working properly!");
    351       SourceLocation CCLoc = ConsumeToken();
    352 
    353       HasScopeSpecifier = true;
    354 
    355       ASTTemplateArgsPtr TemplateArgsPtr(TemplateId->getTemplateArgs(),
    356                                          TemplateId->NumArgs);
    357 
    358       if (TemplateId->isInvalid() ||
    359           Actions.ActOnCXXNestedNameSpecifier(getCurScope(),
    360                                               SS,
    361                                               TemplateId->TemplateKWLoc,
    362                                               TemplateId->Template,
    363                                               TemplateId->TemplateNameLoc,
    364                                               TemplateId->LAngleLoc,
    365                                               TemplateArgsPtr,
    366                                               TemplateId->RAngleLoc,
    367                                               CCLoc,
    368                                               EnteringContext)) {
    369         SourceLocation StartLoc
    370           = SS.getBeginLoc().isValid()? SS.getBeginLoc()
    371                                       : TemplateId->TemplateNameLoc;
    372         SS.SetInvalid(SourceRange(StartLoc, CCLoc));
    373       }
    374 
    375       continue;
    376     }
    377 
    378     // The rest of the nested-name-specifier possibilities start with
    379     // tok::identifier.
    380     if (Tok.isNot(tok::identifier))
    381       break;
    382 
    383     IdentifierInfo &II = *Tok.getIdentifierInfo();
    384 
    385     // nested-name-specifier:
    386     //   type-name '::'
    387     //   namespace-name '::'
    388     //   nested-name-specifier identifier '::'
    389     Token Next = NextToken();
    390     Sema::NestedNameSpecInfo IdInfo(&II, Tok.getLocation(), Next.getLocation(),
    391                                     ObjectType);
    392 
    393     // If we get foo:bar, this is almost certainly a typo for foo::bar.  Recover
    394     // and emit a fixit hint for it.
    395     if (Next.is(tok::colon) && !ColonIsSacred) {
    396       if (Actions.IsInvalidUnlessNestedName(getCurScope(), SS, IdInfo,
    397                                             EnteringContext) &&
    398           // If the token after the colon isn't an identifier, it's still an
    399           // error, but they probably meant something else strange so don't
    400           // recover like this.
    401           PP.LookAhead(1).is(tok::identifier)) {
    402         Diag(Next, diag::err_unexpected_colon_in_nested_name_spec)
    403           << FixItHint::CreateReplacement(Next.getLocation(), "::");
    404         // Recover as if the user wrote '::'.
    405         Next.setKind(tok::coloncolon);
    406       }
    407     }
    408 
    409     if (Next.is(tok::coloncolon) && GetLookAheadToken(2).is(tok::l_brace)) {
    410       // It is invalid to have :: {, consume the scope qualifier and pretend
    411       // like we never saw it.
    412       Token Identifier = Tok; // Stash away the identifier.
    413       ConsumeToken();         // Eat the identifier, current token is now '::'.
    414       Diag(PP.getLocForEndOfToken(ConsumeToken()), diag::err_expected)
    415           << tok::identifier;
    416       UnconsumeToken(Identifier); // Stick the identifier back.
    417       Next = NextToken();         // Point Next at the '{' token.
    418     }
    419 
    420     if (Next.is(tok::coloncolon)) {
    421       if (CheckForDestructor && GetLookAheadToken(2).is(tok::tilde)) {
    422         *MayBePseudoDestructor = true;
    423         return false;
    424       }
    425 
    426       if (ColonIsSacred) {
    427         const Token &Next2 = GetLookAheadToken(2);
    428         if (Next2.is(tok::kw_private) || Next2.is(tok::kw_protected) ||
    429             Next2.is(tok::kw_public) || Next2.is(tok::kw_virtual)) {
    430           Diag(Next2, diag::err_unexpected_token_in_nested_name_spec)
    431               << Next2.getName()
    432               << FixItHint::CreateReplacement(Next.getLocation(), ":");
    433           Token ColonColon;
    434           PP.Lex(ColonColon);
    435           ColonColon.setKind(tok::colon);
    436           PP.EnterToken(ColonColon, /*IsReinject*/ true);
    437           break;
    438         }
    439       }
    440 
    441       if (LastII)
    442         *LastII = &II;
    443 
    444       // We have an identifier followed by a '::'. Lookup this name
    445       // as the name in a nested-name-specifier.
    446       Token Identifier = Tok;
    447       SourceLocation IdLoc = ConsumeToken();
    448       assert(Tok.isOneOf(tok::coloncolon, tok::colon) &&
    449              "NextToken() not working properly!");
    450       Token ColonColon = Tok;
    451       SourceLocation CCLoc = ConsumeToken();
    452 
    453       bool IsCorrectedToColon = false;
    454       bool *CorrectionFlagPtr = ColonIsSacred ? &IsCorrectedToColon : nullptr;
    455       if (Actions.ActOnCXXNestedNameSpecifier(
    456               getCurScope(), IdInfo, EnteringContext, SS, false,
    457               CorrectionFlagPtr, OnlyNamespace)) {
    458         // Identifier is not recognized as a nested name, but we can have
    459         // mistyped '::' instead of ':'.
    460         if (CorrectionFlagPtr && IsCorrectedToColon) {
    461           ColonColon.setKind(tok::colon);
    462           PP.EnterToken(Tok, /*IsReinject*/ true);
    463           PP.EnterToken(ColonColon, /*IsReinject*/ true);
    464           Tok = Identifier;
    465           break;
    466         }
    467         SS.SetInvalid(SourceRange(IdLoc, CCLoc));
    468       }
    469       HasScopeSpecifier = true;
    470       continue;
    471     }
    472 
    473     CheckForTemplateAndDigraph(Next, ObjectType, EnteringContext, II, SS);
    474 
    475     // nested-name-specifier:
    476     //   type-name '<'
    477     if (Next.is(tok::less)) {
    478 
    479       TemplateTy Template;
    480       UnqualifiedId TemplateName;
    481       TemplateName.setIdentifier(&II, Tok.getLocation());
    482       bool MemberOfUnknownSpecialization;
    483       if (TemplateNameKind TNK = Actions.isTemplateName(getCurScope(), SS,
    484                                               /*hasTemplateKeyword=*/false,
    485                                                         TemplateName,
    486                                                         ObjectType,
    487                                                         EnteringContext,
    488                                                         Template,
    489                                               MemberOfUnknownSpecialization)) {
    490         // If lookup didn't find anything, we treat the name as a template-name
    491         // anyway. C++20 requires this, and in prior language modes it improves
    492         // error recovery. But before we commit to this, check that we actually
    493         // have something that looks like a template-argument-list next.
    494         if (!IsTypename && TNK == TNK_Undeclared_template &&
    495             isTemplateArgumentList(1) == TPResult::False)
    496           break;
    497 
    498         // We have found a template name, so annotate this token
    499         // with a template-id annotation. We do not permit the
    500         // template-id to be translated into a type annotation,
    501         // because some clients (e.g., the parsing of class template
    502         // specializations) still want to see the original template-id
    503         // token, and it might not be a type at all (e.g. a concept name in a
    504         // type-constraint).
    505         ConsumeToken();
    506         if (AnnotateTemplateIdToken(Template, TNK, SS, SourceLocation(),
    507                                     TemplateName, false))
    508           return true;
    509         continue;
    510       }
    511 
    512       if (MemberOfUnknownSpecialization && (ObjectType || SS.isSet()) &&
    513           (IsTypename || isTemplateArgumentList(1) == TPResult::True)) {
    514         // If we had errors before, ObjectType can be dependent even without any
    515         // templates. Do not report missing template keyword in that case.
    516         if (!ObjectHadErrors) {
    517           // We have something like t::getAs<T>, where getAs is a
    518           // member of an unknown specialization. However, this will only
    519           // parse correctly as a template, so suggest the keyword 'template'
    520           // before 'getAs' and treat this as a dependent template name.
    521           unsigned DiagID = diag::err_missing_dependent_template_keyword;
    522           if (getLangOpts().MicrosoftExt)
    523             DiagID = diag::warn_missing_dependent_template_keyword;
    524 
    525           Diag(Tok.getLocation(), DiagID)
    526               << II.getName()
    527               << FixItHint::CreateInsertion(Tok.getLocation(), "template ");
    528         }
    529 
    530         SourceLocation TemplateNameLoc = ConsumeToken();
    531 
    532         TemplateNameKind TNK = Actions.ActOnTemplateName(
    533             getCurScope(), SS, TemplateNameLoc, TemplateName, ObjectType,
    534             EnteringContext, Template, /*AllowInjectedClassName*/ true);
    535         if (AnnotateTemplateIdToken(Template, TNK, SS, SourceLocation(),
    536                                     TemplateName, false))
    537           return true;
    538 
    539         continue;
    540       }
    541     }
    542 
    543     // We don't have any tokens that form the beginning of a
    544     // nested-name-specifier, so we're done.
    545     break;
    546   }
    547 
    548   // Even if we didn't see any pieces of a nested-name-specifier, we
    549   // still check whether there is a tilde in this position, which
    550   // indicates a potential pseudo-destructor.
    551   if (CheckForDestructor && !HasScopeSpecifier && Tok.is(tok::tilde))
    552     *MayBePseudoDestructor = true;
    553 
    554   return false;
    555 }
    556 
    557 ExprResult Parser::tryParseCXXIdExpression(CXXScopeSpec &SS,
    558                                            bool isAddressOfOperand,
    559                                            Token &Replacement) {
    560   ExprResult E;
    561 
    562   // We may have already annotated this id-expression.
    563   switch (Tok.getKind()) {
    564   case tok::annot_non_type: {
    565     NamedDecl *ND = getNonTypeAnnotation(Tok);
    566     SourceLocation Loc = ConsumeAnnotationToken();
    567     E = Actions.ActOnNameClassifiedAsNonType(getCurScope(), SS, ND, Loc, Tok);
    568     break;
    569   }
    570 
    571   case tok::annot_non_type_dependent: {
    572     IdentifierInfo *II = getIdentifierAnnotation(Tok);
    573     SourceLocation Loc = ConsumeAnnotationToken();
    574 
    575     // This is only the direct operand of an & operator if it is not
    576     // followed by a postfix-expression suffix.
    577     if (isAddressOfOperand && isPostfixExpressionSuffixStart())
    578       isAddressOfOperand = false;
    579 
    580     E = Actions.ActOnNameClassifiedAsDependentNonType(SS, II, Loc,
    581                                                       isAddressOfOperand);
    582     break;
    583   }
    584 
    585   case tok::annot_non_type_undeclared: {
    586     assert(SS.isEmpty() &&
    587            "undeclared non-type annotation should be unqualified");
    588     IdentifierInfo *II = getIdentifierAnnotation(Tok);
    589     SourceLocation Loc = ConsumeAnnotationToken();
    590     E = Actions.ActOnNameClassifiedAsUndeclaredNonType(II, Loc);
    591     break;
    592   }
    593 
    594   default:
    595     SourceLocation TemplateKWLoc;
    596     UnqualifiedId Name;
    597     if (ParseUnqualifiedId(SS, /*ObjectType=*/nullptr,
    598                            /*ObjectHadErrors=*/false,
    599                            /*EnteringContext=*/false,
    600                            /*AllowDestructorName=*/false,
    601                            /*AllowConstructorName=*/false,
    602                            /*AllowDeductionGuide=*/false, &TemplateKWLoc, Name))
    603       return ExprError();
    604 
    605     // This is only the direct operand of an & operator if it is not
    606     // followed by a postfix-expression suffix.
    607     if (isAddressOfOperand && isPostfixExpressionSuffixStart())
    608       isAddressOfOperand = false;
    609 
    610     E = Actions.ActOnIdExpression(
    611         getCurScope(), SS, TemplateKWLoc, Name, Tok.is(tok::l_paren),
    612         isAddressOfOperand, /*CCC=*/nullptr, /*IsInlineAsmIdentifier=*/false,
    613         &Replacement);
    614     break;
    615   }
    616 
    617   if (!E.isInvalid() && !E.isUnset() && Tok.is(tok::less))
    618     checkPotentialAngleBracket(E);
    619   return E;
    620 }
    621 
    622 /// ParseCXXIdExpression - Handle id-expression.
    623 ///
    624 ///       id-expression:
    625 ///         unqualified-id
    626 ///         qualified-id
    627 ///
    628 ///       qualified-id:
    629 ///         '::'[opt] nested-name-specifier 'template'[opt] unqualified-id
    630 ///         '::' identifier
    631 ///         '::' operator-function-id
    632 ///         '::' template-id
    633 ///
    634 /// NOTE: The standard specifies that, for qualified-id, the parser does not
    635 /// expect:
    636 ///
    637 ///   '::' conversion-function-id
    638 ///   '::' '~' class-name
    639 ///
    640 /// This may cause a slight inconsistency on diagnostics:
    641 ///
    642 /// class C {};
    643 /// namespace A {}
    644 /// void f() {
    645 ///   :: A :: ~ C(); // Some Sema error about using destructor with a
    646 ///                  // namespace.
    647 ///   :: ~ C(); // Some Parser error like 'unexpected ~'.
    648 /// }
    649 ///
    650 /// We simplify the parser a bit and make it work like:
    651 ///
    652 ///       qualified-id:
    653 ///         '::'[opt] nested-name-specifier 'template'[opt] unqualified-id
    654 ///         '::' unqualified-id
    655 ///
    656 /// That way Sema can handle and report similar errors for namespaces and the
    657 /// global scope.
    658 ///
    659 /// The isAddressOfOperand parameter indicates that this id-expression is a
    660 /// direct operand of the address-of operator. This is, besides member contexts,
    661 /// the only place where a qualified-id naming a non-static class member may
    662 /// appear.
    663 ///
    664 ExprResult Parser::ParseCXXIdExpression(bool isAddressOfOperand) {
    665   // qualified-id:
    666   //   '::'[opt] nested-name-specifier 'template'[opt] unqualified-id
    667   //   '::' unqualified-id
    668   //
    669   CXXScopeSpec SS;
    670   ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/nullptr,
    671                                  /*ObjectHadErrors=*/false,
    672                                  /*EnteringContext=*/false);
    673 
    674   Token Replacement;
    675   ExprResult Result =
    676       tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement);
    677   if (Result.isUnset()) {
    678     // If the ExprResult is valid but null, then typo correction suggested a
    679     // keyword replacement that needs to be reparsed.
    680     UnconsumeToken(Replacement);
    681     Result = tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement);
    682   }
    683   assert(!Result.isUnset() && "Typo correction suggested a keyword replacement "
    684                               "for a previous keyword suggestion");
    685   return Result;
    686 }
    687 
    688 /// ParseLambdaExpression - Parse a C++11 lambda expression.
    689 ///
    690 ///       lambda-expression:
    691 ///         lambda-introducer lambda-declarator compound-statement
    692 ///         lambda-introducer '<' template-parameter-list '>'
    693 ///             requires-clause[opt] lambda-declarator compound-statement
    694 ///
    695 ///       lambda-introducer:
    696 ///         '[' lambda-capture[opt] ']'
    697 ///
    698 ///       lambda-capture:
    699 ///         capture-default
    700 ///         capture-list
    701 ///         capture-default ',' capture-list
    702 ///
    703 ///       capture-default:
    704 ///         '&'
    705 ///         '='
    706 ///
    707 ///       capture-list:
    708 ///         capture
    709 ///         capture-list ',' capture
    710 ///
    711 ///       capture:
    712 ///         simple-capture
    713 ///         init-capture     [C++1y]
    714 ///
    715 ///       simple-capture:
    716 ///         identifier
    717 ///         '&' identifier
    718 ///         'this'
    719 ///
    720 ///       init-capture:      [C++1y]
    721 ///         identifier initializer
    722 ///         '&' identifier initializer
    723 ///
    724 ///       lambda-declarator:
    725 ///         lambda-specifiers     [C++2b]
    726 ///         '(' parameter-declaration-clause ')' lambda-specifiers
    727 ///             requires-clause[opt]
    728 ///
    729 ///       lambda-specifiers:
    730 ///         decl-specifier-seq[opt] noexcept-specifier[opt]
    731 ///             attribute-specifier-seq[opt] trailing-return-type[opt]
    732 ///
    733 ExprResult Parser::ParseLambdaExpression() {
    734   // Parse lambda-introducer.
    735   LambdaIntroducer Intro;
    736   if (ParseLambdaIntroducer(Intro)) {
    737     SkipUntil(tok::r_square, StopAtSemi);
    738     SkipUntil(tok::l_brace, StopAtSemi);
    739     SkipUntil(tok::r_brace, StopAtSemi);
    740     return ExprError();
    741   }
    742 
    743   return ParseLambdaExpressionAfterIntroducer(Intro);
    744 }
    745 
    746 /// Use lookahead and potentially tentative parsing to determine if we are
    747 /// looking at a C++11 lambda expression, and parse it if we are.
    748 ///
    749 /// If we are not looking at a lambda expression, returns ExprError().
    750 ExprResult Parser::TryParseLambdaExpression() {
    751   assert(getLangOpts().CPlusPlus11
    752          && Tok.is(tok::l_square)
    753          && "Not at the start of a possible lambda expression.");
    754 
    755   const Token Next = NextToken();
    756   if (Next.is(tok::eof)) // Nothing else to lookup here...
    757     return ExprEmpty();
    758 
    759   const Token After = GetLookAheadToken(2);
    760   // If lookahead indicates this is a lambda...
    761   if (Next.is(tok::r_square) ||     // []
    762       Next.is(tok::equal) ||        // [=
    763       (Next.is(tok::amp) &&         // [&] or [&,
    764        After.isOneOf(tok::r_square, tok::comma)) ||
    765       (Next.is(tok::identifier) &&  // [identifier]
    766        After.is(tok::r_square)) ||
    767       Next.is(tok::ellipsis)) {     // [...
    768     return ParseLambdaExpression();
    769   }
    770 
    771   // If lookahead indicates an ObjC message send...
    772   // [identifier identifier
    773   if (Next.is(tok::identifier) && After.is(tok::identifier))
    774     return ExprEmpty();
    775 
    776   // Here, we're stuck: lambda introducers and Objective-C message sends are
    777   // unambiguous, but it requires arbitrary lookhead.  [a,b,c,d,e,f,g] is a
    778   // lambda, and [a,b,c,d,e,f,g h] is a Objective-C message send.  Instead of
    779   // writing two routines to parse a lambda introducer, just try to parse
    780   // a lambda introducer first, and fall back if that fails.
    781   LambdaIntroducer Intro;
    782   {
    783     TentativeParsingAction TPA(*this);
    784     LambdaIntroducerTentativeParse Tentative;
    785     if (ParseLambdaIntroducer(Intro, &Tentative)) {
    786       TPA.Commit();
    787       return ExprError();
    788     }
    789 
    790     switch (Tentative) {
    791     case LambdaIntroducerTentativeParse::Success:
    792       TPA.Commit();
    793       break;
    794 
    795     case LambdaIntroducerTentativeParse::Incomplete:
    796       // Didn't fully parse the lambda-introducer, try again with a
    797       // non-tentative parse.
    798       TPA.Revert();
    799       Intro = LambdaIntroducer();
    800       if (ParseLambdaIntroducer(Intro))
    801         return ExprError();
    802       break;
    803 
    804     case LambdaIntroducerTentativeParse::MessageSend:
    805     case LambdaIntroducerTentativeParse::Invalid:
    806       // Not a lambda-introducer, might be a message send.
    807       TPA.Revert();
    808       return ExprEmpty();
    809     }
    810   }
    811 
    812   return ParseLambdaExpressionAfterIntroducer(Intro);
    813 }
    814 
    815 /// Parse a lambda introducer.
    816 /// \param Intro A LambdaIntroducer filled in with information about the
    817 ///        contents of the lambda-introducer.
    818 /// \param Tentative If non-null, we are disambiguating between a
    819 ///        lambda-introducer and some other construct. In this mode, we do not
    820 ///        produce any diagnostics or take any other irreversible action unless
    821 ///        we're sure that this is a lambda-expression.
    822 /// \return \c true if parsing (or disambiguation) failed with a diagnostic and
    823 ///         the caller should bail out / recover.
    824 bool Parser::ParseLambdaIntroducer(LambdaIntroducer &Intro,
    825                                    LambdaIntroducerTentativeParse *Tentative) {
    826   if (Tentative)
    827     *Tentative = LambdaIntroducerTentativeParse::Success;
    828 
    829   assert(Tok.is(tok::l_square) && "Lambda expressions begin with '['.");
    830   BalancedDelimiterTracker T(*this, tok::l_square);
    831   T.consumeOpen();
    832 
    833   Intro.Range.setBegin(T.getOpenLocation());
    834 
    835   bool First = true;
    836 
    837   // Produce a diagnostic if we're not tentatively parsing; otherwise track
    838   // that our parse has failed.
    839   auto Invalid = [&](llvm::function_ref<void()> Action) {
    840     if (Tentative) {
    841       *Tentative = LambdaIntroducerTentativeParse::Invalid;
    842       return false;
    843     }
    844     Action();
    845     return true;
    846   };
    847 
    848   // Perform some irreversible action if this is a non-tentative parse;
    849   // otherwise note that our actions were incomplete.
    850   auto NonTentativeAction = [&](llvm::function_ref<void()> Action) {
    851     if (Tentative)
    852       *Tentative = LambdaIntroducerTentativeParse::Incomplete;
    853     else
    854       Action();
    855   };
    856 
    857   // Parse capture-default.
    858   if (Tok.is(tok::amp) &&
    859       (NextToken().is(tok::comma) || NextToken().is(tok::r_square))) {
    860     Intro.Default = LCD_ByRef;
    861     Intro.DefaultLoc = ConsumeToken();
    862     First = false;
    863     if (!Tok.getIdentifierInfo()) {
    864       // This can only be a lambda; no need for tentative parsing any more.
    865       // '[[and]]' can still be an attribute, though.
    866       Tentative = nullptr;
    867     }
    868   } else if (Tok.is(tok::equal)) {
    869     Intro.Default = LCD_ByCopy;
    870     Intro.DefaultLoc = ConsumeToken();
    871     First = false;
    872     Tentative = nullptr;
    873   }
    874 
    875   while (Tok.isNot(tok::r_square)) {
    876     if (!First) {
    877       if (Tok.isNot(tok::comma)) {
    878         // Provide a completion for a lambda introducer here. Except
    879         // in Objective-C, where this is Almost Surely meant to be a message
    880         // send. In that case, fail here and let the ObjC message
    881         // expression parser perform the completion.
    882         if (Tok.is(tok::code_completion) &&
    883             !(getLangOpts().ObjC && Tentative)) {
    884           cutOffParsing();
    885           Actions.CodeCompleteLambdaIntroducer(getCurScope(), Intro,
    886                                                /*AfterAmpersand=*/false);
    887           break;
    888         }
    889 
    890         return Invalid([&] {
    891           Diag(Tok.getLocation(), diag::err_expected_comma_or_rsquare);
    892         });
    893       }
    894       ConsumeToken();
    895     }
    896 
    897     if (Tok.is(tok::code_completion)) {
    898       cutOffParsing();
    899       // If we're in Objective-C++ and we have a bare '[', then this is more
    900       // likely to be a message receiver.
    901       if (getLangOpts().ObjC && Tentative && First)
    902         Actions.CodeCompleteObjCMessageReceiver(getCurScope());
    903       else
    904         Actions.CodeCompleteLambdaIntroducer(getCurScope(), Intro,
    905                                              /*AfterAmpersand=*/false);
    906       break;
    907     }
    908 
    909     First = false;
    910 
    911     // Parse capture.
    912     LambdaCaptureKind Kind = LCK_ByCopy;
    913     LambdaCaptureInitKind InitKind = LambdaCaptureInitKind::NoInit;
    914     SourceLocation Loc;
    915     IdentifierInfo *Id = nullptr;
    916     SourceLocation EllipsisLocs[4];
    917     ExprResult Init;
    918     SourceLocation LocStart = Tok.getLocation();
    919 
    920     if (Tok.is(tok::star)) {
    921       Loc = ConsumeToken();
    922       if (Tok.is(tok::kw_this)) {
    923         ConsumeToken();
    924         Kind = LCK_StarThis;
    925       } else {
    926         return Invalid([&] {
    927           Diag(Tok.getLocation(), diag::err_expected_star_this_capture);
    928         });
    929       }
    930     } else if (Tok.is(tok::kw_this)) {
    931       Kind = LCK_This;
    932       Loc = ConsumeToken();
    933     } else if (Tok.isOneOf(tok::amp, tok::equal) &&
    934                NextToken().isOneOf(tok::comma, tok::r_square) &&
    935                Intro.Default == LCD_None) {
    936       // We have a lone "&" or "=" which is either a misplaced capture-default
    937       // or the start of a capture (in the "&" case) with the rest of the
    938       // capture missing. Both are an error but a misplaced capture-default
    939       // is more likely if we don't already have a capture default.
    940       return Invalid(
    941           [&] { Diag(Tok.getLocation(), diag::err_capture_default_first); });
    942     } else {
    943       TryConsumeToken(tok::ellipsis, EllipsisLocs[0]);
    944 
    945       if (Tok.is(tok::amp)) {
    946         Kind = LCK_ByRef;
    947         ConsumeToken();
    948 
    949         if (Tok.is(tok::code_completion)) {
    950           cutOffParsing();
    951           Actions.CodeCompleteLambdaIntroducer(getCurScope(), Intro,
    952                                                /*AfterAmpersand=*/true);
    953           break;
    954         }
    955       }
    956 
    957       TryConsumeToken(tok::ellipsis, EllipsisLocs[1]);
    958 
    959       if (Tok.is(tok::identifier)) {
    960         Id = Tok.getIdentifierInfo();
    961         Loc = ConsumeToken();
    962       } else if (Tok.is(tok::kw_this)) {
    963         return Invalid([&] {
    964           // FIXME: Suggest a fixit here.
    965           Diag(Tok.getLocation(), diag::err_this_captured_by_reference);
    966         });
    967       } else {
    968         return Invalid([&] {
    969           Diag(Tok.getLocation(), diag::err_expected_capture);
    970         });
    971       }
    972 
    973       TryConsumeToken(tok::ellipsis, EllipsisLocs[2]);
    974 
    975       if (Tok.is(tok::l_paren)) {
    976         BalancedDelimiterTracker Parens(*this, tok::l_paren);
    977         Parens.consumeOpen();
    978 
    979         InitKind = LambdaCaptureInitKind::DirectInit;
    980 
    981         ExprVector Exprs;
    982         CommaLocsTy Commas;
    983         if (Tentative) {
    984           Parens.skipToEnd();
    985           *Tentative = LambdaIntroducerTentativeParse::Incomplete;
    986         } else if (ParseExpressionList(Exprs, Commas)) {
    987           Parens.skipToEnd();
    988           Init = ExprError();
    989         } else {
    990           Parens.consumeClose();
    991           Init = Actions.ActOnParenListExpr(Parens.getOpenLocation(),
    992                                             Parens.getCloseLocation(),
    993                                             Exprs);
    994         }
    995       } else if (Tok.isOneOf(tok::l_brace, tok::equal)) {
    996         // Each lambda init-capture forms its own full expression, which clears
    997         // Actions.MaybeODRUseExprs. So create an expression evaluation context
    998         // to save the necessary state, and restore it later.
    999         EnterExpressionEvaluationContext EC(
   1000             Actions, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
   1001 
   1002         if (TryConsumeToken(tok::equal))
   1003           InitKind = LambdaCaptureInitKind::CopyInit;
   1004         else
   1005           InitKind = LambdaCaptureInitKind::ListInit;
   1006 
   1007         if (!Tentative) {
   1008           Init = ParseInitializer();
   1009         } else if (Tok.is(tok::l_brace)) {
   1010           BalancedDelimiterTracker Braces(*this, tok::l_brace);
   1011           Braces.consumeOpen();
   1012           Braces.skipToEnd();
   1013           *Tentative = LambdaIntroducerTentativeParse::Incomplete;
   1014         } else {
   1015           // We're disambiguating this:
   1016           //
   1017           //   [..., x = expr
   1018           //
   1019           // We need to find the end of the following expression in order to
   1020           // determine whether this is an Obj-C message send's receiver, a
   1021           // C99 designator, or a lambda init-capture.
   1022           //
   1023           // Parse the expression to find where it ends, and annotate it back
   1024           // onto the tokens. We would have parsed this expression the same way
   1025           // in either case: both the RHS of an init-capture and the RHS of an
   1026           // assignment expression are parsed as an initializer-clause, and in
   1027           // neither case can anything be added to the scope between the '[' and
   1028           // here.
   1029           //
   1030           // FIXME: This is horrible. Adding a mechanism to skip an expression
   1031           // would be much cleaner.
   1032           // FIXME: If there is a ',' before the next ']' or ':', we can skip to
   1033           // that instead. (And if we see a ':' with no matching '?', we can
   1034           // classify this as an Obj-C message send.)
   1035           SourceLocation StartLoc = Tok.getLocation();
   1036           InMessageExpressionRAIIObject MaybeInMessageExpression(*this, true);
   1037           Init = ParseInitializer();
   1038           if (!Init.isInvalid())
   1039             Init = Actions.CorrectDelayedTyposInExpr(Init.get());
   1040 
   1041           if (Tok.getLocation() != StartLoc) {
   1042             // Back out the lexing of the token after the initializer.
   1043             PP.RevertCachedTokens(1);
   1044 
   1045             // Replace the consumed tokens with an appropriate annotation.
   1046             Tok.setLocation(StartLoc);
   1047             Tok.setKind(tok::annot_primary_expr);
   1048             setExprAnnotation(Tok, Init);
   1049             Tok.setAnnotationEndLoc(PP.getLastCachedTokenLocation());
   1050             PP.AnnotateCachedTokens(Tok);
   1051 
   1052             // Consume the annotated initializer.
   1053             ConsumeAnnotationToken();
   1054           }
   1055         }
   1056       }
   1057 
   1058       TryConsumeToken(tok::ellipsis, EllipsisLocs[3]);
   1059     }
   1060 
   1061     // Check if this is a message send before we act on a possible init-capture.
   1062     if (Tentative && Tok.is(tok::identifier) &&
   1063         NextToken().isOneOf(tok::colon, tok::r_square)) {
   1064       // This can only be a message send. We're done with disambiguation.
   1065       *Tentative = LambdaIntroducerTentativeParse::MessageSend;
   1066       return false;
   1067     }
   1068 
   1069     // Ensure that any ellipsis was in the right place.
   1070     SourceLocation EllipsisLoc;
   1071     if (std::any_of(std::begin(EllipsisLocs), std::end(EllipsisLocs),
   1072                     [](SourceLocation Loc) { return Loc.isValid(); })) {
   1073       // The '...' should appear before the identifier in an init-capture, and
   1074       // after the identifier otherwise.
   1075       bool InitCapture = InitKind != LambdaCaptureInitKind::NoInit;
   1076       SourceLocation *ExpectedEllipsisLoc =
   1077           !InitCapture      ? &EllipsisLocs[2] :
   1078           Kind == LCK_ByRef ? &EllipsisLocs[1] :
   1079                               &EllipsisLocs[0];
   1080       EllipsisLoc = *ExpectedEllipsisLoc;
   1081 
   1082       unsigned DiagID = 0;
   1083       if (EllipsisLoc.isInvalid()) {
   1084         DiagID = diag::err_lambda_capture_misplaced_ellipsis;
   1085         for (SourceLocation Loc : EllipsisLocs) {
   1086           if (Loc.isValid())
   1087             EllipsisLoc = Loc;
   1088         }
   1089       } else {
   1090         unsigned NumEllipses = std::accumulate(
   1091             std::begin(EllipsisLocs), std::end(EllipsisLocs), 0,
   1092             [](int N, SourceLocation Loc) { return N + Loc.isValid(); });
   1093         if (NumEllipses > 1)
   1094           DiagID = diag::err_lambda_capture_multiple_ellipses;
   1095       }
   1096       if (DiagID) {
   1097         NonTentativeAction([&] {
   1098           // Point the diagnostic at the first misplaced ellipsis.
   1099           SourceLocation DiagLoc;
   1100           for (SourceLocation &Loc : EllipsisLocs) {
   1101             if (&Loc != ExpectedEllipsisLoc && Loc.isValid()) {
   1102               DiagLoc = Loc;
   1103               break;
   1104             }
   1105           }
   1106           assert(DiagLoc.isValid() && "no location for diagnostic");
   1107 
   1108           // Issue the diagnostic and produce fixits showing where the ellipsis
   1109           // should have been written.
   1110           auto &&D = Diag(DiagLoc, DiagID);
   1111           if (DiagID == diag::err_lambda_capture_misplaced_ellipsis) {
   1112             SourceLocation ExpectedLoc =
   1113                 InitCapture ? Loc
   1114                             : Lexer::getLocForEndOfToken(
   1115                                   Loc, 0, PP.getSourceManager(), getLangOpts());
   1116             D << InitCapture << FixItHint::CreateInsertion(ExpectedLoc, "...");
   1117           }
   1118           for (SourceLocation &Loc : EllipsisLocs) {
   1119             if (&Loc != ExpectedEllipsisLoc && Loc.isValid())
   1120               D << FixItHint::CreateRemoval(Loc);
   1121           }
   1122         });
   1123       }
   1124     }
   1125 
   1126     // Process the init-capture initializers now rather than delaying until we
   1127     // form the lambda-expression so that they can be handled in the context
   1128     // enclosing the lambda-expression, rather than in the context of the
   1129     // lambda-expression itself.
   1130     ParsedType InitCaptureType;
   1131     if (Init.isUsable())
   1132       Init = Actions.CorrectDelayedTyposInExpr(Init.get());
   1133     if (Init.isUsable()) {
   1134       NonTentativeAction([&] {
   1135         // Get the pointer and store it in an lvalue, so we can use it as an
   1136         // out argument.
   1137         Expr *InitExpr = Init.get();
   1138         // This performs any lvalue-to-rvalue conversions if necessary, which
   1139         // can affect what gets captured in the containing decl-context.
   1140         InitCaptureType = Actions.actOnLambdaInitCaptureInitialization(
   1141             Loc, Kind == LCK_ByRef, EllipsisLoc, Id, InitKind, InitExpr);
   1142         Init = InitExpr;
   1143       });
   1144     }
   1145 
   1146     SourceLocation LocEnd = PrevTokLocation;
   1147 
   1148     Intro.addCapture(Kind, Loc, Id, EllipsisLoc, InitKind, Init,
   1149                      InitCaptureType, SourceRange(LocStart, LocEnd));
   1150   }
   1151 
   1152   T.consumeClose();
   1153   Intro.Range.setEnd(T.getCloseLocation());
   1154   return false;
   1155 }
   1156 
   1157 static void tryConsumeLambdaSpecifierToken(Parser &P,
   1158                                            SourceLocation &MutableLoc,
   1159                                            SourceLocation &ConstexprLoc,
   1160                                            SourceLocation &ConstevalLoc,
   1161                                            SourceLocation &DeclEndLoc) {
   1162   assert(MutableLoc.isInvalid());
   1163   assert(ConstexprLoc.isInvalid());
   1164   // Consume constexpr-opt mutable-opt in any sequence, and set the DeclEndLoc
   1165   // to the final of those locations. Emit an error if we have multiple
   1166   // copies of those keywords and recover.
   1167 
   1168   while (true) {
   1169     switch (P.getCurToken().getKind()) {
   1170     case tok::kw_mutable: {
   1171       if (MutableLoc.isValid()) {
   1172         P.Diag(P.getCurToken().getLocation(),
   1173                diag::err_lambda_decl_specifier_repeated)
   1174             << 0 << FixItHint::CreateRemoval(P.getCurToken().getLocation());
   1175       }
   1176       MutableLoc = P.ConsumeToken();
   1177       DeclEndLoc = MutableLoc;
   1178       break /*switch*/;
   1179     }
   1180     case tok::kw_constexpr:
   1181       if (ConstexprLoc.isValid()) {
   1182         P.Diag(P.getCurToken().getLocation(),
   1183                diag::err_lambda_decl_specifier_repeated)
   1184             << 1 << FixItHint::CreateRemoval(P.getCurToken().getLocation());
   1185       }
   1186       ConstexprLoc = P.ConsumeToken();
   1187       DeclEndLoc = ConstexprLoc;
   1188       break /*switch*/;
   1189     case tok::kw_consteval:
   1190       if (ConstevalLoc.isValid()) {
   1191         P.Diag(P.getCurToken().getLocation(),
   1192                diag::err_lambda_decl_specifier_repeated)
   1193             << 2 << FixItHint::CreateRemoval(P.getCurToken().getLocation());
   1194       }
   1195       ConstevalLoc = P.ConsumeToken();
   1196       DeclEndLoc = ConstevalLoc;
   1197       break /*switch*/;
   1198     default:
   1199       return;
   1200     }
   1201   }
   1202 }
   1203 
   1204 static void
   1205 addConstexprToLambdaDeclSpecifier(Parser &P, SourceLocation ConstexprLoc,
   1206                                   DeclSpec &DS) {
   1207   if (ConstexprLoc.isValid()) {
   1208     P.Diag(ConstexprLoc, !P.getLangOpts().CPlusPlus17
   1209                              ? diag::ext_constexpr_on_lambda_cxx17
   1210                              : diag::warn_cxx14_compat_constexpr_on_lambda);
   1211     const char *PrevSpec = nullptr;
   1212     unsigned DiagID = 0;
   1213     DS.SetConstexprSpec(ConstexprSpecKind::Constexpr, ConstexprLoc, PrevSpec,
   1214                         DiagID);
   1215     assert(PrevSpec == nullptr && DiagID == 0 &&
   1216            "Constexpr cannot have been set previously!");
   1217   }
   1218 }
   1219 
   1220 static void addConstevalToLambdaDeclSpecifier(Parser &P,
   1221                                               SourceLocation ConstevalLoc,
   1222                                               DeclSpec &DS) {
   1223   if (ConstevalLoc.isValid()) {
   1224     P.Diag(ConstevalLoc, diag::warn_cxx20_compat_consteval);
   1225     const char *PrevSpec = nullptr;
   1226     unsigned DiagID = 0;
   1227     DS.SetConstexprSpec(ConstexprSpecKind::Consteval, ConstevalLoc, PrevSpec,
   1228                         DiagID);
   1229     if (DiagID != 0)
   1230       P.Diag(ConstevalLoc, DiagID) << PrevSpec;
   1231   }
   1232 }
   1233 
   1234 /// ParseLambdaExpressionAfterIntroducer - Parse the rest of a lambda
   1235 /// expression.
   1236 ExprResult Parser::ParseLambdaExpressionAfterIntroducer(
   1237                      LambdaIntroducer &Intro) {
   1238   SourceLocation LambdaBeginLoc = Intro.Range.getBegin();
   1239   Diag(LambdaBeginLoc, diag::warn_cxx98_compat_lambda);
   1240 
   1241   PrettyStackTraceLoc CrashInfo(PP.getSourceManager(), LambdaBeginLoc,
   1242                                 "lambda expression parsing");
   1243 
   1244 
   1245 
   1246   // FIXME: Call into Actions to add any init-capture declarations to the
   1247   // scope while parsing the lambda-declarator and compound-statement.
   1248 
   1249   // Parse lambda-declarator[opt].
   1250   DeclSpec DS(AttrFactory);
   1251   Declarator D(DS, DeclaratorContext::LambdaExpr);
   1252   TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
   1253   Actions.PushLambdaScope();
   1254 
   1255   ParsedAttributes Attr(AttrFactory);
   1256   if (getLangOpts().CUDA) {
   1257     // In CUDA code, GNU attributes are allowed to appear immediately after the
   1258     // "[...]", even if there is no "(...)" before the lambda body.
   1259     MaybeParseGNUAttributes(D);
   1260   }
   1261 
   1262   // Helper to emit a warning if we see a CUDA host/device/global attribute
   1263   // after '(...)'. nvcc doesn't accept this.
   1264   auto WarnIfHasCUDATargetAttr = [&] {
   1265     if (getLangOpts().CUDA)
   1266       for (const ParsedAttr &A : Attr)
   1267         if (A.getKind() == ParsedAttr::AT_CUDADevice ||
   1268             A.getKind() == ParsedAttr::AT_CUDAHost ||
   1269             A.getKind() == ParsedAttr::AT_CUDAGlobal)
   1270           Diag(A.getLoc(), diag::warn_cuda_attr_lambda_position)
   1271               << A.getAttrName()->getName();
   1272   };
   1273 
   1274   MultiParseScope TemplateParamScope(*this);
   1275   if (Tok.is(tok::less)) {
   1276     Diag(Tok, getLangOpts().CPlusPlus20
   1277                   ? diag::warn_cxx17_compat_lambda_template_parameter_list
   1278                   : diag::ext_lambda_template_parameter_list);
   1279 
   1280     SmallVector<NamedDecl*, 4> TemplateParams;
   1281     SourceLocation LAngleLoc, RAngleLoc;
   1282     if (ParseTemplateParameters(TemplateParamScope,
   1283                                 CurTemplateDepthTracker.getDepth(),
   1284                                 TemplateParams, LAngleLoc, RAngleLoc)) {
   1285       Actions.ActOnLambdaError(LambdaBeginLoc, getCurScope());
   1286       return ExprError();
   1287     }
   1288 
   1289     if (TemplateParams.empty()) {
   1290       Diag(RAngleLoc,
   1291            diag::err_lambda_template_parameter_list_empty);
   1292     } else {
   1293       ExprResult RequiresClause;
   1294       if (TryConsumeToken(tok::kw_requires)) {
   1295         RequiresClause =
   1296             Actions.ActOnRequiresClause(ParseConstraintLogicalOrExpression(
   1297                 /*IsTrailingRequiresClause=*/false));
   1298         if (RequiresClause.isInvalid())
   1299           SkipUntil({tok::l_brace, tok::l_paren}, StopAtSemi | StopBeforeMatch);
   1300       }
   1301 
   1302       Actions.ActOnLambdaExplicitTemplateParameterList(
   1303           LAngleLoc, TemplateParams, RAngleLoc, RequiresClause);
   1304       ++CurTemplateDepthTracker;
   1305     }
   1306   }
   1307 
   1308   // Implement WG21 P2173, which allows attributes immediately before the
   1309   // lambda declarator and applies them to the corresponding function operator
   1310   // or operator template declaration. We accept this as a conforming extension
   1311   // in all language modes that support lambdas.
   1312   if (isCXX11AttributeSpecifier()) {
   1313     Diag(Tok, getLangOpts().CPlusPlus2b
   1314                   ? diag::warn_cxx20_compat_decl_attrs_on_lambda
   1315                   : diag::ext_decl_attrs_on_lambda);
   1316     MaybeParseCXX11Attributes(D);
   1317   }
   1318 
   1319   TypeResult TrailingReturnType;
   1320   SourceLocation TrailingReturnTypeLoc;
   1321 
   1322   auto ParseLambdaSpecifiers =
   1323       [&](SourceLocation LParenLoc, SourceLocation RParenLoc,
   1324           MutableArrayRef<DeclaratorChunk::ParamInfo> ParamInfo,
   1325           SourceLocation EllipsisLoc) {
   1326         SourceLocation DeclEndLoc = RParenLoc;
   1327 
   1328         // GNU-style attributes must be parsed before the mutable specifier to
   1329         // be compatible with GCC. MSVC-style attributes must be parsed before
   1330         // the mutable specifier to be compatible with MSVC.
   1331         MaybeParseAttributes(PAKM_GNU | PAKM_Declspec, Attr);
   1332 
   1333         // Parse mutable-opt and/or constexpr-opt or consteval-opt, and update
   1334         // the DeclEndLoc.
   1335         SourceLocation MutableLoc;
   1336         SourceLocation ConstexprLoc;
   1337         SourceLocation ConstevalLoc;
   1338         tryConsumeLambdaSpecifierToken(*this, MutableLoc, ConstexprLoc,
   1339                                        ConstevalLoc, DeclEndLoc);
   1340 
   1341         addConstexprToLambdaDeclSpecifier(*this, ConstexprLoc, DS);
   1342         addConstevalToLambdaDeclSpecifier(*this, ConstevalLoc, DS);
   1343         // Parse exception-specification[opt].
   1344         ExceptionSpecificationType ESpecType = EST_None;
   1345         SourceRange ESpecRange;
   1346         SmallVector<ParsedType, 2> DynamicExceptions;
   1347         SmallVector<SourceRange, 2> DynamicExceptionRanges;
   1348         ExprResult NoexceptExpr;
   1349         CachedTokens *ExceptionSpecTokens;
   1350         ESpecType = tryParseExceptionSpecification(
   1351             /*Delayed=*/false, ESpecRange, DynamicExceptions,
   1352             DynamicExceptionRanges, NoexceptExpr, ExceptionSpecTokens);
   1353 
   1354         if (ESpecType != EST_None)
   1355           DeclEndLoc = ESpecRange.getEnd();
   1356 
   1357         // Parse attribute-specifier[opt].
   1358         MaybeParseCXX11Attributes(Attr, &DeclEndLoc);
   1359 
   1360         // Parse OpenCL addr space attribute.
   1361         if (Tok.isOneOf(tok::kw___private, tok::kw___global, tok::kw___local,
   1362                         tok::kw___constant, tok::kw___generic)) {
   1363           ParseOpenCLQualifiers(DS.getAttributes());
   1364           ConsumeToken();
   1365         }
   1366 
   1367         SourceLocation FunLocalRangeEnd = DeclEndLoc;
   1368 
   1369         // Parse trailing-return-type[opt].
   1370         if (Tok.is(tok::arrow)) {
   1371           FunLocalRangeEnd = Tok.getLocation();
   1372           SourceRange Range;
   1373           TrailingReturnType = ParseTrailingReturnType(
   1374               Range, /*MayBeFollowedByDirectInit*/ false);
   1375           TrailingReturnTypeLoc = Range.getBegin();
   1376           if (Range.getEnd().isValid())
   1377             DeclEndLoc = Range.getEnd();
   1378         }
   1379 
   1380         SourceLocation NoLoc;
   1381         D.AddTypeInfo(
   1382             DeclaratorChunk::getFunction(
   1383                 /*HasProto=*/true,
   1384                 /*IsAmbiguous=*/false, LParenLoc, ParamInfo.data(),
   1385                 ParamInfo.size(), EllipsisLoc, RParenLoc,
   1386                 /*RefQualifierIsLvalueRef=*/true,
   1387                 /*RefQualifierLoc=*/NoLoc, MutableLoc, ESpecType, ESpecRange,
   1388                 DynamicExceptions.data(), DynamicExceptionRanges.data(),
   1389                 DynamicExceptions.size(),
   1390                 NoexceptExpr.isUsable() ? NoexceptExpr.get() : nullptr,
   1391                 /*ExceptionSpecTokens*/ nullptr,
   1392                 /*DeclsInPrototype=*/None, LParenLoc, FunLocalRangeEnd, D,
   1393                 TrailingReturnType, TrailingReturnTypeLoc, &DS),
   1394             std::move(Attr), DeclEndLoc);
   1395       };
   1396 
   1397   if (Tok.is(tok::l_paren)) {
   1398     ParseScope PrototypeScope(this, Scope::FunctionPrototypeScope |
   1399                                         Scope::FunctionDeclarationScope |
   1400                                         Scope::DeclScope);
   1401 
   1402     BalancedDelimiterTracker T(*this, tok::l_paren);
   1403     T.consumeOpen();
   1404     SourceLocation LParenLoc = T.getOpenLocation();
   1405 
   1406     // Parse parameter-declaration-clause.
   1407     SmallVector<DeclaratorChunk::ParamInfo, 16> ParamInfo;
   1408     SourceLocation EllipsisLoc;
   1409 
   1410     if (Tok.isNot(tok::r_paren)) {
   1411       Actions.RecordParsingTemplateParameterDepth(
   1412           CurTemplateDepthTracker.getOriginalDepth());
   1413 
   1414       ParseParameterDeclarationClause(D.getContext(), Attr, ParamInfo,
   1415                                       EllipsisLoc);
   1416       // For a generic lambda, each 'auto' within the parameter declaration
   1417       // clause creates a template type parameter, so increment the depth.
   1418       // If we've parsed any explicit template parameters, then the depth will
   1419       // have already been incremented. So we make sure that at most a single
   1420       // depth level is added.
   1421       if (Actions.getCurGenericLambda())
   1422         CurTemplateDepthTracker.setAddedDepth(1);
   1423     }
   1424 
   1425     T.consumeClose();
   1426 
   1427     // Parse lambda-specifiers.
   1428     ParseLambdaSpecifiers(LParenLoc, /*DeclEndLoc=*/T.getCloseLocation(),
   1429                           ParamInfo, EllipsisLoc);
   1430 
   1431     // Parse requires-clause[opt].
   1432     if (Tok.is(tok::kw_requires))
   1433       ParseTrailingRequiresClause(D);
   1434   } else if (Tok.isOneOf(tok::kw_mutable, tok::arrow, tok::kw___attribute,
   1435                          tok::kw_constexpr, tok::kw_consteval,
   1436                          tok::kw___private, tok::kw___global, tok::kw___local,
   1437                          tok::kw___constant, tok::kw___generic,
   1438                          tok::kw_requires, tok::kw_noexcept) ||
   1439              (Tok.is(tok::l_square) && NextToken().is(tok::l_square))) {
   1440     if (!getLangOpts().CPlusPlus2b)
   1441       // It's common to forget that one needs '()' before 'mutable', an
   1442       // attribute specifier, the result type, or the requires clause. Deal with
   1443       // this.
   1444       Diag(Tok, diag::ext_lambda_missing_parens)
   1445           << FixItHint::CreateInsertion(Tok.getLocation(), "() ");
   1446 
   1447     SourceLocation NoLoc;
   1448     // Parse lambda-specifiers.
   1449     std::vector<DeclaratorChunk::ParamInfo> EmptyParamInfo;
   1450     ParseLambdaSpecifiers(/*LParenLoc=*/NoLoc, /*RParenLoc=*/NoLoc,
   1451                           EmptyParamInfo, /*EllipsisLoc=*/NoLoc);
   1452   }
   1453 
   1454   WarnIfHasCUDATargetAttr();
   1455 
   1456   // FIXME: Rename BlockScope -> ClosureScope if we decide to continue using
   1457   // it.
   1458   unsigned ScopeFlags = Scope::BlockScope | Scope::FnScope | Scope::DeclScope |
   1459                         Scope::CompoundStmtScope;
   1460   ParseScope BodyScope(this, ScopeFlags);
   1461 
   1462   Actions.ActOnStartOfLambdaDefinition(Intro, D, getCurScope());
   1463 
   1464   // Parse compound-statement.
   1465   if (!Tok.is(tok::l_brace)) {
   1466     Diag(Tok, diag::err_expected_lambda_body);
   1467     Actions.ActOnLambdaError(LambdaBeginLoc, getCurScope());
   1468     return ExprError();
   1469   }
   1470 
   1471   StmtResult Stmt(ParseCompoundStatementBody());
   1472   BodyScope.Exit();
   1473   TemplateParamScope.Exit();
   1474 
   1475   if (!Stmt.isInvalid() && !TrailingReturnType.isInvalid())
   1476     return Actions.ActOnLambdaExpr(LambdaBeginLoc, Stmt.get(), getCurScope());
   1477 
   1478   Actions.ActOnLambdaError(LambdaBeginLoc, getCurScope());
   1479   return ExprError();
   1480 }
   1481 
   1482 /// ParseCXXCasts - This handles the various ways to cast expressions to another
   1483 /// type.
   1484 ///
   1485 ///       postfix-expression: [C++ 5.2p1]
   1486 ///         'dynamic_cast' '<' type-name '>' '(' expression ')'
   1487 ///         'static_cast' '<' type-name '>' '(' expression ')'
   1488 ///         'reinterpret_cast' '<' type-name '>' '(' expression ')'
   1489 ///         'const_cast' '<' type-name '>' '(' expression ')'
   1490 ///
   1491 /// C++ for OpenCL s2.3.1 adds:
   1492 ///         'addrspace_cast' '<' type-name '>' '(' expression ')'
   1493 ExprResult Parser::ParseCXXCasts() {
   1494   tok::TokenKind Kind = Tok.getKind();
   1495   const char *CastName = nullptr; // For error messages
   1496 
   1497   switch (Kind) {
   1498   default: llvm_unreachable("Unknown C++ cast!");
   1499   case tok::kw_addrspace_cast:   CastName = "addrspace_cast";   break;
   1500   case tok::kw_const_cast:       CastName = "const_cast";       break;
   1501   case tok::kw_dynamic_cast:     CastName = "dynamic_cast";     break;
   1502   case tok::kw_reinterpret_cast: CastName = "reinterpret_cast"; break;
   1503   case tok::kw_static_cast:      CastName = "static_cast";      break;
   1504   }
   1505 
   1506   SourceLocation OpLoc = ConsumeToken();
   1507   SourceLocation LAngleBracketLoc = Tok.getLocation();
   1508 
   1509   // Check for "<::" which is parsed as "[:".  If found, fix token stream,
   1510   // diagnose error, suggest fix, and recover parsing.
   1511   if (Tok.is(tok::l_square) && Tok.getLength() == 2) {
   1512     Token Next = NextToken();
   1513     if (Next.is(tok::colon) && areTokensAdjacent(Tok, Next))
   1514       FixDigraph(*this, PP, Tok, Next, Kind, /*AtDigraph*/true);
   1515   }
   1516 
   1517   if (ExpectAndConsume(tok::less, diag::err_expected_less_after, CastName))
   1518     return ExprError();
   1519 
   1520   // Parse the common declaration-specifiers piece.
   1521   DeclSpec DS(AttrFactory);
   1522   ParseSpecifierQualifierList(DS);
   1523 
   1524   // Parse the abstract-declarator, if present.
   1525   Declarator DeclaratorInfo(DS, DeclaratorContext::TypeName);
   1526   ParseDeclarator(DeclaratorInfo);
   1527 
   1528   SourceLocation RAngleBracketLoc = Tok.getLocation();
   1529 
   1530   if (ExpectAndConsume(tok::greater))
   1531     return ExprError(Diag(LAngleBracketLoc, diag::note_matching) << tok::less);
   1532 
   1533   BalancedDelimiterTracker T(*this, tok::l_paren);
   1534 
   1535   if (T.expectAndConsume(diag::err_expected_lparen_after, CastName))
   1536     return ExprError();
   1537 
   1538   ExprResult Result = ParseExpression();
   1539 
   1540   // Match the ')'.
   1541   T.consumeClose();
   1542 
   1543   if (!Result.isInvalid() && !DeclaratorInfo.isInvalidType())
   1544     Result = Actions.ActOnCXXNamedCast(OpLoc, Kind,
   1545                                        LAngleBracketLoc, DeclaratorInfo,
   1546                                        RAngleBracketLoc,
   1547                                        T.getOpenLocation(), Result.get(),
   1548                                        T.getCloseLocation());
   1549 
   1550   return Result;
   1551 }
   1552 
   1553 /// ParseCXXTypeid - This handles the C++ typeid expression.
   1554 ///
   1555 ///       postfix-expression: [C++ 5.2p1]
   1556 ///         'typeid' '(' expression ')'
   1557 ///         'typeid' '(' type-id ')'
   1558 ///
   1559 ExprResult Parser::ParseCXXTypeid() {
   1560   assert(Tok.is(tok::kw_typeid) && "Not 'typeid'!");
   1561 
   1562   SourceLocation OpLoc = ConsumeToken();
   1563   SourceLocation LParenLoc, RParenLoc;
   1564   BalancedDelimiterTracker T(*this, tok::l_paren);
   1565 
   1566   // typeid expressions are always parenthesized.
   1567   if (T.expectAndConsume(diag::err_expected_lparen_after, "typeid"))
   1568     return ExprError();
   1569   LParenLoc = T.getOpenLocation();
   1570 
   1571   ExprResult Result;
   1572 
   1573   // C++0x [expr.typeid]p3:
   1574   //   When typeid is applied to an expression other than an lvalue of a
   1575   //   polymorphic class type [...] The expression is an unevaluated
   1576   //   operand (Clause 5).
   1577   //
   1578   // Note that we can't tell whether the expression is an lvalue of a
   1579   // polymorphic class type until after we've parsed the expression; we
   1580   // speculatively assume the subexpression is unevaluated, and fix it up
   1581   // later.
   1582   //
   1583   // We enter the unevaluated context before trying to determine whether we
   1584   // have a type-id, because the tentative parse logic will try to resolve
   1585   // names, and must treat them as unevaluated.
   1586   EnterExpressionEvaluationContext Unevaluated(
   1587       Actions, Sema::ExpressionEvaluationContext::Unevaluated,
   1588       Sema::ReuseLambdaContextDecl);
   1589 
   1590   if (isTypeIdInParens()) {
   1591     TypeResult Ty = ParseTypeName();
   1592 
   1593     // Match the ')'.
   1594     T.consumeClose();
   1595     RParenLoc = T.getCloseLocation();
   1596     if (Ty.isInvalid() || RParenLoc.isInvalid())
   1597       return ExprError();
   1598 
   1599     Result = Actions.ActOnCXXTypeid(OpLoc, LParenLoc, /*isType=*/true,
   1600                                     Ty.get().getAsOpaquePtr(), RParenLoc);
   1601   } else {
   1602     Result = ParseExpression();
   1603 
   1604     // Match the ')'.
   1605     if (Result.isInvalid())
   1606       SkipUntil(tok::r_paren, StopAtSemi);
   1607     else {
   1608       T.consumeClose();
   1609       RParenLoc = T.getCloseLocation();
   1610       if (RParenLoc.isInvalid())
   1611         return ExprError();
   1612 
   1613       Result = Actions.ActOnCXXTypeid(OpLoc, LParenLoc, /*isType=*/false,
   1614                                       Result.get(), RParenLoc);
   1615     }
   1616   }
   1617 
   1618   return Result;
   1619 }
   1620 
   1621 /// ParseCXXUuidof - This handles the Microsoft C++ __uuidof expression.
   1622 ///
   1623 ///         '__uuidof' '(' expression ')'
   1624 ///         '__uuidof' '(' type-id ')'
   1625 ///
   1626 ExprResult Parser::ParseCXXUuidof() {
   1627   assert(Tok.is(tok::kw___uuidof) && "Not '__uuidof'!");
   1628 
   1629   SourceLocation OpLoc = ConsumeToken();
   1630   BalancedDelimiterTracker T(*this, tok::l_paren);
   1631 
   1632   // __uuidof expressions are always parenthesized.
   1633   if (T.expectAndConsume(diag::err_expected_lparen_after, "__uuidof"))
   1634     return ExprError();
   1635 
   1636   ExprResult Result;
   1637 
   1638   if (isTypeIdInParens()) {
   1639     TypeResult Ty = ParseTypeName();
   1640 
   1641     // Match the ')'.
   1642     T.consumeClose();
   1643 
   1644     if (Ty.isInvalid())
   1645       return ExprError();
   1646 
   1647     Result = Actions.ActOnCXXUuidof(OpLoc, T.getOpenLocation(), /*isType=*/true,
   1648                                     Ty.get().getAsOpaquePtr(),
   1649                                     T.getCloseLocation());
   1650   } else {
   1651     EnterExpressionEvaluationContext Unevaluated(
   1652         Actions, Sema::ExpressionEvaluationContext::Unevaluated);
   1653     Result = ParseExpression();
   1654 
   1655     // Match the ')'.
   1656     if (Result.isInvalid())
   1657       SkipUntil(tok::r_paren, StopAtSemi);
   1658     else {
   1659       T.consumeClose();
   1660 
   1661       Result = Actions.ActOnCXXUuidof(OpLoc, T.getOpenLocation(),
   1662                                       /*isType=*/false,
   1663                                       Result.get(), T.getCloseLocation());
   1664     }
   1665   }
   1666 
   1667   return Result;
   1668 }
   1669 
   1670 /// Parse a C++ pseudo-destructor expression after the base,
   1671 /// . or -> operator, and nested-name-specifier have already been
   1672 /// parsed. We're handling this fragment of the grammar:
   1673 ///
   1674 ///       postfix-expression: [C++2a expr.post]
   1675 ///         postfix-expression . template[opt] id-expression
   1676 ///         postfix-expression -> template[opt] id-expression
   1677 ///
   1678 ///       id-expression:
   1679 ///         qualified-id
   1680 ///         unqualified-id
   1681 ///
   1682 ///       qualified-id:
   1683 ///         nested-name-specifier template[opt] unqualified-id
   1684 ///
   1685 ///       nested-name-specifier:
   1686 ///         type-name ::
   1687 ///         decltype-specifier ::    FIXME: not implemented, but probably only
   1688 ///                                         allowed in C++ grammar by accident
   1689 ///         nested-name-specifier identifier ::
   1690 ///         nested-name-specifier template[opt] simple-template-id ::
   1691 ///         [...]
   1692 ///
   1693 ///       unqualified-id:
   1694 ///         ~ type-name
   1695 ///         ~ decltype-specifier
   1696 ///         [...]
   1697 ///
   1698 /// ... where the all but the last component of the nested-name-specifier
   1699 /// has already been parsed, and the base expression is not of a non-dependent
   1700 /// class type.
   1701 ExprResult
   1702 Parser::ParseCXXPseudoDestructor(Expr *Base, SourceLocation OpLoc,
   1703                                  tok::TokenKind OpKind,
   1704                                  CXXScopeSpec &SS,
   1705                                  ParsedType ObjectType) {
   1706   // If the last component of the (optional) nested-name-specifier is
   1707   // template[opt] simple-template-id, it has already been annotated.
   1708   UnqualifiedId FirstTypeName;
   1709   SourceLocation CCLoc;
   1710   if (Tok.is(tok::identifier)) {
   1711     FirstTypeName.setIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
   1712     ConsumeToken();
   1713     assert(Tok.is(tok::coloncolon) &&"ParseOptionalCXXScopeSpecifier fail");
   1714     CCLoc = ConsumeToken();
   1715   } else if (Tok.is(tok::annot_template_id)) {
   1716     TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
   1717     // FIXME: Carry on and build an AST representation for tooling.
   1718     if (TemplateId->isInvalid())
   1719       return ExprError();
   1720     FirstTypeName.setTemplateId(TemplateId);
   1721     ConsumeAnnotationToken();
   1722     assert(Tok.is(tok::coloncolon) &&"ParseOptionalCXXScopeSpecifier fail");
   1723     CCLoc = ConsumeToken();
   1724   } else {
   1725     assert(SS.isEmpty() && "missing last component of nested name specifier");
   1726     FirstTypeName.setIdentifier(nullptr, SourceLocation());
   1727   }
   1728 
   1729   // Parse the tilde.
   1730   assert(Tok.is(tok::tilde) && "ParseOptionalCXXScopeSpecifier fail");
   1731   SourceLocation TildeLoc = ConsumeToken();
   1732 
   1733   if (Tok.is(tok::kw_decltype) && !FirstTypeName.isValid()) {
   1734     DeclSpec DS(AttrFactory);
   1735     ParseDecltypeSpecifier(DS);
   1736     if (DS.getTypeSpecType() == TST_error)
   1737       return ExprError();
   1738     return Actions.ActOnPseudoDestructorExpr(getCurScope(), Base, OpLoc, OpKind,
   1739                                              TildeLoc, DS);
   1740   }
   1741 
   1742   if (!Tok.is(tok::identifier)) {
   1743     Diag(Tok, diag::err_destructor_tilde_identifier);
   1744     return ExprError();
   1745   }
   1746 
   1747   // Parse the second type.
   1748   UnqualifiedId SecondTypeName;
   1749   IdentifierInfo *Name = Tok.getIdentifierInfo();
   1750   SourceLocation NameLoc = ConsumeToken();
   1751   SecondTypeName.setIdentifier(Name, NameLoc);
   1752 
   1753   // If there is a '<', the second type name is a template-id. Parse
   1754   // it as such.
   1755   //
   1756   // FIXME: This is not a context in which a '<' is assumed to start a template
   1757   // argument list. This affects examples such as
   1758   //   void f(auto *p) { p->~X<int>(); }
   1759   // ... but there's no ambiguity, and nowhere to write 'template' in such an
   1760   // example, so we accept it anyway.
   1761   if (Tok.is(tok::less) &&
   1762       ParseUnqualifiedIdTemplateId(
   1763           SS, ObjectType, Base && Base->containsErrors(), SourceLocation(),
   1764           Name, NameLoc, false, SecondTypeName,
   1765           /*AssumeTemplateId=*/true))
   1766     return ExprError();
   1767 
   1768   return Actions.ActOnPseudoDestructorExpr(getCurScope(), Base, OpLoc, OpKind,
   1769                                            SS, FirstTypeName, CCLoc, TildeLoc,
   1770                                            SecondTypeName);
   1771 }
   1772 
   1773 /// ParseCXXBoolLiteral - This handles the C++ Boolean literals.
   1774 ///
   1775 ///       boolean-literal: [C++ 2.13.5]
   1776 ///         'true'
   1777 ///         'false'
   1778 ExprResult Parser::ParseCXXBoolLiteral() {
   1779   tok::TokenKind Kind = Tok.getKind();
   1780   return Actions.ActOnCXXBoolLiteral(ConsumeToken(), Kind);
   1781 }
   1782 
   1783 /// ParseThrowExpression - This handles the C++ throw expression.
   1784 ///
   1785 ///       throw-expression: [C++ 15]
   1786 ///         'throw' assignment-expression[opt]
   1787 ExprResult Parser::ParseThrowExpression() {
   1788   assert(Tok.is(tok::kw_throw) && "Not throw!");
   1789   SourceLocation ThrowLoc = ConsumeToken();           // Eat the throw token.
   1790 
   1791   // If the current token isn't the start of an assignment-expression,
   1792   // then the expression is not present.  This handles things like:
   1793   //   "C ? throw : (void)42", which is crazy but legal.
   1794   switch (Tok.getKind()) {  // FIXME: move this predicate somewhere common.
   1795   case tok::semi:
   1796   case tok::r_paren:
   1797   case tok::r_square:
   1798   case tok::r_brace:
   1799   case tok::colon:
   1800   case tok::comma:
   1801     return Actions.ActOnCXXThrow(getCurScope(), ThrowLoc, nullptr);
   1802 
   1803   default:
   1804     ExprResult Expr(ParseAssignmentExpression());
   1805     if (Expr.isInvalid()) return Expr;
   1806     return Actions.ActOnCXXThrow(getCurScope(), ThrowLoc, Expr.get());
   1807   }
   1808 }
   1809 
   1810 /// Parse the C++ Coroutines co_yield expression.
   1811 ///
   1812 ///       co_yield-expression:
   1813 ///         'co_yield' assignment-expression[opt]
   1814 ExprResult Parser::ParseCoyieldExpression() {
   1815   assert(Tok.is(tok::kw_co_yield) && "Not co_yield!");
   1816 
   1817   SourceLocation Loc = ConsumeToken();
   1818   ExprResult Expr = Tok.is(tok::l_brace) ? ParseBraceInitializer()
   1819                                          : ParseAssignmentExpression();
   1820   if (!Expr.isInvalid())
   1821     Expr = Actions.ActOnCoyieldExpr(getCurScope(), Loc, Expr.get());
   1822   return Expr;
   1823 }
   1824 
   1825 /// ParseCXXThis - This handles the C++ 'this' pointer.
   1826 ///
   1827 /// C++ 9.3.2: In the body of a non-static member function, the keyword this is
   1828 /// a non-lvalue expression whose value is the address of the object for which
   1829 /// the function is called.
   1830 ExprResult Parser::ParseCXXThis() {
   1831   assert(Tok.is(tok::kw_this) && "Not 'this'!");
   1832   SourceLocation ThisLoc = ConsumeToken();
   1833   return Actions.ActOnCXXThis(ThisLoc);
   1834 }
   1835 
   1836 /// ParseCXXTypeConstructExpression - Parse construction of a specified type.
   1837 /// Can be interpreted either as function-style casting ("int(x)")
   1838 /// or class type construction ("ClassType(x,y,z)")
   1839 /// or creation of a value-initialized type ("int()").
   1840 /// See [C++ 5.2.3].
   1841 ///
   1842 ///       postfix-expression: [C++ 5.2p1]
   1843 ///         simple-type-specifier '(' expression-list[opt] ')'
   1844 /// [C++0x] simple-type-specifier braced-init-list
   1845 ///         typename-specifier '(' expression-list[opt] ')'
   1846 /// [C++0x] typename-specifier braced-init-list
   1847 ///
   1848 /// In C++1z onwards, the type specifier can also be a template-name.
   1849 ExprResult
   1850 Parser::ParseCXXTypeConstructExpression(const DeclSpec &DS) {
   1851   Declarator DeclaratorInfo(DS, DeclaratorContext::FunctionalCast);
   1852   ParsedType TypeRep = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo).get();
   1853 
   1854   assert((Tok.is(tok::l_paren) ||
   1855           (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)))
   1856          && "Expected '(' or '{'!");
   1857 
   1858   if (Tok.is(tok::l_brace)) {
   1859     PreferredType.enterTypeCast(Tok.getLocation(), TypeRep.get());
   1860     ExprResult Init = ParseBraceInitializer();
   1861     if (Init.isInvalid())
   1862       return Init;
   1863     Expr *InitList = Init.get();
   1864     return Actions.ActOnCXXTypeConstructExpr(
   1865         TypeRep, InitList->getBeginLoc(), MultiExprArg(&InitList, 1),
   1866         InitList->getEndLoc(), /*ListInitialization=*/true);
   1867   } else {
   1868     BalancedDelimiterTracker T(*this, tok::l_paren);
   1869     T.consumeOpen();
   1870 
   1871     PreferredType.enterTypeCast(Tok.getLocation(), TypeRep.get());
   1872 
   1873     ExprVector Exprs;
   1874     CommaLocsTy CommaLocs;
   1875 
   1876     auto RunSignatureHelp = [&]() {
   1877       QualType PreferredType;
   1878       if (TypeRep)
   1879         PreferredType = Actions.ProduceConstructorSignatureHelp(
   1880             getCurScope(), TypeRep.get()->getCanonicalTypeInternal(),
   1881             DS.getEndLoc(), Exprs, T.getOpenLocation());
   1882       CalledSignatureHelp = true;
   1883       return PreferredType;
   1884     };
   1885 
   1886     if (Tok.isNot(tok::r_paren)) {
   1887       if (ParseExpressionList(Exprs, CommaLocs, [&] {
   1888             PreferredType.enterFunctionArgument(Tok.getLocation(),
   1889                                                 RunSignatureHelp);
   1890           })) {
   1891         if (PP.isCodeCompletionReached() && !CalledSignatureHelp)
   1892           RunSignatureHelp();
   1893         SkipUntil(tok::r_paren, StopAtSemi);
   1894         return ExprError();
   1895       }
   1896     }
   1897 
   1898     // Match the ')'.
   1899     T.consumeClose();
   1900 
   1901     // TypeRep could be null, if it references an invalid typedef.
   1902     if (!TypeRep)
   1903       return ExprError();
   1904 
   1905     assert((Exprs.size() == 0 || Exprs.size()-1 == CommaLocs.size())&&
   1906            "Unexpected number of commas!");
   1907     return Actions.ActOnCXXTypeConstructExpr(TypeRep, T.getOpenLocation(),
   1908                                              Exprs, T.getCloseLocation(),
   1909                                              /*ListInitialization=*/false);
   1910   }
   1911 }
   1912 
   1913 /// ParseCXXCondition - if/switch/while condition expression.
   1914 ///
   1915 ///       condition:
   1916 ///         expression
   1917 ///         type-specifier-seq declarator '=' assignment-expression
   1918 /// [C++11] type-specifier-seq declarator '=' initializer-clause
   1919 /// [C++11] type-specifier-seq declarator braced-init-list
   1920 /// [Clang] type-specifier-seq ref-qualifier[opt] '[' identifier-list ']'
   1921 ///             brace-or-equal-initializer
   1922 /// [GNU]   type-specifier-seq declarator simple-asm-expr[opt] attributes[opt]
   1923 ///             '=' assignment-expression
   1924 ///
   1925 /// In C++1z, a condition may in some contexts be preceded by an
   1926 /// optional init-statement. This function will parse that too.
   1927 ///
   1928 /// \param InitStmt If non-null, an init-statement is permitted, and if present
   1929 /// will be parsed and stored here.
   1930 ///
   1931 /// \param Loc The location of the start of the statement that requires this
   1932 /// condition, e.g., the "for" in a for loop.
   1933 ///
   1934 /// \param FRI If non-null, a for range declaration is permitted, and if
   1935 /// present will be parsed and stored here, and a null result will be returned.
   1936 ///
   1937 /// \param EnterForConditionScope If true, enter a continue/break scope at the
   1938 /// appropriate moment for a 'for' loop.
   1939 ///
   1940 /// \returns The parsed condition.
   1941 Sema::ConditionResult Parser::ParseCXXCondition(StmtResult *InitStmt,
   1942                                                 SourceLocation Loc,
   1943                                                 Sema::ConditionKind CK,
   1944                                                 ForRangeInfo *FRI,
   1945                                                 bool EnterForConditionScope) {
   1946   // Helper to ensure we always enter a continue/break scope if requested.
   1947   struct ForConditionScopeRAII {
   1948     Scope *S;
   1949     void enter(bool IsConditionVariable) {
   1950       if (S) {
   1951         S->AddFlags(Scope::BreakScope | Scope::ContinueScope);
   1952         S->setIsConditionVarScope(IsConditionVariable);
   1953       }
   1954     }
   1955     ~ForConditionScopeRAII() {
   1956       if (S)
   1957         S->setIsConditionVarScope(false);
   1958     }
   1959   } ForConditionScope{EnterForConditionScope ? getCurScope() : nullptr};
   1960 
   1961   ParenBraceBracketBalancer BalancerRAIIObj(*this);
   1962   PreferredType.enterCondition(Actions, Tok.getLocation());
   1963 
   1964   if (Tok.is(tok::code_completion)) {
   1965     cutOffParsing();
   1966     Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Condition);
   1967     return Sema::ConditionError();
   1968   }
   1969 
   1970   ParsedAttributesWithRange attrs(AttrFactory);
   1971   MaybeParseCXX11Attributes(attrs);
   1972 
   1973   const auto WarnOnInit = [this, &CK] {
   1974     Diag(Tok.getLocation(), getLangOpts().CPlusPlus17
   1975                                 ? diag::warn_cxx14_compat_init_statement
   1976                                 : diag::ext_init_statement)
   1977         << (CK == Sema::ConditionKind::Switch);
   1978   };
   1979 
   1980   // Determine what kind of thing we have.
   1981   switch (isCXXConditionDeclarationOrInitStatement(InitStmt, FRI)) {
   1982   case ConditionOrInitStatement::Expression: {
   1983     // If this is a for loop, we're entering its condition.
   1984     ForConditionScope.enter(/*IsConditionVariable=*/false);
   1985 
   1986     ProhibitAttributes(attrs);
   1987 
   1988     // We can have an empty expression here.
   1989     //   if (; true);
   1990     if (InitStmt && Tok.is(tok::semi)) {
   1991       WarnOnInit();
   1992       SourceLocation SemiLoc = Tok.getLocation();
   1993       if (!Tok.hasLeadingEmptyMacro() && !SemiLoc.isMacroID()) {
   1994         Diag(SemiLoc, diag::warn_empty_init_statement)
   1995             << (CK == Sema::ConditionKind::Switch)
   1996             << FixItHint::CreateRemoval(SemiLoc);
   1997       }
   1998       ConsumeToken();
   1999       *InitStmt = Actions.ActOnNullStmt(SemiLoc);
   2000       return ParseCXXCondition(nullptr, Loc, CK);
   2001     }
   2002 
   2003     // Parse the expression.
   2004     ExprResult Expr = ParseExpression(); // expression
   2005     if (Expr.isInvalid())
   2006       return Sema::ConditionError();
   2007 
   2008     if (InitStmt && Tok.is(tok::semi)) {
   2009       WarnOnInit();
   2010       *InitStmt = Actions.ActOnExprStmt(Expr.get());
   2011       ConsumeToken();
   2012       return ParseCXXCondition(nullptr, Loc, CK);
   2013     }
   2014 
   2015     return Actions.ActOnCondition(getCurScope(), Loc, Expr.get(), CK);
   2016   }
   2017 
   2018   case ConditionOrInitStatement::InitStmtDecl: {
   2019     WarnOnInit();
   2020     SourceLocation DeclStart = Tok.getLocation(), DeclEnd;
   2021     DeclGroupPtrTy DG = ParseSimpleDeclaration(
   2022         DeclaratorContext::SelectionInit, DeclEnd, attrs, /*RequireSemi=*/true);
   2023     *InitStmt = Actions.ActOnDeclStmt(DG, DeclStart, DeclEnd);
   2024     return ParseCXXCondition(nullptr, Loc, CK);
   2025   }
   2026 
   2027   case ConditionOrInitStatement::ForRangeDecl: {
   2028     // This is 'for (init-stmt; for-range-decl : range-expr)'.
   2029     // We're not actually in a for loop yet, so 'break' and 'continue' aren't
   2030     // permitted here.
   2031     assert(FRI && "should not parse a for range declaration here");
   2032     SourceLocation DeclStart = Tok.getLocation(), DeclEnd;
   2033     DeclGroupPtrTy DG = ParseSimpleDeclaration(DeclaratorContext::ForInit,
   2034                                                DeclEnd, attrs, false, FRI);
   2035     FRI->LoopVar = Actions.ActOnDeclStmt(DG, DeclStart, Tok.getLocation());
   2036     assert((FRI->ColonLoc.isValid() || !DG) &&
   2037            "cannot find for range declaration");
   2038     return Sema::ConditionResult();
   2039   }
   2040 
   2041   case ConditionOrInitStatement::ConditionDecl:
   2042   case ConditionOrInitStatement::Error:
   2043     break;
   2044   }
   2045 
   2046   // If this is a for loop, we're entering its condition.
   2047   ForConditionScope.enter(/*IsConditionVariable=*/true);
   2048 
   2049   // type-specifier-seq
   2050   DeclSpec DS(AttrFactory);
   2051   DS.takeAttributesFrom(attrs);
   2052   ParseSpecifierQualifierList(DS, AS_none, DeclSpecContext::DSC_condition);
   2053 
   2054   // declarator
   2055   Declarator DeclaratorInfo(DS, DeclaratorContext::Condition);
   2056   ParseDeclarator(DeclaratorInfo);
   2057 
   2058   // simple-asm-expr[opt]
   2059   if (Tok.is(tok::kw_asm)) {
   2060     SourceLocation Loc;
   2061     ExprResult AsmLabel(ParseSimpleAsm(/*ForAsmLabel*/ true, &Loc));
   2062     if (AsmLabel.isInvalid()) {
   2063       SkipUntil(tok::semi, StopAtSemi);
   2064       return Sema::ConditionError();
   2065     }
   2066     DeclaratorInfo.setAsmLabel(AsmLabel.get());
   2067     DeclaratorInfo.SetRangeEnd(Loc);
   2068   }
   2069 
   2070   // If attributes are present, parse them.
   2071   MaybeParseGNUAttributes(DeclaratorInfo);
   2072 
   2073   // Type-check the declaration itself.
   2074   DeclResult Dcl = Actions.ActOnCXXConditionDeclaration(getCurScope(),
   2075                                                         DeclaratorInfo);
   2076   if (Dcl.isInvalid())
   2077     return Sema::ConditionError();
   2078   Decl *DeclOut = Dcl.get();
   2079 
   2080   // '=' assignment-expression
   2081   // If a '==' or '+=' is found, suggest a fixit to '='.
   2082   bool CopyInitialization = isTokenEqualOrEqualTypo();
   2083   if (CopyInitialization)
   2084     ConsumeToken();
   2085 
   2086   ExprResult InitExpr = ExprError();
   2087   if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {
   2088     Diag(Tok.getLocation(),
   2089          diag::warn_cxx98_compat_generalized_initializer_lists);
   2090     InitExpr = ParseBraceInitializer();
   2091   } else if (CopyInitialization) {
   2092     PreferredType.enterVariableInit(Tok.getLocation(), DeclOut);
   2093     InitExpr = ParseAssignmentExpression();
   2094   } else if (Tok.is(tok::l_paren)) {
   2095     // This was probably an attempt to initialize the variable.
   2096     SourceLocation LParen = ConsumeParen(), RParen = LParen;
   2097     if (SkipUntil(tok::r_paren, StopAtSemi | StopBeforeMatch))
   2098       RParen = ConsumeParen();
   2099     Diag(DeclOut->getLocation(),
   2100          diag::err_expected_init_in_condition_lparen)
   2101       << SourceRange(LParen, RParen);
   2102   } else {
   2103     Diag(DeclOut->getLocation(), diag::err_expected_init_in_condition);
   2104   }
   2105 
   2106   if (!InitExpr.isInvalid())
   2107     Actions.AddInitializerToDecl(DeclOut, InitExpr.get(), !CopyInitialization);
   2108   else
   2109     Actions.ActOnInitializerError(DeclOut);
   2110 
   2111   Actions.FinalizeDeclaration(DeclOut);
   2112   return Actions.ActOnConditionVariable(DeclOut, Loc, CK);
   2113 }
   2114 
   2115 /// ParseCXXSimpleTypeSpecifier - [C++ 7.1.5.2] Simple type specifiers.
   2116 /// This should only be called when the current token is known to be part of
   2117 /// simple-type-specifier.
   2118 ///
   2119 ///       simple-type-specifier:
   2120 ///         '::'[opt] nested-name-specifier[opt] type-name
   2121 ///         '::'[opt] nested-name-specifier 'template' simple-template-id [TODO]
   2122 ///         char
   2123 ///         wchar_t
   2124 ///         bool
   2125 ///         short
   2126 ///         int
   2127 ///         long
   2128 ///         signed
   2129 ///         unsigned
   2130 ///         float
   2131 ///         double
   2132 ///         void
   2133 /// [GNU]   typeof-specifier
   2134 /// [C++0x] auto               [TODO]
   2135 ///
   2136 ///       type-name:
   2137 ///         class-name
   2138 ///         enum-name
   2139 ///         typedef-name
   2140 ///
   2141 void Parser::ParseCXXSimpleTypeSpecifier(DeclSpec &DS) {
   2142   DS.SetRangeStart(Tok.getLocation());
   2143   const char *PrevSpec;
   2144   unsigned DiagID;
   2145   SourceLocation Loc = Tok.getLocation();
   2146   const clang::PrintingPolicy &Policy =
   2147       Actions.getASTContext().getPrintingPolicy();
   2148 
   2149   switch (Tok.getKind()) {
   2150   case tok::identifier:   // foo::bar
   2151   case tok::coloncolon:   // ::foo::bar
   2152     llvm_unreachable("Annotation token should already be formed!");
   2153   default:
   2154     llvm_unreachable("Not a simple-type-specifier token!");
   2155 
   2156   // type-name
   2157   case tok::annot_typename: {
   2158     DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec, DiagID,
   2159                        getTypeAnnotation(Tok), Policy);
   2160     DS.SetRangeEnd(Tok.getAnnotationEndLoc());
   2161     ConsumeAnnotationToken();
   2162 
   2163     DS.Finish(Actions, Policy);
   2164     return;
   2165   }
   2166 
   2167   case tok::kw__ExtInt: {
   2168     ExprResult ER = ParseExtIntegerArgument();
   2169     if (ER.isInvalid())
   2170       DS.SetTypeSpecError();
   2171     else
   2172       DS.SetExtIntType(Loc, ER.get(), PrevSpec, DiagID, Policy);
   2173 
   2174     // Do this here because we have already consumed the close paren.
   2175     DS.SetRangeEnd(PrevTokLocation);
   2176     DS.Finish(Actions, Policy);
   2177     return;
   2178   }
   2179 
   2180   // builtin types
   2181   case tok::kw_short:
   2182     DS.SetTypeSpecWidth(TypeSpecifierWidth::Short, Loc, PrevSpec, DiagID,
   2183                         Policy);
   2184     break;
   2185   case tok::kw_long:
   2186     DS.SetTypeSpecWidth(TypeSpecifierWidth::Long, Loc, PrevSpec, DiagID,
   2187                         Policy);
   2188     break;
   2189   case tok::kw___int64:
   2190     DS.SetTypeSpecWidth(TypeSpecifierWidth::LongLong, Loc, PrevSpec, DiagID,
   2191                         Policy);
   2192     break;
   2193   case tok::kw_signed:
   2194     DS.SetTypeSpecSign(TypeSpecifierSign::Signed, Loc, PrevSpec, DiagID);
   2195     break;
   2196   case tok::kw_unsigned:
   2197     DS.SetTypeSpecSign(TypeSpecifierSign::Unsigned, Loc, PrevSpec, DiagID);
   2198     break;
   2199   case tok::kw_void:
   2200     DS.SetTypeSpecType(DeclSpec::TST_void, Loc, PrevSpec, DiagID, Policy);
   2201     break;
   2202   case tok::kw_char:
   2203     DS.SetTypeSpecType(DeclSpec::TST_char, Loc, PrevSpec, DiagID, Policy);
   2204     break;
   2205   case tok::kw_int:
   2206     DS.SetTypeSpecType(DeclSpec::TST_int, Loc, PrevSpec, DiagID, Policy);
   2207     break;
   2208   case tok::kw___int128:
   2209     DS.SetTypeSpecType(DeclSpec::TST_int128, Loc, PrevSpec, DiagID, Policy);
   2210     break;
   2211   case tok::kw___bf16:
   2212     DS.SetTypeSpecType(DeclSpec::TST_BFloat16, Loc, PrevSpec, DiagID, Policy);
   2213     break;
   2214   case tok::kw_half:
   2215     DS.SetTypeSpecType(DeclSpec::TST_half, Loc, PrevSpec, DiagID, Policy);
   2216     break;
   2217   case tok::kw_float:
   2218     DS.SetTypeSpecType(DeclSpec::TST_float, Loc, PrevSpec, DiagID, Policy);
   2219     break;
   2220   case tok::kw_double:
   2221     DS.SetTypeSpecType(DeclSpec::TST_double, Loc, PrevSpec, DiagID, Policy);
   2222     break;
   2223   case tok::kw__Float16:
   2224     DS.SetTypeSpecType(DeclSpec::TST_float16, Loc, PrevSpec, DiagID, Policy);
   2225     break;
   2226   case tok::kw___float128:
   2227     DS.SetTypeSpecType(DeclSpec::TST_float128, Loc, PrevSpec, DiagID, Policy);
   2228     break;
   2229   case tok::kw_wchar_t:
   2230     DS.SetTypeSpecType(DeclSpec::TST_wchar, Loc, PrevSpec, DiagID, Policy);
   2231     break;
   2232   case tok::kw_char8_t:
   2233     DS.SetTypeSpecType(DeclSpec::TST_char8, Loc, PrevSpec, DiagID, Policy);
   2234     break;
   2235   case tok::kw_char16_t:
   2236     DS.SetTypeSpecType(DeclSpec::TST_char16, Loc, PrevSpec, DiagID, Policy);
   2237     break;
   2238   case tok::kw_char32_t:
   2239     DS.SetTypeSpecType(DeclSpec::TST_char32, Loc, PrevSpec, DiagID, Policy);
   2240     break;
   2241   case tok::kw_bool:
   2242     DS.SetTypeSpecType(DeclSpec::TST_bool, Loc, PrevSpec, DiagID, Policy);
   2243     break;
   2244 #define GENERIC_IMAGE_TYPE(ImgType, Id)                                        \
   2245   case tok::kw_##ImgType##_t:                                                  \
   2246     DS.SetTypeSpecType(DeclSpec::TST_##ImgType##_t, Loc, PrevSpec, DiagID,     \
   2247                        Policy);                                                \
   2248     break;
   2249 #include "clang/Basic/OpenCLImageTypes.def"
   2250 
   2251   case tok::annot_decltype:
   2252   case tok::kw_decltype:
   2253     DS.SetRangeEnd(ParseDecltypeSpecifier(DS));
   2254     return DS.Finish(Actions, Policy);
   2255 
   2256   // GNU typeof support.
   2257   case tok::kw_typeof:
   2258     ParseTypeofSpecifier(DS);
   2259     DS.Finish(Actions, Policy);
   2260     return;
   2261   }
   2262   ConsumeAnyToken();
   2263   DS.SetRangeEnd(PrevTokLocation);
   2264   DS.Finish(Actions, Policy);
   2265 }
   2266 
   2267 /// ParseCXXTypeSpecifierSeq - Parse a C++ type-specifier-seq (C++
   2268 /// [dcl.name]), which is a non-empty sequence of type-specifiers,
   2269 /// e.g., "const short int". Note that the DeclSpec is *not* finished
   2270 /// by parsing the type-specifier-seq, because these sequences are
   2271 /// typically followed by some form of declarator. Returns true and
   2272 /// emits diagnostics if this is not a type-specifier-seq, false
   2273 /// otherwise.
   2274 ///
   2275 ///   type-specifier-seq: [C++ 8.1]
   2276 ///     type-specifier type-specifier-seq[opt]
   2277 ///
   2278 bool Parser::ParseCXXTypeSpecifierSeq(DeclSpec &DS) {
   2279   ParseSpecifierQualifierList(DS, AS_none, DeclSpecContext::DSC_type_specifier);
   2280   DS.Finish(Actions, Actions.getASTContext().getPrintingPolicy());
   2281   return false;
   2282 }
   2283 
   2284 /// Finish parsing a C++ unqualified-id that is a template-id of
   2285 /// some form.
   2286 ///
   2287 /// This routine is invoked when a '<' is encountered after an identifier or
   2288 /// operator-function-id is parsed by \c ParseUnqualifiedId() to determine
   2289 /// whether the unqualified-id is actually a template-id. This routine will
   2290 /// then parse the template arguments and form the appropriate template-id to
   2291 /// return to the caller.
   2292 ///
   2293 /// \param SS the nested-name-specifier that precedes this template-id, if
   2294 /// we're actually parsing a qualified-id.
   2295 ///
   2296 /// \param ObjectType if this unqualified-id occurs within a member access
   2297 /// expression, the type of the base object whose member is being accessed.
   2298 ///
   2299 /// \param ObjectHadErrors this unqualified-id occurs within a member access
   2300 /// expression, indicates whether the original subexpressions had any errors.
   2301 ///
   2302 /// \param Name for constructor and destructor names, this is the actual
   2303 /// identifier that may be a template-name.
   2304 ///
   2305 /// \param NameLoc the location of the class-name in a constructor or
   2306 /// destructor.
   2307 ///
   2308 /// \param EnteringContext whether we're entering the scope of the
   2309 /// nested-name-specifier.
   2310 ///
   2311 /// \param Id as input, describes the template-name or operator-function-id
   2312 /// that precedes the '<'. If template arguments were parsed successfully,
   2313 /// will be updated with the template-id.
   2314 ///
   2315 /// \param AssumeTemplateId When true, this routine will assume that the name
   2316 /// refers to a template without performing name lookup to verify.
   2317 ///
   2318 /// \returns true if a parse error occurred, false otherwise.
   2319 bool Parser::ParseUnqualifiedIdTemplateId(
   2320     CXXScopeSpec &SS, ParsedType ObjectType, bool ObjectHadErrors,
   2321     SourceLocation TemplateKWLoc, IdentifierInfo *Name, SourceLocation NameLoc,
   2322     bool EnteringContext, UnqualifiedId &Id, bool AssumeTemplateId) {
   2323   assert(Tok.is(tok::less) && "Expected '<' to finish parsing a template-id");
   2324 
   2325   TemplateTy Template;
   2326   TemplateNameKind TNK = TNK_Non_template;
   2327   switch (Id.getKind()) {
   2328   case UnqualifiedIdKind::IK_Identifier:
   2329   case UnqualifiedIdKind::IK_OperatorFunctionId:
   2330   case UnqualifiedIdKind::IK_LiteralOperatorId:
   2331     if (AssumeTemplateId) {
   2332       // We defer the injected-class-name checks until we've found whether
   2333       // this template-id is used to form a nested-name-specifier or not.
   2334       TNK = Actions.ActOnTemplateName(getCurScope(), SS, TemplateKWLoc, Id,
   2335                                       ObjectType, EnteringContext, Template,
   2336                                       /*AllowInjectedClassName*/ true);
   2337     } else {
   2338       bool MemberOfUnknownSpecialization;
   2339       TNK = Actions.isTemplateName(getCurScope(), SS,
   2340                                    TemplateKWLoc.isValid(), Id,
   2341                                    ObjectType, EnteringContext, Template,
   2342                                    MemberOfUnknownSpecialization);
   2343       // If lookup found nothing but we're assuming that this is a template
   2344       // name, double-check that makes sense syntactically before committing
   2345       // to it.
   2346       if (TNK == TNK_Undeclared_template &&
   2347           isTemplateArgumentList(0) == TPResult::False)
   2348         return false;
   2349 
   2350       if (TNK == TNK_Non_template && MemberOfUnknownSpecialization &&
   2351           ObjectType && isTemplateArgumentList(0) == TPResult::True) {
   2352         // If we had errors before, ObjectType can be dependent even without any
   2353         // templates, do not report missing template keyword in that case.
   2354         if (!ObjectHadErrors) {
   2355           // We have something like t->getAs<T>(), where getAs is a
   2356           // member of an unknown specialization. However, this will only
   2357           // parse correctly as a template, so suggest the keyword 'template'
   2358           // before 'getAs' and treat this as a dependent template name.
   2359           std::string Name;
   2360           if (Id.getKind() == UnqualifiedIdKind::IK_Identifier)
   2361             Name = std::string(Id.Identifier->getName());
   2362           else {
   2363             Name = "operator ";
   2364             if (Id.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId)
   2365               Name += getOperatorSpelling(Id.OperatorFunctionId.Operator);
   2366             else
   2367               Name += Id.Identifier->getName();
   2368           }
   2369           Diag(Id.StartLocation, diag::err_missing_dependent_template_keyword)
   2370               << Name
   2371               << FixItHint::CreateInsertion(Id.StartLocation, "template ");
   2372         }
   2373         TNK = Actions.ActOnTemplateName(
   2374             getCurScope(), SS, TemplateKWLoc, Id, ObjectType, EnteringContext,
   2375             Template, /*AllowInjectedClassName*/ true);
   2376       } else if (TNK == TNK_Non_template) {
   2377         return false;
   2378       }
   2379     }
   2380     break;
   2381 
   2382   case UnqualifiedIdKind::IK_ConstructorName: {
   2383     UnqualifiedId TemplateName;
   2384     bool MemberOfUnknownSpecialization;
   2385     TemplateName.setIdentifier(Name, NameLoc);
   2386     TNK = Actions.isTemplateName(getCurScope(), SS, TemplateKWLoc.isValid(),
   2387                                  TemplateName, ObjectType,
   2388                                  EnteringContext, Template,
   2389                                  MemberOfUnknownSpecialization);
   2390     if (TNK == TNK_Non_template)
   2391       return false;
   2392     break;
   2393   }
   2394 
   2395   case UnqualifiedIdKind::IK_DestructorName: {
   2396     UnqualifiedId TemplateName;
   2397     bool MemberOfUnknownSpecialization;
   2398     TemplateName.setIdentifier(Name, NameLoc);
   2399     if (ObjectType) {
   2400       TNK = Actions.ActOnTemplateName(
   2401           getCurScope(), SS, TemplateKWLoc, TemplateName, ObjectType,
   2402           EnteringContext, Template, /*AllowInjectedClassName*/ true);
   2403     } else {
   2404       TNK = Actions.isTemplateName(getCurScope(), SS, TemplateKWLoc.isValid(),
   2405                                    TemplateName, ObjectType,
   2406                                    EnteringContext, Template,
   2407                                    MemberOfUnknownSpecialization);
   2408 
   2409       if (TNK == TNK_Non_template && !Id.DestructorName.get()) {
   2410         Diag(NameLoc, diag::err_destructor_template_id)
   2411           << Name << SS.getRange();
   2412         // Carry on to parse the template arguments before bailing out.
   2413       }
   2414     }
   2415     break;
   2416   }
   2417 
   2418   default:
   2419     return false;
   2420   }
   2421 
   2422   // Parse the enclosed template argument list.
   2423   SourceLocation LAngleLoc, RAngleLoc;
   2424   TemplateArgList TemplateArgs;
   2425   if (ParseTemplateIdAfterTemplateName(true, LAngleLoc, TemplateArgs,
   2426                                        RAngleLoc))
   2427     return true;
   2428 
   2429   // If this is a non-template, we already issued a diagnostic.
   2430   if (TNK == TNK_Non_template)
   2431     return true;
   2432 
   2433   if (Id.getKind() == UnqualifiedIdKind::IK_Identifier ||
   2434       Id.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId ||
   2435       Id.getKind() == UnqualifiedIdKind::IK_LiteralOperatorId) {
   2436     // Form a parsed representation of the template-id to be stored in the
   2437     // UnqualifiedId.
   2438 
   2439     // FIXME: Store name for literal operator too.
   2440     IdentifierInfo *TemplateII =
   2441         Id.getKind() == UnqualifiedIdKind::IK_Identifier ? Id.Identifier
   2442                                                          : nullptr;
   2443     OverloadedOperatorKind OpKind =
   2444         Id.getKind() == UnqualifiedIdKind::IK_Identifier
   2445             ? OO_None
   2446             : Id.OperatorFunctionId.Operator;
   2447 
   2448     TemplateIdAnnotation *TemplateId = TemplateIdAnnotation::Create(
   2449         TemplateKWLoc, Id.StartLocation, TemplateII, OpKind, Template, TNK,
   2450         LAngleLoc, RAngleLoc, TemplateArgs, /*ArgsInvalid*/false, TemplateIds);
   2451 
   2452     Id.setTemplateId(TemplateId);
   2453     return false;
   2454   }
   2455 
   2456   // Bundle the template arguments together.
   2457   ASTTemplateArgsPtr TemplateArgsPtr(TemplateArgs);
   2458 
   2459   // Constructor and destructor names.
   2460   TypeResult Type = Actions.ActOnTemplateIdType(
   2461       getCurScope(), SS, TemplateKWLoc, Template, Name, NameLoc, LAngleLoc,
   2462       TemplateArgsPtr, RAngleLoc, /*IsCtorOrDtorName=*/true);
   2463   if (Type.isInvalid())
   2464     return true;
   2465 
   2466   if (Id.getKind() == UnqualifiedIdKind::IK_ConstructorName)
   2467     Id.setConstructorName(Type.get(), NameLoc, RAngleLoc);
   2468   else
   2469     Id.setDestructorName(Id.StartLocation, Type.get(), RAngleLoc);
   2470 
   2471   return false;
   2472 }
   2473 
   2474 /// Parse an operator-function-id or conversion-function-id as part
   2475 /// of a C++ unqualified-id.
   2476 ///
   2477 /// This routine is responsible only for parsing the operator-function-id or
   2478 /// conversion-function-id; it does not handle template arguments in any way.
   2479 ///
   2480 /// \code
   2481 ///       operator-function-id: [C++ 13.5]
   2482 ///         'operator' operator
   2483 ///
   2484 ///       operator: one of
   2485 ///            new   delete  new[]   delete[]
   2486 ///            +     -    *  /    %  ^    &   |   ~
   2487 ///            !     =    <  >    += -=   *=  /=  %=
   2488 ///            ^=    &=   |= <<   >> >>= <<=  ==  !=
   2489 ///            <=    >=   && ||   ++ --   ,   ->* ->
   2490 ///            ()    []   <=>
   2491 ///
   2492 ///       conversion-function-id: [C++ 12.3.2]
   2493 ///         operator conversion-type-id
   2494 ///
   2495 ///       conversion-type-id:
   2496 ///         type-specifier-seq conversion-declarator[opt]
   2497 ///
   2498 ///       conversion-declarator:
   2499 ///         ptr-operator conversion-declarator[opt]
   2500 /// \endcode
   2501 ///
   2502 /// \param SS The nested-name-specifier that preceded this unqualified-id. If
   2503 /// non-empty, then we are parsing the unqualified-id of a qualified-id.
   2504 ///
   2505 /// \param EnteringContext whether we are entering the scope of the
   2506 /// nested-name-specifier.
   2507 ///
   2508 /// \param ObjectType if this unqualified-id occurs within a member access
   2509 /// expression, the type of the base object whose member is being accessed.
   2510 ///
   2511 /// \param Result on a successful parse, contains the parsed unqualified-id.
   2512 ///
   2513 /// \returns true if parsing fails, false otherwise.
   2514 bool Parser::ParseUnqualifiedIdOperator(CXXScopeSpec &SS, bool EnteringContext,
   2515                                         ParsedType ObjectType,
   2516                                         UnqualifiedId &Result) {
   2517   assert(Tok.is(tok::kw_operator) && "Expected 'operator' keyword");
   2518 
   2519   // Consume the 'operator' keyword.
   2520   SourceLocation KeywordLoc = ConsumeToken();
   2521 
   2522   // Determine what kind of operator name we have.
   2523   unsigned SymbolIdx = 0;
   2524   SourceLocation SymbolLocations[3];
   2525   OverloadedOperatorKind Op = OO_None;
   2526   switch (Tok.getKind()) {
   2527     case tok::kw_new:
   2528     case tok::kw_delete: {
   2529       bool isNew = Tok.getKind() == tok::kw_new;
   2530       // Consume the 'new' or 'delete'.
   2531       SymbolLocations[SymbolIdx++] = ConsumeToken();
   2532       // Check for array new/delete.
   2533       if (Tok.is(tok::l_square) &&
   2534           (!getLangOpts().CPlusPlus11 || NextToken().isNot(tok::l_square))) {
   2535         // Consume the '[' and ']'.
   2536         BalancedDelimiterTracker T(*this, tok::l_square);
   2537         T.consumeOpen();
   2538         T.consumeClose();
   2539         if (T.getCloseLocation().isInvalid())
   2540           return true;
   2541 
   2542         SymbolLocations[SymbolIdx++] = T.getOpenLocation();
   2543         SymbolLocations[SymbolIdx++] = T.getCloseLocation();
   2544         Op = isNew? OO_Array_New : OO_Array_Delete;
   2545       } else {
   2546         Op = isNew? OO_New : OO_Delete;
   2547       }
   2548       break;
   2549     }
   2550 
   2551 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
   2552     case tok::Token:                                                     \
   2553       SymbolLocations[SymbolIdx++] = ConsumeToken();                     \
   2554       Op = OO_##Name;                                                    \
   2555       break;
   2556 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
   2557 #include "clang/Basic/OperatorKinds.def"
   2558 
   2559     case tok::l_paren: {
   2560       // Consume the '(' and ')'.
   2561       BalancedDelimiterTracker T(*this, tok::l_paren);
   2562       T.consumeOpen();
   2563       T.consumeClose();
   2564       if (T.getCloseLocation().isInvalid())
   2565         return true;
   2566 
   2567       SymbolLocations[SymbolIdx++] = T.getOpenLocation();
   2568       SymbolLocations[SymbolIdx++] = T.getCloseLocation();
   2569       Op = OO_Call;
   2570       break;
   2571     }
   2572 
   2573     case tok::l_square: {
   2574       // Consume the '[' and ']'.
   2575       BalancedDelimiterTracker T(*this, tok::l_square);
   2576       T.consumeOpen();
   2577       T.consumeClose();
   2578       if (T.getCloseLocation().isInvalid())
   2579         return true;
   2580 
   2581       SymbolLocations[SymbolIdx++] = T.getOpenLocation();
   2582       SymbolLocations[SymbolIdx++] = T.getCloseLocation();
   2583       Op = OO_Subscript;
   2584       break;
   2585     }
   2586 
   2587     case tok::code_completion: {
   2588       // Don't try to parse any further.
   2589       cutOffParsing();
   2590       // Code completion for the operator name.
   2591       Actions.CodeCompleteOperatorName(getCurScope());
   2592       return true;
   2593     }
   2594 
   2595     default:
   2596       break;
   2597   }
   2598 
   2599   if (Op != OO_None) {
   2600     // We have parsed an operator-function-id.
   2601     Result.setOperatorFunctionId(KeywordLoc, Op, SymbolLocations);
   2602     return false;
   2603   }
   2604 
   2605   // Parse a literal-operator-id.
   2606   //
   2607   //   literal-operator-id: C++11 [over.literal]
   2608   //     operator string-literal identifier
   2609   //     operator user-defined-string-literal
   2610 
   2611   if (getLangOpts().CPlusPlus11 && isTokenStringLiteral()) {
   2612     Diag(Tok.getLocation(), diag::warn_cxx98_compat_literal_operator);
   2613 
   2614     SourceLocation DiagLoc;
   2615     unsigned DiagId = 0;
   2616 
   2617     // We're past translation phase 6, so perform string literal concatenation
   2618     // before checking for "".
   2619     SmallVector<Token, 4> Toks;
   2620     SmallVector<SourceLocation, 4> TokLocs;
   2621     while (isTokenStringLiteral()) {
   2622       if (!Tok.is(tok::string_literal) && !DiagId) {
   2623         // C++11 [over.literal]p1:
   2624         //   The string-literal or user-defined-string-literal in a
   2625         //   literal-operator-id shall have no encoding-prefix [...].
   2626         DiagLoc = Tok.getLocation();
   2627         DiagId = diag::err_literal_operator_string_prefix;
   2628       }
   2629       Toks.push_back(Tok);
   2630       TokLocs.push_back(ConsumeStringToken());
   2631     }
   2632 
   2633     StringLiteralParser Literal(Toks, PP);
   2634     if (Literal.hadError)
   2635       return true;
   2636 
   2637     // Grab the literal operator's suffix, which will be either the next token
   2638     // or a ud-suffix from the string literal.
   2639     IdentifierInfo *II = nullptr;
   2640     SourceLocation SuffixLoc;
   2641     if (!Literal.getUDSuffix().empty()) {
   2642       II = &PP.getIdentifierTable().get(Literal.getUDSuffix());
   2643       SuffixLoc =
   2644         Lexer::AdvanceToTokenCharacter(TokLocs[Literal.getUDSuffixToken()],
   2645                                        Literal.getUDSuffixOffset(),
   2646                                        PP.getSourceManager(), getLangOpts());
   2647     } else if (Tok.is(tok::identifier)) {
   2648       II = Tok.getIdentifierInfo();
   2649       SuffixLoc = ConsumeToken();
   2650       TokLocs.push_back(SuffixLoc);
   2651     } else {
   2652       Diag(Tok.getLocation(), diag::err_expected) << tok::identifier;
   2653       return true;
   2654     }
   2655 
   2656     // The string literal must be empty.
   2657     if (!Literal.GetString().empty() || Literal.Pascal) {
   2658       // C++11 [over.literal]p1:
   2659       //   The string-literal or user-defined-string-literal in a
   2660       //   literal-operator-id shall [...] contain no characters
   2661       //   other than the implicit terminating '\0'.
   2662       DiagLoc = TokLocs.front();
   2663       DiagId = diag::err_literal_operator_string_not_empty;
   2664     }
   2665 
   2666     if (DiagId) {
   2667       // This isn't a valid literal-operator-id, but we think we know
   2668       // what the user meant. Tell them what they should have written.
   2669       SmallString<32> Str;
   2670       Str += "\"\"";
   2671       Str += II->getName();
   2672       Diag(DiagLoc, DiagId) << FixItHint::CreateReplacement(
   2673           SourceRange(TokLocs.front(), TokLocs.back()), Str);
   2674     }
   2675 
   2676     Result.setLiteralOperatorId(II, KeywordLoc, SuffixLoc);
   2677 
   2678     return Actions.checkLiteralOperatorId(SS, Result);
   2679   }
   2680 
   2681   // Parse a conversion-function-id.
   2682   //
   2683   //   conversion-function-id: [C++ 12.3.2]
   2684   //     operator conversion-type-id
   2685   //
   2686   //   conversion-type-id:
   2687   //     type-specifier-seq conversion-declarator[opt]
   2688   //
   2689   //   conversion-declarator:
   2690   //     ptr-operator conversion-declarator[opt]
   2691 
   2692   // Parse the type-specifier-seq.
   2693   DeclSpec DS(AttrFactory);
   2694   if (ParseCXXTypeSpecifierSeq(DS)) // FIXME: ObjectType?
   2695     return true;
   2696 
   2697   // Parse the conversion-declarator, which is merely a sequence of
   2698   // ptr-operators.
   2699   Declarator D(DS, DeclaratorContext::ConversionId);
   2700   ParseDeclaratorInternal(D, /*DirectDeclParser=*/nullptr);
   2701 
   2702   // Finish up the type.
   2703   TypeResult Ty = Actions.ActOnTypeName(getCurScope(), D);
   2704   if (Ty.isInvalid())
   2705     return true;
   2706 
   2707   // Note that this is a conversion-function-id.
   2708   Result.setConversionFunctionId(KeywordLoc, Ty.get(),
   2709                                  D.getSourceRange().getEnd());
   2710   return false;
   2711 }
   2712 
   2713 /// Parse a C++ unqualified-id (or a C identifier), which describes the
   2714 /// name of an entity.
   2715 ///
   2716 /// \code
   2717 ///       unqualified-id: [C++ expr.prim.general]
   2718 ///         identifier
   2719 ///         operator-function-id
   2720 ///         conversion-function-id
   2721 /// [C++0x] literal-operator-id [TODO]
   2722 ///         ~ class-name
   2723 ///         template-id
   2724 ///
   2725 /// \endcode
   2726 ///
   2727 /// \param SS The nested-name-specifier that preceded this unqualified-id. If
   2728 /// non-empty, then we are parsing the unqualified-id of a qualified-id.
   2729 ///
   2730 /// \param ObjectType if this unqualified-id occurs within a member access
   2731 /// expression, the type of the base object whose member is being accessed.
   2732 ///
   2733 /// \param ObjectHadErrors if this unqualified-id occurs within a member access
   2734 /// expression, indicates whether the original subexpressions had any errors.
   2735 /// When true, diagnostics for missing 'template' keyword will be supressed.
   2736 ///
   2737 /// \param EnteringContext whether we are entering the scope of the
   2738 /// nested-name-specifier.
   2739 ///
   2740 /// \param AllowDestructorName whether we allow parsing of a destructor name.
   2741 ///
   2742 /// \param AllowConstructorName whether we allow parsing a constructor name.
   2743 ///
   2744 /// \param AllowDeductionGuide whether we allow parsing a deduction guide name.
   2745 ///
   2746 /// \param Result on a successful parse, contains the parsed unqualified-id.
   2747 ///
   2748 /// \returns true if parsing fails, false otherwise.
   2749 bool Parser::ParseUnqualifiedId(CXXScopeSpec &SS, ParsedType ObjectType,
   2750                                 bool ObjectHadErrors, bool EnteringContext,
   2751                                 bool AllowDestructorName,
   2752                                 bool AllowConstructorName,
   2753                                 bool AllowDeductionGuide,
   2754                                 SourceLocation *TemplateKWLoc,
   2755                                 UnqualifiedId &Result) {
   2756   if (TemplateKWLoc)
   2757     *TemplateKWLoc = SourceLocation();
   2758 
   2759   // Handle 'A::template B'. This is for template-ids which have not
   2760   // already been annotated by ParseOptionalCXXScopeSpecifier().
   2761   bool TemplateSpecified = false;
   2762   if (Tok.is(tok::kw_template)) {
   2763     if (TemplateKWLoc && (ObjectType || SS.isSet())) {
   2764       TemplateSpecified = true;
   2765       *TemplateKWLoc = ConsumeToken();
   2766     } else {
   2767       SourceLocation TemplateLoc = ConsumeToken();
   2768       Diag(TemplateLoc, diag::err_unexpected_template_in_unqualified_id)
   2769         << FixItHint::CreateRemoval(TemplateLoc);
   2770     }
   2771   }
   2772 
   2773   // unqualified-id:
   2774   //   identifier
   2775   //   template-id (when it hasn't already been annotated)
   2776   if (Tok.is(tok::identifier)) {
   2777     // Consume the identifier.
   2778     IdentifierInfo *Id = Tok.getIdentifierInfo();
   2779     SourceLocation IdLoc = ConsumeToken();
   2780 
   2781     if (!getLangOpts().CPlusPlus) {
   2782       // If we're not in C++, only identifiers matter. Record the
   2783       // identifier and return.
   2784       Result.setIdentifier(Id, IdLoc);
   2785       return false;
   2786     }
   2787 
   2788     ParsedTemplateTy TemplateName;
   2789     if (AllowConstructorName &&
   2790         Actions.isCurrentClassName(*Id, getCurScope(), &SS)) {
   2791       // We have parsed a constructor name.
   2792       ParsedType Ty = Actions.getConstructorName(*Id, IdLoc, getCurScope(), SS,
   2793                                                  EnteringContext);
   2794       if (!Ty)
   2795         return true;
   2796       Result.setConstructorName(Ty, IdLoc, IdLoc);
   2797     } else if (getLangOpts().CPlusPlus17 &&
   2798                AllowDeductionGuide && SS.isEmpty() &&
   2799                Actions.isDeductionGuideName(getCurScope(), *Id, IdLoc,
   2800                                             &TemplateName)) {
   2801       // We have parsed a template-name naming a deduction guide.
   2802       Result.setDeductionGuideName(TemplateName, IdLoc);
   2803     } else {
   2804       // We have parsed an identifier.
   2805       Result.setIdentifier(Id, IdLoc);
   2806     }
   2807 
   2808     // If the next token is a '<', we may have a template.
   2809     TemplateTy Template;
   2810     if (Tok.is(tok::less))
   2811       return ParseUnqualifiedIdTemplateId(
   2812           SS, ObjectType, ObjectHadErrors,
   2813           TemplateKWLoc ? *TemplateKWLoc : SourceLocation(), Id, IdLoc,
   2814           EnteringContext, Result, TemplateSpecified);
   2815     else if (TemplateSpecified &&
   2816              Actions.ActOnTemplateName(
   2817                  getCurScope(), SS, *TemplateKWLoc, Result, ObjectType,
   2818                  EnteringContext, Template,
   2819                  /*AllowInjectedClassName*/ true) == TNK_Non_template)
   2820       return true;
   2821 
   2822     return false;
   2823   }
   2824 
   2825   // unqualified-id:
   2826   //   template-id (already parsed and annotated)
   2827   if (Tok.is(tok::annot_template_id)) {
   2828     TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
   2829 
   2830     // FIXME: Consider passing invalid template-ids on to callers; they may
   2831     // be able to recover better than we can.
   2832     if (TemplateId->isInvalid()) {
   2833       ConsumeAnnotationToken();
   2834       return true;
   2835     }
   2836 
   2837     // If the template-name names the current class, then this is a constructor
   2838     if (AllowConstructorName && TemplateId->Name &&
   2839         Actions.isCurrentClassName(*TemplateId->Name, getCurScope(), &SS)) {
   2840       if (SS.isSet()) {
   2841         // C++ [class.qual]p2 specifies that a qualified template-name
   2842         // is taken as the constructor name where a constructor can be
   2843         // declared. Thus, the template arguments are extraneous, so
   2844         // complain about them and remove them entirely.
   2845         Diag(TemplateId->TemplateNameLoc,
   2846              diag::err_out_of_line_constructor_template_id)
   2847           << TemplateId->Name
   2848           << FixItHint::CreateRemoval(
   2849                     SourceRange(TemplateId->LAngleLoc, TemplateId->RAngleLoc));
   2850         ParsedType Ty = Actions.getConstructorName(
   2851             *TemplateId->Name, TemplateId->TemplateNameLoc, getCurScope(), SS,
   2852             EnteringContext);
   2853         if (!Ty)
   2854           return true;
   2855         Result.setConstructorName(Ty, TemplateId->TemplateNameLoc,
   2856                                   TemplateId->RAngleLoc);
   2857         ConsumeAnnotationToken();
   2858         return false;
   2859       }
   2860 
   2861       Result.setConstructorTemplateId(TemplateId);
   2862       ConsumeAnnotationToken();
   2863       return false;
   2864     }
   2865 
   2866     // We have already parsed a template-id; consume the annotation token as
   2867     // our unqualified-id.
   2868     Result.setTemplateId(TemplateId);
   2869     SourceLocation TemplateLoc = TemplateId->TemplateKWLoc;
   2870     if (TemplateLoc.isValid()) {
   2871       if (TemplateKWLoc && (ObjectType || SS.isSet()))
   2872         *TemplateKWLoc = TemplateLoc;
   2873       else
   2874         Diag(TemplateLoc, diag::err_unexpected_template_in_unqualified_id)
   2875             << FixItHint::CreateRemoval(TemplateLoc);
   2876     }
   2877     ConsumeAnnotationToken();
   2878     return false;
   2879   }
   2880 
   2881   // unqualified-id:
   2882   //   operator-function-id
   2883   //   conversion-function-id
   2884   if (Tok.is(tok::kw_operator)) {
   2885     if (ParseUnqualifiedIdOperator(SS, EnteringContext, ObjectType, Result))
   2886       return true;
   2887 
   2888     // If we have an operator-function-id or a literal-operator-id and the next
   2889     // token is a '<', we may have a
   2890     //
   2891     //   template-id:
   2892     //     operator-function-id < template-argument-list[opt] >
   2893     TemplateTy Template;
   2894     if ((Result.getKind() == UnqualifiedIdKind::IK_OperatorFunctionId ||
   2895          Result.getKind() == UnqualifiedIdKind::IK_LiteralOperatorId) &&
   2896         Tok.is(tok::less))
   2897       return ParseUnqualifiedIdTemplateId(
   2898           SS, ObjectType, ObjectHadErrors,
   2899           TemplateKWLoc ? *TemplateKWLoc : SourceLocation(), nullptr,
   2900           SourceLocation(), EnteringContext, Result, TemplateSpecified);
   2901     else if (TemplateSpecified &&
   2902              Actions.ActOnTemplateName(
   2903                  getCurScope(), SS, *TemplateKWLoc, Result, ObjectType,
   2904                  EnteringContext, Template,
   2905                  /*AllowInjectedClassName*/ true) == TNK_Non_template)
   2906       return true;
   2907 
   2908     return false;
   2909   }
   2910 
   2911   if (getLangOpts().CPlusPlus &&
   2912       (AllowDestructorName || SS.isSet()) && Tok.is(tok::tilde)) {
   2913     // C++ [expr.unary.op]p10:
   2914     //   There is an ambiguity in the unary-expression ~X(), where X is a
   2915     //   class-name. The ambiguity is resolved in favor of treating ~ as a
   2916     //    unary complement rather than treating ~X as referring to a destructor.
   2917 
   2918     // Parse the '~'.
   2919     SourceLocation TildeLoc = ConsumeToken();
   2920 
   2921     if (TemplateSpecified) {
   2922       // C++ [temp.names]p3:
   2923       //   A name prefixed by the keyword template shall be a template-id [...]
   2924       //
   2925       // A template-id cannot begin with a '~' token. This would never work
   2926       // anyway: x.~A<int>() would specify that the destructor is a template,
   2927       // not that 'A' is a template.
   2928       //
   2929       // FIXME: Suggest replacing the attempted destructor name with a correct
   2930       // destructor name and recover. (This is not trivial if this would become
   2931       // a pseudo-destructor name).
   2932       Diag(*TemplateKWLoc, diag::err_unexpected_template_in_destructor_name)
   2933         << Tok.getLocation();
   2934       return true;
   2935     }
   2936 
   2937     if (SS.isEmpty() && Tok.is(tok::kw_decltype)) {
   2938       DeclSpec DS(AttrFactory);
   2939       SourceLocation EndLoc = ParseDecltypeSpecifier(DS);
   2940       if (ParsedType Type =
   2941               Actions.getDestructorTypeForDecltype(DS, ObjectType)) {
   2942         Result.setDestructorName(TildeLoc, Type, EndLoc);
   2943         return false;
   2944       }
   2945       return true;
   2946     }
   2947 
   2948     // Parse the class-name.
   2949     if (Tok.isNot(tok::identifier)) {
   2950       Diag(Tok, diag::err_destructor_tilde_identifier);
   2951       return true;
   2952     }
   2953 
   2954     // If the user wrote ~T::T, correct it to T::~T.
   2955     DeclaratorScopeObj DeclScopeObj(*this, SS);
   2956     if (NextToken().is(tok::coloncolon)) {
   2957       // Don't let ParseOptionalCXXScopeSpecifier() "correct"
   2958       // `int A; struct { ~A::A(); };` to `int A; struct { ~A:A(); };`,
   2959       // it will confuse this recovery logic.
   2960       ColonProtectionRAIIObject ColonRAII(*this, false);
   2961 
   2962       if (SS.isSet()) {
   2963         AnnotateScopeToken(SS, /*NewAnnotation*/true);
   2964         SS.clear();
   2965       }
   2966       if (ParseOptionalCXXScopeSpecifier(SS, ObjectType, ObjectHadErrors,
   2967                                          EnteringContext))
   2968         return true;
   2969       if (SS.isNotEmpty())
   2970         ObjectType = nullptr;
   2971       if (Tok.isNot(tok::identifier) || NextToken().is(tok::coloncolon) ||
   2972           !SS.isSet()) {
   2973         Diag(TildeLoc, diag::err_destructor_tilde_scope);
   2974         return true;
   2975       }
   2976 
   2977       // Recover as if the tilde had been written before the identifier.
   2978       Diag(TildeLoc, diag::err_destructor_tilde_scope)
   2979         << FixItHint::CreateRemoval(TildeLoc)
   2980         << FixItHint::CreateInsertion(Tok.getLocation(), "~");
   2981 
   2982       // Temporarily enter the scope for the rest of this function.
   2983       if (Actions.ShouldEnterDeclaratorScope(getCurScope(), SS))
   2984         DeclScopeObj.EnterDeclaratorScope();
   2985     }
   2986 
   2987     // Parse the class-name (or template-name in a simple-template-id).
   2988     IdentifierInfo *ClassName = Tok.getIdentifierInfo();
   2989     SourceLocation ClassNameLoc = ConsumeToken();
   2990 
   2991     if (Tok.is(tok::less)) {
   2992       Result.setDestructorName(TildeLoc, nullptr, ClassNameLoc);
   2993       return ParseUnqualifiedIdTemplateId(
   2994           SS, ObjectType, ObjectHadErrors,
   2995           TemplateKWLoc ? *TemplateKWLoc : SourceLocation(), ClassName,
   2996           ClassNameLoc, EnteringContext, Result, TemplateSpecified);
   2997     }
   2998 
   2999     // Note that this is a destructor name.
   3000     ParsedType Ty = Actions.getDestructorName(TildeLoc, *ClassName,
   3001                                               ClassNameLoc, getCurScope(),
   3002                                               SS, ObjectType,
   3003                                               EnteringContext);
   3004     if (!Ty)
   3005       return true;
   3006 
   3007     Result.setDestructorName(TildeLoc, Ty, ClassNameLoc);
   3008     return false;
   3009   }
   3010 
   3011   Diag(Tok, diag::err_expected_unqualified_id)
   3012     << getLangOpts().CPlusPlus;
   3013   return true;
   3014 }
   3015 
   3016 /// ParseCXXNewExpression - Parse a C++ new-expression. New is used to allocate
   3017 /// memory in a typesafe manner and call constructors.
   3018 ///
   3019 /// This method is called to parse the new expression after the optional :: has
   3020 /// been already parsed.  If the :: was present, "UseGlobal" is true and "Start"
   3021 /// is its location.  Otherwise, "Start" is the location of the 'new' token.
   3022 ///
   3023 ///        new-expression:
   3024 ///                   '::'[opt] 'new' new-placement[opt] new-type-id
   3025 ///                                     new-initializer[opt]
   3026 ///                   '::'[opt] 'new' new-placement[opt] '(' type-id ')'
   3027 ///                                     new-initializer[opt]
   3028 ///
   3029 ///        new-placement:
   3030 ///                   '(' expression-list ')'
   3031 ///
   3032 ///        new-type-id:
   3033 ///                   type-specifier-seq new-declarator[opt]
   3034 /// [GNU]             attributes type-specifier-seq new-declarator[opt]
   3035 ///
   3036 ///        new-declarator:
   3037 ///                   ptr-operator new-declarator[opt]
   3038 ///                   direct-new-declarator
   3039 ///
   3040 ///        new-initializer:
   3041 ///                   '(' expression-list[opt] ')'
   3042 /// [C++0x]           braced-init-list
   3043 ///
   3044 ExprResult
   3045 Parser::ParseCXXNewExpression(bool UseGlobal, SourceLocation Start) {
   3046   assert(Tok.is(tok::kw_new) && "expected 'new' token");
   3047   ConsumeToken();   // Consume 'new'
   3048 
   3049   // A '(' now can be a new-placement or the '(' wrapping the type-id in the
   3050   // second form of new-expression. It can't be a new-type-id.
   3051 
   3052   ExprVector PlacementArgs;
   3053   SourceLocation PlacementLParen, PlacementRParen;
   3054 
   3055   SourceRange TypeIdParens;
   3056   DeclSpec DS(AttrFactory);
   3057   Declarator DeclaratorInfo(DS, DeclaratorContext::CXXNew);
   3058   if (Tok.is(tok::l_paren)) {
   3059     // If it turns out to be a placement, we change the type location.
   3060     BalancedDelimiterTracker T(*this, tok::l_paren);
   3061     T.consumeOpen();
   3062     PlacementLParen = T.getOpenLocation();
   3063     if (ParseExpressionListOrTypeId(PlacementArgs, DeclaratorInfo)) {
   3064       SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch);
   3065       return ExprError();
   3066     }
   3067 
   3068     T.consumeClose();
   3069     PlacementRParen = T.getCloseLocation();
   3070     if (PlacementRParen.isInvalid()) {
   3071       SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch);
   3072       return ExprError();
   3073     }
   3074 
   3075     if (PlacementArgs.empty()) {
   3076       // Reset the placement locations. There was no placement.
   3077       TypeIdParens = T.getRange();
   3078       PlacementLParen = PlacementRParen = SourceLocation();
   3079     } else {
   3080       // We still need the type.
   3081       if (Tok.is(tok::l_paren)) {
   3082         BalancedDelimiterTracker T(*this, tok::l_paren);
   3083         T.consumeOpen();
   3084         MaybeParseGNUAttributes(DeclaratorInfo);
   3085         ParseSpecifierQualifierList(DS);
   3086         DeclaratorInfo.SetSourceRange(DS.getSourceRange());
   3087         ParseDeclarator(DeclaratorInfo);
   3088         T.consumeClose();
   3089         TypeIdParens = T.getRange();
   3090       } else {
   3091         MaybeParseGNUAttributes(DeclaratorInfo);
   3092         if (ParseCXXTypeSpecifierSeq(DS))
   3093           DeclaratorInfo.setInvalidType(true);
   3094         else {
   3095           DeclaratorInfo.SetSourceRange(DS.getSourceRange());
   3096           ParseDeclaratorInternal(DeclaratorInfo,
   3097                                   &Parser::ParseDirectNewDeclarator);
   3098         }
   3099       }
   3100     }
   3101   } else {
   3102     // A new-type-id is a simplified type-id, where essentially the
   3103     // direct-declarator is replaced by a direct-new-declarator.
   3104     MaybeParseGNUAttributes(DeclaratorInfo);
   3105     if (ParseCXXTypeSpecifierSeq(DS))
   3106       DeclaratorInfo.setInvalidType(true);
   3107     else {
   3108       DeclaratorInfo.SetSourceRange(DS.getSourceRange());
   3109       ParseDeclaratorInternal(DeclaratorInfo,
   3110                               &Parser::ParseDirectNewDeclarator);
   3111     }
   3112   }
   3113   if (DeclaratorInfo.isInvalidType()) {
   3114     SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch);
   3115     return ExprError();
   3116   }
   3117 
   3118   ExprResult Initializer;
   3119 
   3120   if (Tok.is(tok::l_paren)) {
   3121     SourceLocation ConstructorLParen, ConstructorRParen;
   3122     ExprVector ConstructorArgs;
   3123     BalancedDelimiterTracker T(*this, tok::l_paren);
   3124     T.consumeOpen();
   3125     ConstructorLParen = T.getOpenLocation();
   3126     if (Tok.isNot(tok::r_paren)) {
   3127       CommaLocsTy CommaLocs;
   3128       auto RunSignatureHelp = [&]() {
   3129         ParsedType TypeRep =
   3130             Actions.ActOnTypeName(getCurScope(), DeclaratorInfo).get();
   3131         QualType PreferredType;
   3132         // ActOnTypeName might adjust DeclaratorInfo and return a null type even
   3133         // the passing DeclaratorInfo is valid, e.g. running SignatureHelp on
   3134         // `new decltype(invalid) (^)`.
   3135         if (TypeRep)
   3136           PreferredType = Actions.ProduceConstructorSignatureHelp(
   3137               getCurScope(), TypeRep.get()->getCanonicalTypeInternal(),
   3138               DeclaratorInfo.getEndLoc(), ConstructorArgs, ConstructorLParen);
   3139         CalledSignatureHelp = true;
   3140         return PreferredType;
   3141       };
   3142       if (ParseExpressionList(ConstructorArgs, CommaLocs, [&] {
   3143             PreferredType.enterFunctionArgument(Tok.getLocation(),
   3144                                                 RunSignatureHelp);
   3145           })) {
   3146         if (PP.isCodeCompletionReached() && !CalledSignatureHelp)
   3147           RunSignatureHelp();
   3148         SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch);
   3149         return ExprError();
   3150       }
   3151     }
   3152     T.consumeClose();
   3153     ConstructorRParen = T.getCloseLocation();
   3154     if (ConstructorRParen.isInvalid()) {
   3155       SkipUntil(tok::semi, StopAtSemi | StopBeforeMatch);
   3156       return ExprError();
   3157     }
   3158     Initializer = Actions.ActOnParenListExpr(ConstructorLParen,
   3159                                              ConstructorRParen,
   3160                                              ConstructorArgs);
   3161   } else if (Tok.is(tok::l_brace) && getLangOpts().CPlusPlus11) {
   3162     Diag(Tok.getLocation(),
   3163          diag::warn_cxx98_compat_generalized_initializer_lists);
   3164     Initializer = ParseBraceInitializer();
   3165   }
   3166   if (Initializer.isInvalid())
   3167     return Initializer;
   3168 
   3169   return Actions.ActOnCXXNew(Start, UseGlobal, PlacementLParen,
   3170                              PlacementArgs, PlacementRParen,
   3171                              TypeIdParens, DeclaratorInfo, Initializer.get());
   3172 }
   3173 
   3174 /// ParseDirectNewDeclarator - Parses a direct-new-declarator. Intended to be
   3175 /// passed to ParseDeclaratorInternal.
   3176 ///
   3177 ///        direct-new-declarator:
   3178 ///                   '[' expression[opt] ']'
   3179 ///                   direct-new-declarator '[' constant-expression ']'
   3180 ///
   3181 void Parser::ParseDirectNewDeclarator(Declarator &D) {
   3182   // Parse the array dimensions.
   3183   bool First = true;
   3184   while (Tok.is(tok::l_square)) {
   3185     // An array-size expression can't start with a lambda.
   3186     if (CheckProhibitedCXX11Attribute())
   3187       continue;
   3188 
   3189     BalancedDelimiterTracker T(*this, tok::l_square);
   3190     T.consumeOpen();
   3191 
   3192     ExprResult Size =
   3193         First ? (Tok.is(tok::r_square) ? ExprResult() : ParseExpression())
   3194               : ParseConstantExpression();
   3195     if (Size.isInvalid()) {
   3196       // Recover
   3197       SkipUntil(tok::r_square, StopAtSemi);
   3198       return;
   3199     }
   3200     First = false;
   3201 
   3202     T.consumeClose();
   3203 
   3204     // Attributes here appertain to the array type. C++11 [expr.new]p5.
   3205     ParsedAttributes Attrs(AttrFactory);
   3206     MaybeParseCXX11Attributes(Attrs);
   3207 
   3208     D.AddTypeInfo(DeclaratorChunk::getArray(0,
   3209                                             /*isStatic=*/false, /*isStar=*/false,
   3210                                             Size.get(), T.getOpenLocation(),
   3211                                             T.getCloseLocation()),
   3212                   std::move(Attrs), T.getCloseLocation());
   3213 
   3214     if (T.getCloseLocation().isInvalid())
   3215       return;
   3216   }
   3217 }
   3218 
   3219 /// ParseExpressionListOrTypeId - Parse either an expression-list or a type-id.
   3220 /// This ambiguity appears in the syntax of the C++ new operator.
   3221 ///
   3222 ///        new-expression:
   3223 ///                   '::'[opt] 'new' new-placement[opt] '(' type-id ')'
   3224 ///                                     new-initializer[opt]
   3225 ///
   3226 ///        new-placement:
   3227 ///                   '(' expression-list ')'
   3228 ///
   3229 bool Parser::ParseExpressionListOrTypeId(
   3230                                    SmallVectorImpl<Expr*> &PlacementArgs,
   3231                                          Declarator &D) {
   3232   // The '(' was already consumed.
   3233   if (isTypeIdInParens()) {
   3234     ParseSpecifierQualifierList(D.getMutableDeclSpec());
   3235     D.SetSourceRange(D.getDeclSpec().getSourceRange());
   3236     ParseDeclarator(D);
   3237     return D.isInvalidType();
   3238   }
   3239 
   3240   // It's not a type, it has to be an expression list.
   3241   // Discard the comma locations - ActOnCXXNew has enough parameters.
   3242   CommaLocsTy CommaLocs;
   3243   return ParseExpressionList(PlacementArgs, CommaLocs);
   3244 }
   3245 
   3246 /// ParseCXXDeleteExpression - Parse a C++ delete-expression. Delete is used
   3247 /// to free memory allocated by new.
   3248 ///
   3249 /// This method is called to parse the 'delete' expression after the optional
   3250 /// '::' has been already parsed.  If the '::' was present, "UseGlobal" is true
   3251 /// and "Start" is its location.  Otherwise, "Start" is the location of the
   3252 /// 'delete' token.
   3253 ///
   3254 ///        delete-expression:
   3255 ///                   '::'[opt] 'delete' cast-expression
   3256 ///                   '::'[opt] 'delete' '[' ']' cast-expression
   3257 ExprResult
   3258 Parser::ParseCXXDeleteExpression(bool UseGlobal, SourceLocation Start) {
   3259   assert(Tok.is(tok::kw_delete) && "Expected 'delete' keyword");
   3260   ConsumeToken(); // Consume 'delete'
   3261 
   3262   // Array delete?
   3263   bool ArrayDelete = false;
   3264   if (Tok.is(tok::l_square) && NextToken().is(tok::r_square)) {
   3265     // C++11 [expr.delete]p1:
   3266     //   Whenever the delete keyword is followed by empty square brackets, it
   3267     //   shall be interpreted as [array delete].
   3268     //   [Footnote: A lambda expression with a lambda-introducer that consists
   3269     //              of empty square brackets can follow the delete keyword if
   3270     //              the lambda expression is enclosed in parentheses.]
   3271 
   3272     const Token Next = GetLookAheadToken(2);
   3273 
   3274     // Basic lookahead to check if we have a lambda expression.
   3275     if (Next.isOneOf(tok::l_brace, tok::less) ||
   3276         (Next.is(tok::l_paren) &&
   3277          (GetLookAheadToken(3).is(tok::r_paren) ||
   3278           (GetLookAheadToken(3).is(tok::identifier) &&
   3279            GetLookAheadToken(4).is(tok::identifier))))) {
   3280       TentativeParsingAction TPA(*this);
   3281       SourceLocation LSquareLoc = Tok.getLocation();
   3282       SourceLocation RSquareLoc = NextToken().getLocation();
   3283 
   3284       // SkipUntil can't skip pairs of </*...*/>; don't emit a FixIt in this
   3285       // case.
   3286       SkipUntil({tok::l_brace, tok::less}, StopBeforeMatch);
   3287       SourceLocation RBraceLoc;
   3288       bool EmitFixIt = false;
   3289       if (Tok.is(tok::l_brace)) {
   3290         ConsumeBrace();
   3291         SkipUntil(tok::r_brace, StopBeforeMatch);
   3292         RBraceLoc = Tok.getLocation();
   3293         EmitFixIt = true;
   3294       }
   3295 
   3296       TPA.Revert();
   3297 
   3298       if (EmitFixIt)
   3299         Diag(Start, diag::err_lambda_after_delete)
   3300             << SourceRange(Start, RSquareLoc)
   3301             << FixItHint::CreateInsertion(LSquareLoc, "(")
   3302             << FixItHint::CreateInsertion(
   3303                    Lexer::getLocForEndOfToken(
   3304                        RBraceLoc, 0, Actions.getSourceManager(), getLangOpts()),
   3305                    ")");
   3306       else
   3307         Diag(Start, diag::err_lambda_after_delete)
   3308             << SourceRange(Start, RSquareLoc);
   3309 
   3310       // Warn that the non-capturing lambda isn't surrounded by parentheses
   3311       // to disambiguate it from 'delete[]'.
   3312       ExprResult Lambda = ParseLambdaExpression();
   3313       if (Lambda.isInvalid())
   3314         return ExprError();
   3315 
   3316       // Evaluate any postfix expressions used on the lambda.
   3317       Lambda = ParsePostfixExpressionSuffix(Lambda);
   3318       if (Lambda.isInvalid())
   3319         return ExprError();
   3320       return Actions.ActOnCXXDelete(Start, UseGlobal, /*ArrayForm=*/false,
   3321                                     Lambda.get());
   3322     }
   3323 
   3324     ArrayDelete = true;
   3325     BalancedDelimiterTracker T(*this, tok::l_square);
   3326 
   3327     T.consumeOpen();
   3328     T.consumeClose();
   3329     if (T.getCloseLocation().isInvalid())
   3330       return ExprError();
   3331   }
   3332 
   3333   ExprResult Operand(ParseCastExpression(AnyCastExpr));
   3334   if (Operand.isInvalid())
   3335     return Operand;
   3336 
   3337   return Actions.ActOnCXXDelete(Start, UseGlobal, ArrayDelete, Operand.get());
   3338 }
   3339 
   3340 /// ParseRequiresExpression - Parse a C++2a requires-expression.
   3341 /// C++2a [expr.prim.req]p1
   3342 ///     A requires-expression provides a concise way to express requirements on
   3343 ///     template arguments. A requirement is one that can be checked by name
   3344 ///     lookup (6.4) or by checking properties of types and expressions.
   3345 ///
   3346 ///     requires-expression:
   3347 ///         'requires' requirement-parameter-list[opt] requirement-body
   3348 ///
   3349 ///     requirement-parameter-list:
   3350 ///         '(' parameter-declaration-clause[opt] ')'
   3351 ///
   3352 ///     requirement-body:
   3353 ///         '{' requirement-seq '}'
   3354 ///
   3355 ///     requirement-seq:
   3356 ///         requirement
   3357 ///         requirement-seq requirement
   3358 ///
   3359 ///     requirement:
   3360 ///         simple-requirement
   3361 ///         type-requirement
   3362 ///         compound-requirement
   3363 ///         nested-requirement
   3364 ExprResult Parser::ParseRequiresExpression() {
   3365   assert(Tok.is(tok::kw_requires) && "Expected 'requires' keyword");
   3366   SourceLocation RequiresKWLoc = ConsumeToken(); // Consume 'requires'
   3367 
   3368   llvm::SmallVector<ParmVarDecl *, 2> LocalParameterDecls;
   3369   if (Tok.is(tok::l_paren)) {
   3370     // requirement parameter list is present.
   3371     ParseScope LocalParametersScope(this, Scope::FunctionPrototypeScope |
   3372                                     Scope::DeclScope);
   3373     BalancedDelimiterTracker Parens(*this, tok::l_paren);
   3374     Parens.consumeOpen();
   3375     if (!Tok.is(tok::r_paren)) {
   3376       ParsedAttributes FirstArgAttrs(getAttrFactory());
   3377       SourceLocation EllipsisLoc;
   3378       llvm::SmallVector<DeclaratorChunk::ParamInfo, 2> LocalParameters;
   3379       ParseParameterDeclarationClause(DeclaratorContext::RequiresExpr,
   3380                                       FirstArgAttrs, LocalParameters,
   3381                                       EllipsisLoc);
   3382       if (EllipsisLoc.isValid())
   3383         Diag(EllipsisLoc, diag::err_requires_expr_parameter_list_ellipsis);
   3384       for (auto &ParamInfo : LocalParameters)
   3385         LocalParameterDecls.push_back(cast<ParmVarDecl>(ParamInfo.Param));
   3386     }
   3387     Parens.consumeClose();
   3388   }
   3389 
   3390   BalancedDelimiterTracker Braces(*this, tok::l_brace);
   3391   if (Braces.expectAndConsume())
   3392     return ExprError();
   3393 
   3394   // Start of requirement list
   3395   llvm::SmallVector<concepts::Requirement *, 2> Requirements;
   3396 
   3397   // C++2a [expr.prim.req]p2
   3398   //   Expressions appearing within a requirement-body are unevaluated operands.
   3399   EnterExpressionEvaluationContext Ctx(
   3400       Actions, Sema::ExpressionEvaluationContext::Unevaluated);
   3401 
   3402   ParseScope BodyScope(this, Scope::DeclScope);
   3403   RequiresExprBodyDecl *Body = Actions.ActOnStartRequiresExpr(
   3404       RequiresKWLoc, LocalParameterDecls, getCurScope());
   3405 
   3406   if (Tok.is(tok::r_brace)) {
   3407     // Grammar does not allow an empty body.
   3408     // requirement-body:
   3409     //   { requirement-seq }
   3410     // requirement-seq:
   3411     //   requirement
   3412     //   requirement-seq requirement
   3413     Diag(Tok, diag::err_empty_requires_expr);
   3414     // Continue anyway and produce a requires expr with no requirements.
   3415   } else {
   3416     while (!Tok.is(tok::r_brace)) {
   3417       switch (Tok.getKind()) {
   3418       case tok::l_brace: {
   3419         // Compound requirement
   3420         // C++ [expr.prim.req.compound]
   3421         //     compound-requirement:
   3422         //         '{' expression '}' 'noexcept'[opt]
   3423         //             return-type-requirement[opt] ';'
   3424         //     return-type-requirement:
   3425         //         trailing-return-type
   3426         //         '->' cv-qualifier-seq[opt] constrained-parameter
   3427         //             cv-qualifier-seq[opt] abstract-declarator[opt]
   3428         BalancedDelimiterTracker ExprBraces(*this, tok::l_brace);
   3429         ExprBraces.consumeOpen();
   3430         ExprResult Expression =
   3431             Actions.CorrectDelayedTyposInExpr(ParseExpression());
   3432         if (!Expression.isUsable()) {
   3433           ExprBraces.skipToEnd();
   3434           SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch);
   3435           break;
   3436         }
   3437         if (ExprBraces.consumeClose())
   3438           ExprBraces.skipToEnd();
   3439 
   3440         concepts::Requirement *Req = nullptr;
   3441         SourceLocation NoexceptLoc;
   3442         TryConsumeToken(tok::kw_noexcept, NoexceptLoc);
   3443         if (Tok.is(tok::semi)) {
   3444           Req = Actions.ActOnCompoundRequirement(Expression.get(), NoexceptLoc);
   3445           if (Req)
   3446             Requirements.push_back(Req);
   3447           break;
   3448         }
   3449         if (!TryConsumeToken(tok::arrow))
   3450           // User probably forgot the arrow, remind them and try to continue.
   3451           Diag(Tok, diag::err_requires_expr_missing_arrow)
   3452               << FixItHint::CreateInsertion(Tok.getLocation(), "->");
   3453         // Try to parse a 'type-constraint'
   3454         if (TryAnnotateTypeConstraint()) {
   3455           SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch);
   3456           break;
   3457         }
   3458         if (!isTypeConstraintAnnotation()) {
   3459           Diag(Tok, diag::err_requires_expr_expected_type_constraint);
   3460           SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch);
   3461           break;
   3462         }
   3463         CXXScopeSpec SS;
   3464         if (Tok.is(tok::annot_cxxscope)) {
   3465           Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(),
   3466                                                        Tok.getAnnotationRange(),
   3467                                                        SS);
   3468           ConsumeAnnotationToken();
   3469         }
   3470 
   3471         Req = Actions.ActOnCompoundRequirement(
   3472             Expression.get(), NoexceptLoc, SS, takeTemplateIdAnnotation(Tok),
   3473             TemplateParameterDepth);
   3474         ConsumeAnnotationToken();
   3475         if (Req)
   3476           Requirements.push_back(Req);
   3477         break;
   3478       }
   3479       default: {
   3480         bool PossibleRequiresExprInSimpleRequirement = false;
   3481         if (Tok.is(tok::kw_requires)) {
   3482           auto IsNestedRequirement = [&] {
   3483             RevertingTentativeParsingAction TPA(*this);
   3484             ConsumeToken(); // 'requires'
   3485             if (Tok.is(tok::l_brace))
   3486               // This is a requires expression
   3487               // requires (T t) {
   3488               //   requires { t++; };
   3489               //   ...      ^
   3490               // }
   3491               return false;
   3492             if (Tok.is(tok::l_paren)) {
   3493               // This might be the parameter list of a requires expression
   3494               ConsumeParen();
   3495               auto Res = TryParseParameterDeclarationClause();
   3496               if (Res != TPResult::False) {
   3497                 // Skip to the closing parenthesis
   3498                 // FIXME: Don't traverse these tokens twice (here and in
   3499                 //  TryParseParameterDeclarationClause).
   3500                 unsigned Depth = 1;
   3501                 while (Depth != 0) {
   3502                   if (Tok.is(tok::l_paren))
   3503                     Depth++;
   3504                   else if (Tok.is(tok::r_paren))
   3505                     Depth--;
   3506                   ConsumeAnyToken();
   3507                 }
   3508                 // requires (T t) {
   3509                 //   requires () ?
   3510                 //   ...         ^
   3511                 //   - OR -
   3512                 //   requires (int x) ?
   3513                 //   ...              ^
   3514                 // }
   3515                 if (Tok.is(tok::l_brace))
   3516                   // requires (...) {
   3517                   //                ^ - a requires expression as a
   3518                   //                    simple-requirement.
   3519                   return false;
   3520               }
   3521             }
   3522             return true;
   3523           };
   3524           if (IsNestedRequirement()) {
   3525             ConsumeToken();
   3526             // Nested requirement
   3527             // C++ [expr.prim.req.nested]
   3528             //     nested-requirement:
   3529             //         'requires' constraint-expression ';'
   3530             ExprResult ConstraintExpr =
   3531                 Actions.CorrectDelayedTyposInExpr(ParseConstraintExpression());
   3532             if (ConstraintExpr.isInvalid() || !ConstraintExpr.isUsable()) {
   3533               SkipUntil(tok::semi, tok::r_brace,
   3534                         SkipUntilFlags::StopBeforeMatch);
   3535               break;
   3536             }
   3537             if (auto *Req =
   3538                     Actions.ActOnNestedRequirement(ConstraintExpr.get()))
   3539               Requirements.push_back(Req);
   3540             else {
   3541               SkipUntil(tok::semi, tok::r_brace,
   3542                         SkipUntilFlags::StopBeforeMatch);
   3543               break;
   3544             }
   3545             break;
   3546           } else
   3547             PossibleRequiresExprInSimpleRequirement = true;
   3548         } else if (Tok.is(tok::kw_typename)) {
   3549           // This might be 'typename T::value_type;' (a type requirement) or
   3550           // 'typename T::value_type{};' (a simple requirement).
   3551           TentativeParsingAction TPA(*this);
   3552 
   3553           // We need to consume the typename to allow 'requires { typename a; }'
   3554           SourceLocation TypenameKWLoc = ConsumeToken();
   3555           if (TryAnnotateCXXScopeToken()) {
   3556             TPA.Commit();
   3557             SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch);
   3558             break;
   3559           }
   3560           CXXScopeSpec SS;
   3561           if (Tok.is(tok::annot_cxxscope)) {
   3562             Actions.RestoreNestedNameSpecifierAnnotation(
   3563                 Tok.getAnnotationValue(), Tok.getAnnotationRange(), SS);
   3564             ConsumeAnnotationToken();
   3565           }
   3566 
   3567           if (Tok.isOneOf(tok::identifier, tok::annot_template_id) &&
   3568               !NextToken().isOneOf(tok::l_brace, tok::l_paren)) {
   3569             TPA.Commit();
   3570             SourceLocation NameLoc = Tok.getLocation();
   3571             IdentifierInfo *II = nullptr;
   3572             TemplateIdAnnotation *TemplateId = nullptr;
   3573             if (Tok.is(tok::identifier)) {
   3574               II = Tok.getIdentifierInfo();
   3575               ConsumeToken();
   3576             } else {
   3577               TemplateId = takeTemplateIdAnnotation(Tok);
   3578               ConsumeAnnotationToken();
   3579               if (TemplateId->isInvalid())
   3580                 break;
   3581             }
   3582 
   3583             if (auto *Req = Actions.ActOnTypeRequirement(TypenameKWLoc, SS,
   3584                                                          NameLoc, II,
   3585                                                          TemplateId)) {
   3586               Requirements.push_back(Req);
   3587             }
   3588             break;
   3589           }
   3590           TPA.Revert();
   3591         }
   3592         // Simple requirement
   3593         // C++ [expr.prim.req.simple]
   3594         //     simple-requirement:
   3595         //         expression ';'
   3596         SourceLocation StartLoc = Tok.getLocation();
   3597         ExprResult Expression =
   3598             Actions.CorrectDelayedTyposInExpr(ParseExpression());
   3599         if (!Expression.isUsable()) {
   3600           SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch);
   3601           break;
   3602         }
   3603         if (!Expression.isInvalid() && PossibleRequiresExprInSimpleRequirement)
   3604           Diag(StartLoc, diag::warn_requires_expr_in_simple_requirement)
   3605               << FixItHint::CreateInsertion(StartLoc, "requires");
   3606         if (auto *Req = Actions.ActOnSimpleRequirement(Expression.get()))
   3607           Requirements.push_back(Req);
   3608         else {
   3609           SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch);
   3610           break;
   3611         }
   3612         // User may have tried to put some compound requirement stuff here
   3613         if (Tok.is(tok::kw_noexcept)) {
   3614           Diag(Tok, diag::err_requires_expr_simple_requirement_noexcept)
   3615               << FixItHint::CreateInsertion(StartLoc, "{")
   3616               << FixItHint::CreateInsertion(Tok.getLocation(), "}");
   3617           SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch);
   3618           break;
   3619         }
   3620         break;
   3621       }
   3622       }
   3623       if (ExpectAndConsumeSemi(diag::err_expected_semi_requirement)) {
   3624         SkipUntil(tok::semi, tok::r_brace, SkipUntilFlags::StopBeforeMatch);
   3625         TryConsumeToken(tok::semi);
   3626         break;
   3627       }
   3628     }
   3629     if (Requirements.empty()) {
   3630       // Don't emit an empty requires expr here to avoid confusing the user with
   3631       // other diagnostics quoting an empty requires expression they never
   3632       // wrote.
   3633       Braces.consumeClose();
   3634       Actions.ActOnFinishRequiresExpr();
   3635       return ExprError();
   3636     }
   3637   }
   3638   Braces.consumeClose();
   3639   Actions.ActOnFinishRequiresExpr();
   3640   return Actions.ActOnRequiresExpr(RequiresKWLoc, Body, LocalParameterDecls,
   3641                                    Requirements, Braces.getCloseLocation());
   3642 }
   3643 
   3644 static TypeTrait TypeTraitFromTokKind(tok::TokenKind kind) {
   3645   switch (kind) {
   3646   default: llvm_unreachable("Not a known type trait");
   3647 #define TYPE_TRAIT_1(Spelling, Name, Key) \
   3648 case tok::kw_ ## Spelling: return UTT_ ## Name;
   3649 #define TYPE_TRAIT_2(Spelling, Name, Key) \
   3650 case tok::kw_ ## Spelling: return BTT_ ## Name;
   3651 #include "clang/Basic/TokenKinds.def"
   3652 #define TYPE_TRAIT_N(Spelling, Name, Key) \
   3653   case tok::kw_ ## Spelling: return TT_ ## Name;
   3654 #include "clang/Basic/TokenKinds.def"
   3655   }
   3656 }
   3657 
   3658 static ArrayTypeTrait ArrayTypeTraitFromTokKind(tok::TokenKind kind) {
   3659   switch (kind) {
   3660   default:
   3661     llvm_unreachable("Not a known array type trait");
   3662 #define ARRAY_TYPE_TRAIT(Spelling, Name, Key)                                  \
   3663   case tok::kw_##Spelling:                                                     \
   3664     return ATT_##Name;
   3665 #include "clang/Basic/TokenKinds.def"
   3666   }
   3667 }
   3668 
   3669 static ExpressionTrait ExpressionTraitFromTokKind(tok::TokenKind kind) {
   3670   switch (kind) {
   3671   default:
   3672     llvm_unreachable("Not a known unary expression trait.");
   3673 #define EXPRESSION_TRAIT(Spelling, Name, Key)                                  \
   3674   case tok::kw_##Spelling:                                                     \
   3675     return ET_##Name;
   3676 #include "clang/Basic/TokenKinds.def"
   3677   }
   3678 }
   3679 
   3680 static unsigned TypeTraitArity(tok::TokenKind kind) {
   3681   switch (kind) {
   3682     default: llvm_unreachable("Not a known type trait");
   3683 #define TYPE_TRAIT(N,Spelling,K) case tok::kw_##Spelling: return N;
   3684 #include "clang/Basic/TokenKinds.def"
   3685   }
   3686 }
   3687 
   3688 /// Parse the built-in type-trait pseudo-functions that allow
   3689 /// implementation of the TR1/C++11 type traits templates.
   3690 ///
   3691 ///       primary-expression:
   3692 ///          unary-type-trait '(' type-id ')'
   3693 ///          binary-type-trait '(' type-id ',' type-id ')'
   3694 ///          type-trait '(' type-id-seq ')'
   3695 ///
   3696 ///       type-id-seq:
   3697 ///          type-id ...[opt] type-id-seq[opt]
   3698 ///
   3699 ExprResult Parser::ParseTypeTrait() {
   3700   tok::TokenKind Kind = Tok.getKind();
   3701   unsigned Arity = TypeTraitArity(Kind);
   3702 
   3703   SourceLocation Loc = ConsumeToken();
   3704 
   3705   BalancedDelimiterTracker Parens(*this, tok::l_paren);
   3706   if (Parens.expectAndConsume())
   3707     return ExprError();
   3708 
   3709   SmallVector<ParsedType, 2> Args;
   3710   do {
   3711     // Parse the next type.
   3712     TypeResult Ty = ParseTypeName();
   3713     if (Ty.isInvalid()) {
   3714       Parens.skipToEnd();
   3715       return ExprError();
   3716     }
   3717 
   3718     // Parse the ellipsis, if present.
   3719     if (Tok.is(tok::ellipsis)) {
   3720       Ty = Actions.ActOnPackExpansion(Ty.get(), ConsumeToken());
   3721       if (Ty.isInvalid()) {
   3722         Parens.skipToEnd();
   3723         return ExprError();
   3724       }
   3725     }
   3726 
   3727     // Add this type to the list of arguments.
   3728     Args.push_back(Ty.get());
   3729   } while (TryConsumeToken(tok::comma));
   3730 
   3731   if (Parens.consumeClose())
   3732     return ExprError();
   3733 
   3734   SourceLocation EndLoc = Parens.getCloseLocation();
   3735 
   3736   if (Arity && Args.size() != Arity) {
   3737     Diag(EndLoc, diag::err_type_trait_arity)
   3738       << Arity << 0 << (Arity > 1) << (int)Args.size() << SourceRange(Loc);
   3739     return ExprError();
   3740   }
   3741 
   3742   if (!Arity && Args.empty()) {
   3743     Diag(EndLoc, diag::err_type_trait_arity)
   3744       << 1 << 1 << 1 << (int)Args.size() << SourceRange(Loc);
   3745     return ExprError();
   3746   }
   3747 
   3748   return Actions.ActOnTypeTrait(TypeTraitFromTokKind(Kind), Loc, Args, EndLoc);
   3749 }
   3750 
   3751 /// ParseArrayTypeTrait - Parse the built-in array type-trait
   3752 /// pseudo-functions.
   3753 ///
   3754 ///       primary-expression:
   3755 /// [Embarcadero]     '__array_rank' '(' type-id ')'
   3756 /// [Embarcadero]     '__array_extent' '(' type-id ',' expression ')'
   3757 ///
   3758 ExprResult Parser::ParseArrayTypeTrait() {
   3759   ArrayTypeTrait ATT = ArrayTypeTraitFromTokKind(Tok.getKind());
   3760   SourceLocation Loc = ConsumeToken();
   3761 
   3762   BalancedDelimiterTracker T(*this, tok::l_paren);
   3763   if (T.expectAndConsume())
   3764     return ExprError();
   3765 
   3766   TypeResult Ty = ParseTypeName();
   3767   if (Ty.isInvalid()) {
   3768     SkipUntil(tok::comma, StopAtSemi);
   3769     SkipUntil(tok::r_paren, StopAtSemi);
   3770     return ExprError();
   3771   }
   3772 
   3773   switch (ATT) {
   3774   case ATT_ArrayRank: {
   3775     T.consumeClose();
   3776     return Actions.ActOnArrayTypeTrait(ATT, Loc, Ty.get(), nullptr,
   3777                                        T.getCloseLocation());
   3778   }
   3779   case ATT_ArrayExtent: {
   3780     if (ExpectAndConsume(tok::comma)) {
   3781       SkipUntil(tok::r_paren, StopAtSemi);
   3782       return ExprError();
   3783     }
   3784 
   3785     ExprResult DimExpr = ParseExpression();
   3786     T.consumeClose();
   3787 
   3788     return Actions.ActOnArrayTypeTrait(ATT, Loc, Ty.get(), DimExpr.get(),
   3789                                        T.getCloseLocation());
   3790   }
   3791   }
   3792   llvm_unreachable("Invalid ArrayTypeTrait!");
   3793 }
   3794 
   3795 /// ParseExpressionTrait - Parse built-in expression-trait
   3796 /// pseudo-functions like __is_lvalue_expr( xxx ).
   3797 ///
   3798 ///       primary-expression:
   3799 /// [Embarcadero]     expression-trait '(' expression ')'
   3800 ///
   3801 ExprResult Parser::ParseExpressionTrait() {
   3802   ExpressionTrait ET = ExpressionTraitFromTokKind(Tok.getKind());
   3803   SourceLocation Loc = ConsumeToken();
   3804 
   3805   BalancedDelimiterTracker T(*this, tok::l_paren);
   3806   if (T.expectAndConsume())
   3807     return ExprError();
   3808 
   3809   ExprResult Expr = ParseExpression();
   3810 
   3811   T.consumeClose();
   3812 
   3813   return Actions.ActOnExpressionTrait(ET, Loc, Expr.get(),
   3814                                       T.getCloseLocation());
   3815 }
   3816 
   3817 
   3818 /// ParseCXXAmbiguousParenExpression - We have parsed the left paren of a
   3819 /// parenthesized ambiguous type-id. This uses tentative parsing to disambiguate
   3820 /// based on the context past the parens.
   3821 ExprResult
   3822 Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType,
   3823                                          ParsedType &CastTy,
   3824                                          BalancedDelimiterTracker &Tracker,
   3825                                          ColonProtectionRAIIObject &ColonProt) {
   3826   assert(getLangOpts().CPlusPlus && "Should only be called for C++!");
   3827   assert(ExprType == CastExpr && "Compound literals are not ambiguous!");
   3828   assert(isTypeIdInParens() && "Not a type-id!");
   3829 
   3830   ExprResult Result(true);
   3831   CastTy = nullptr;
   3832 
   3833   // We need to disambiguate a very ugly part of the C++ syntax:
   3834   //
   3835   // (T())x;  - type-id
   3836   // (T())*x; - type-id
   3837   // (T())/x; - expression
   3838   // (T());   - expression
   3839   //
   3840   // The bad news is that we cannot use the specialized tentative parser, since
   3841   // it can only verify that the thing inside the parens can be parsed as
   3842   // type-id, it is not useful for determining the context past the parens.
   3843   //
   3844   // The good news is that the parser can disambiguate this part without
   3845   // making any unnecessary Action calls.
   3846   //
   3847   // It uses a scheme similar to parsing inline methods. The parenthesized
   3848   // tokens are cached, the context that follows is determined (possibly by
   3849   // parsing a cast-expression), and then we re-introduce the cached tokens
   3850   // into the token stream and parse them appropriately.
   3851 
   3852   ParenParseOption ParseAs;
   3853   CachedTokens Toks;
   3854 
   3855   // Store the tokens of the parentheses. We will parse them after we determine
   3856   // the context that follows them.
   3857   if (!ConsumeAndStoreUntil(tok::r_paren, Toks)) {
   3858     // We didn't find the ')' we expected.
   3859     Tracker.consumeClose();
   3860     return ExprError();
   3861   }
   3862 
   3863   if (Tok.is(tok::l_brace)) {
   3864     ParseAs = CompoundLiteral;
   3865   } else {
   3866     bool NotCastExpr;
   3867     if (Tok.is(tok::l_paren) && NextToken().is(tok::r_paren)) {
   3868       NotCastExpr = true;
   3869     } else {
   3870       // Try parsing the cast-expression that may follow.
   3871       // If it is not a cast-expression, NotCastExpr will be true and no token
   3872       // will be consumed.
   3873       ColonProt.restore();
   3874       Result = ParseCastExpression(AnyCastExpr,
   3875                                    false/*isAddressofOperand*/,
   3876                                    NotCastExpr,
   3877                                    // type-id has priority.
   3878                                    IsTypeCast);
   3879     }
   3880 
   3881     // If we parsed a cast-expression, it's really a type-id, otherwise it's
   3882     // an expression.
   3883     ParseAs = NotCastExpr ? SimpleExpr : CastExpr;
   3884   }
   3885 
   3886   // Create a fake EOF to mark end of Toks buffer.
   3887   Token AttrEnd;
   3888   AttrEnd.startToken();
   3889   AttrEnd.setKind(tok::eof);
   3890   AttrEnd.setLocation(Tok.getLocation());
   3891   AttrEnd.setEofData(Toks.data());
   3892   Toks.push_back(AttrEnd);
   3893 
   3894   // The current token should go after the cached tokens.
   3895   Toks.push_back(Tok);
   3896   // Re-enter the stored parenthesized tokens into the token stream, so we may
   3897   // parse them now.
   3898   PP.EnterTokenStream(Toks, /*DisableMacroExpansion*/ true,
   3899                       /*IsReinject*/ true);
   3900   // Drop the current token and bring the first cached one. It's the same token
   3901   // as when we entered this function.
   3902   ConsumeAnyToken();
   3903 
   3904   if (ParseAs >= CompoundLiteral) {
   3905     // Parse the type declarator.
   3906     DeclSpec DS(AttrFactory);
   3907     Declarator DeclaratorInfo(DS, DeclaratorContext::TypeName);
   3908     {
   3909       ColonProtectionRAIIObject InnerColonProtection(*this);
   3910       ParseSpecifierQualifierList(DS);
   3911       ParseDeclarator(DeclaratorInfo);
   3912     }
   3913 
   3914     // Match the ')'.
   3915     Tracker.consumeClose();
   3916     ColonProt.restore();
   3917 
   3918     // Consume EOF marker for Toks buffer.
   3919     assert(Tok.is(tok::eof) && Tok.getEofData() == AttrEnd.getEofData());
   3920     ConsumeAnyToken();
   3921 
   3922     if (ParseAs == CompoundLiteral) {
   3923       ExprType = CompoundLiteral;
   3924       if (DeclaratorInfo.isInvalidType())
   3925         return ExprError();
   3926 
   3927       TypeResult Ty = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
   3928       return ParseCompoundLiteralExpression(Ty.get(),
   3929                                             Tracker.getOpenLocation(),
   3930                                             Tracker.getCloseLocation());
   3931     }
   3932 
   3933     // We parsed '(' type-id ')' and the thing after it wasn't a '{'.
   3934     assert(ParseAs == CastExpr);
   3935 
   3936     if (DeclaratorInfo.isInvalidType())
   3937       return ExprError();
   3938 
   3939     // Result is what ParseCastExpression returned earlier.
   3940     if (!Result.isInvalid())
   3941       Result = Actions.ActOnCastExpr(getCurScope(), Tracker.getOpenLocation(),
   3942                                     DeclaratorInfo, CastTy,
   3943                                     Tracker.getCloseLocation(), Result.get());
   3944     return Result;
   3945   }
   3946 
   3947   // Not a compound literal, and not followed by a cast-expression.
   3948   assert(ParseAs == SimpleExpr);
   3949 
   3950   ExprType = SimpleExpr;
   3951   Result = ParseExpression();
   3952   if (!Result.isInvalid() && Tok.is(tok::r_paren))
   3953     Result = Actions.ActOnParenExpr(Tracker.getOpenLocation(),
   3954                                     Tok.getLocation(), Result.get());
   3955 
   3956   // Match the ')'.
   3957   if (Result.isInvalid()) {
   3958     while (Tok.isNot(tok::eof))
   3959       ConsumeAnyToken();
   3960     assert(Tok.getEofData() == AttrEnd.getEofData());
   3961     ConsumeAnyToken();
   3962     return ExprError();
   3963   }
   3964 
   3965   Tracker.consumeClose();
   3966   // Consume EOF marker for Toks buffer.
   3967   assert(Tok.is(tok::eof) && Tok.getEofData() == AttrEnd.getEofData());
   3968   ConsumeAnyToken();
   3969   return Result;
   3970 }
   3971 
   3972 /// Parse a __builtin_bit_cast(T, E).
   3973 ExprResult Parser::ParseBuiltinBitCast() {
   3974   SourceLocation KWLoc = ConsumeToken();
   3975 
   3976   BalancedDelimiterTracker T(*this, tok::l_paren);
   3977   if (T.expectAndConsume(diag::err_expected_lparen_after, "__builtin_bit_cast"))
   3978     return ExprError();
   3979 
   3980   // Parse the common declaration-specifiers piece.
   3981   DeclSpec DS(AttrFactory);
   3982   ParseSpecifierQualifierList(DS);
   3983 
   3984   // Parse the abstract-declarator, if present.
   3985   Declarator DeclaratorInfo(DS, DeclaratorContext::TypeName);
   3986   ParseDeclarator(DeclaratorInfo);
   3987 
   3988   if (ExpectAndConsume(tok::comma)) {
   3989     Diag(Tok.getLocation(), diag::err_expected) << tok::comma;
   3990     SkipUntil(tok::r_paren, StopAtSemi);
   3991     return ExprError();
   3992   }
   3993 
   3994   ExprResult Operand = ParseExpression();
   3995 
   3996   if (T.consumeClose())
   3997     return ExprError();
   3998 
   3999   if (Operand.isInvalid() || DeclaratorInfo.isInvalidType())
   4000     return ExprError();
   4001 
   4002   return Actions.ActOnBuiltinBitCastExpr(KWLoc, DeclaratorInfo, Operand,
   4003                                          T.getCloseLocation());
   4004 }
   4005