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