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