xref: /freebsd/contrib/llvm-project/clang/lib/Parse/ParseCXXInlineMethods.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1  //===--- ParseCXXInlineMethods.cpp - C++ class inline methods 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 parsing for C++ class inline methods.
10  //
11  //===----------------------------------------------------------------------===//
12  
13  #include "clang/AST/DeclTemplate.h"
14  #include "clang/Parse/ParseDiagnostic.h"
15  #include "clang/Parse/Parser.h"
16  #include "clang/Parse/RAIIObjectsForParser.h"
17  #include "clang/Sema/DeclSpec.h"
18  #include "clang/Sema/EnterExpressionEvaluationContext.h"
19  #include "clang/Sema/Scope.h"
20  
21  using namespace clang;
22  
23  /// Parse the optional ("message") part of a deleted-function-body.
ParseCXXDeletedFunctionMessage()24  StringLiteral *Parser::ParseCXXDeletedFunctionMessage() {
25    if (!Tok.is(tok::l_paren))
26      return nullptr;
27    StringLiteral *Message = nullptr;
28    BalancedDelimiterTracker BT{*this, tok::l_paren};
29    BT.consumeOpen();
30  
31    if (isTokenStringLiteral()) {
32      ExprResult Res = ParseUnevaluatedStringLiteralExpression();
33      if (Res.isUsable()) {
34        Message = Res.getAs<StringLiteral>();
35        Diag(Message->getBeginLoc(), getLangOpts().CPlusPlus26
36                                         ? diag::warn_cxx23_delete_with_message
37                                         : diag::ext_delete_with_message)
38            << Message->getSourceRange();
39      }
40    } else {
41      Diag(Tok.getLocation(), diag::err_expected_string_literal)
42          << /*Source='in'*/ 0 << "'delete'";
43      SkipUntil(tok::r_paren, StopAtSemi | StopBeforeMatch);
44    }
45  
46    BT.consumeClose();
47    return Message;
48  }
49  
50  /// If we've encountered '= delete' in a context where it is ill-formed, such
51  /// as in the declaration of a non-function, also skip the ("message") part if
52  /// it is present to avoid issuing further diagnostics.
SkipDeletedFunctionBody()53  void Parser::SkipDeletedFunctionBody() {
54    if (!Tok.is(tok::l_paren))
55      return;
56  
57    BalancedDelimiterTracker BT{*this, tok::l_paren};
58    BT.consumeOpen();
59  
60    // Just skip to the end of the current declaration.
61    SkipUntil(tok::r_paren, tok::comma, StopAtSemi | StopBeforeMatch);
62    if (Tok.is(tok::r_paren))
63      BT.consumeClose();
64  }
65  
66  /// ParseCXXInlineMethodDef - We parsed and verified that the specified
67  /// Declarator is a well formed C++ inline method definition. Now lex its body
68  /// and store its tokens for parsing after the C++ class is complete.
ParseCXXInlineMethodDef(AccessSpecifier AS,const ParsedAttributesView & AccessAttrs,ParsingDeclarator & D,const ParsedTemplateInfo & TemplateInfo,const VirtSpecifiers & VS,SourceLocation PureSpecLoc)69  NamedDecl *Parser::ParseCXXInlineMethodDef(
70      AccessSpecifier AS, const ParsedAttributesView &AccessAttrs,
71      ParsingDeclarator &D, const ParsedTemplateInfo &TemplateInfo,
72      const VirtSpecifiers &VS, SourceLocation PureSpecLoc) {
73    assert(D.isFunctionDeclarator() && "This isn't a function declarator!");
74    assert(Tok.isOneOf(tok::l_brace, tok::colon, tok::kw_try, tok::equal) &&
75           "Current token not a '{', ':', '=', or 'try'!");
76  
77    MultiTemplateParamsArg TemplateParams(
78        TemplateInfo.TemplateParams ? TemplateInfo.TemplateParams->data()
79                                    : nullptr,
80        TemplateInfo.TemplateParams ? TemplateInfo.TemplateParams->size() : 0);
81  
82    NamedDecl *FnD;
83    if (D.getDeclSpec().isFriendSpecified())
84      FnD = Actions.ActOnFriendFunctionDecl(getCurScope(), D,
85                                            TemplateParams);
86    else {
87      FnD = Actions.ActOnCXXMemberDeclarator(getCurScope(), AS, D,
88                                             TemplateParams, nullptr,
89                                             VS, ICIS_NoInit);
90      if (FnD) {
91        Actions.ProcessDeclAttributeList(getCurScope(), FnD, AccessAttrs);
92        if (PureSpecLoc.isValid())
93          Actions.ActOnPureSpecifier(FnD, PureSpecLoc);
94      }
95    }
96  
97    if (FnD)
98      HandleMemberFunctionDeclDelays(D, FnD);
99  
100    D.complete(FnD);
101  
102    if (TryConsumeToken(tok::equal)) {
103      if (!FnD) {
104        SkipUntil(tok::semi);
105        return nullptr;
106      }
107  
108      bool Delete = false;
109      SourceLocation KWLoc;
110      SourceLocation KWEndLoc = Tok.getEndLoc().getLocWithOffset(-1);
111      if (TryConsumeToken(tok::kw_delete, KWLoc)) {
112        Diag(KWLoc, getLangOpts().CPlusPlus11
113                        ? diag::warn_cxx98_compat_defaulted_deleted_function
114                        : diag::ext_defaulted_deleted_function)
115          << 1 /* deleted */;
116        StringLiteral *Message = ParseCXXDeletedFunctionMessage();
117        Actions.SetDeclDeleted(FnD, KWLoc, Message);
118        Delete = true;
119        if (auto *DeclAsFunction = dyn_cast<FunctionDecl>(FnD)) {
120          DeclAsFunction->setRangeEnd(KWEndLoc);
121        }
122      } else if (TryConsumeToken(tok::kw_default, KWLoc)) {
123        Diag(KWLoc, getLangOpts().CPlusPlus11
124                        ? diag::warn_cxx98_compat_defaulted_deleted_function
125                        : diag::ext_defaulted_deleted_function)
126          << 0 /* defaulted */;
127        Actions.SetDeclDefaulted(FnD, KWLoc);
128        if (auto *DeclAsFunction = dyn_cast<FunctionDecl>(FnD)) {
129          DeclAsFunction->setRangeEnd(KWEndLoc);
130        }
131      } else {
132        llvm_unreachable("function definition after = not 'delete' or 'default'");
133      }
134  
135      if (Tok.is(tok::comma)) {
136        Diag(KWLoc, diag::err_default_delete_in_multiple_declaration)
137          << Delete;
138        SkipUntil(tok::semi);
139      } else if (ExpectAndConsume(tok::semi, diag::err_expected_after,
140                                  Delete ? "delete" : "default")) {
141        SkipUntil(tok::semi);
142      }
143  
144      return FnD;
145    }
146  
147    if (SkipFunctionBodies && (!FnD || Actions.canSkipFunctionBody(FnD)) &&
148        trySkippingFunctionBody()) {
149      Actions.ActOnSkippedFunctionBody(FnD);
150      return FnD;
151    }
152  
153    // In delayed template parsing mode, if we are within a class template
154    // or if we are about to parse function member template then consume
155    // the tokens and store them for parsing at the end of the translation unit.
156    if (getLangOpts().DelayedTemplateParsing &&
157        D.getFunctionDefinitionKind() == FunctionDefinitionKind::Definition &&
158        !D.getDeclSpec().hasConstexprSpecifier() &&
159        !(FnD && FnD->getAsFunction() &&
160          FnD->getAsFunction()->getReturnType()->getContainedAutoType()) &&
161        ((Actions.CurContext->isDependentContext() ||
162          (TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate &&
163           TemplateInfo.Kind != ParsedTemplateInfo::ExplicitSpecialization)) &&
164         !Actions.IsInsideALocalClassWithinATemplateFunction())) {
165  
166      CachedTokens Toks;
167      LexTemplateFunctionForLateParsing(Toks);
168  
169      if (FnD) {
170        FunctionDecl *FD = FnD->getAsFunction();
171        Actions.CheckForFunctionRedefinition(FD);
172        Actions.MarkAsLateParsedTemplate(FD, FnD, Toks);
173      }
174  
175      return FnD;
176    }
177  
178    // Consume the tokens and store them for later parsing.
179  
180    LexedMethod* LM = new LexedMethod(this, FnD);
181    getCurrentClass().LateParsedDeclarations.push_back(LM);
182    CachedTokens &Toks = LM->Toks;
183  
184    tok::TokenKind kind = Tok.getKind();
185    // Consume everything up to (and including) the left brace of the
186    // function body.
187    if (ConsumeAndStoreFunctionPrologue(Toks)) {
188      // We didn't find the left-brace we expected after the
189      // constructor initializer.
190  
191      // If we're code-completing and the completion point was in the broken
192      // initializer, we want to parse it even though that will fail.
193      if (PP.isCodeCompletionEnabled() &&
194          llvm::any_of(Toks, [](const Token &Tok) {
195            return Tok.is(tok::code_completion);
196          })) {
197        // If we gave up at the completion point, the initializer list was
198        // likely truncated, so don't eat more tokens. We'll hit some extra
199        // errors, but they should be ignored in code completion.
200        return FnD;
201      }
202  
203      // We already printed an error, and it's likely impossible to recover,
204      // so don't try to parse this method later.
205      // Skip over the rest of the decl and back to somewhere that looks
206      // reasonable.
207      SkipMalformedDecl();
208      delete getCurrentClass().LateParsedDeclarations.back();
209      getCurrentClass().LateParsedDeclarations.pop_back();
210      return FnD;
211    } else {
212      // Consume everything up to (and including) the matching right brace.
213      ConsumeAndStoreUntil(tok::r_brace, Toks, /*StopAtSemi=*/false);
214    }
215  
216    // If we're in a function-try-block, we need to store all the catch blocks.
217    if (kind == tok::kw_try) {
218      while (Tok.is(tok::kw_catch)) {
219        ConsumeAndStoreUntil(tok::l_brace, Toks, /*StopAtSemi=*/false);
220        ConsumeAndStoreUntil(tok::r_brace, Toks, /*StopAtSemi=*/false);
221      }
222    }
223  
224    if (FnD) {
225      FunctionDecl *FD = FnD->getAsFunction();
226      // Track that this function will eventually have a body; Sema needs
227      // to know this.
228      Actions.CheckForFunctionRedefinition(FD);
229      FD->setWillHaveBody(true);
230    } else {
231      // If semantic analysis could not build a function declaration,
232      // just throw away the late-parsed declaration.
233      delete getCurrentClass().LateParsedDeclarations.back();
234      getCurrentClass().LateParsedDeclarations.pop_back();
235    }
236  
237    return FnD;
238  }
239  
240  /// ParseCXXNonStaticMemberInitializer - We parsed and verified that the
241  /// specified Declarator is a well formed C++ non-static data member
242  /// declaration. Now lex its initializer and store its tokens for parsing
243  /// after the class is complete.
ParseCXXNonStaticMemberInitializer(Decl * VarD)244  void Parser::ParseCXXNonStaticMemberInitializer(Decl *VarD) {
245    assert(Tok.isOneOf(tok::l_brace, tok::equal) &&
246           "Current token not a '{' or '='!");
247  
248    LateParsedMemberInitializer *MI =
249      new LateParsedMemberInitializer(this, VarD);
250    getCurrentClass().LateParsedDeclarations.push_back(MI);
251    CachedTokens &Toks = MI->Toks;
252  
253    tok::TokenKind kind = Tok.getKind();
254    if (kind == tok::equal) {
255      Toks.push_back(Tok);
256      ConsumeToken();
257    }
258  
259    if (kind == tok::l_brace) {
260      // Begin by storing the '{' token.
261      Toks.push_back(Tok);
262      ConsumeBrace();
263  
264      // Consume everything up to (and including) the matching right brace.
265      ConsumeAndStoreUntil(tok::r_brace, Toks, /*StopAtSemi=*/true);
266    } else {
267      // Consume everything up to (but excluding) the comma or semicolon.
268      ConsumeAndStoreInitializer(Toks, CIK_DefaultInitializer);
269    }
270  
271    // Store an artificial EOF token to ensure that we don't run off the end of
272    // the initializer when we come to parse it.
273    Token Eof;
274    Eof.startToken();
275    Eof.setKind(tok::eof);
276    Eof.setLocation(Tok.getLocation());
277    Eof.setEofData(VarD);
278    Toks.push_back(Eof);
279  }
280  
~LateParsedDeclaration()281  Parser::LateParsedDeclaration::~LateParsedDeclaration() {}
ParseLexedMethodDeclarations()282  void Parser::LateParsedDeclaration::ParseLexedMethodDeclarations() {}
ParseLexedMemberInitializers()283  void Parser::LateParsedDeclaration::ParseLexedMemberInitializers() {}
ParseLexedMethodDefs()284  void Parser::LateParsedDeclaration::ParseLexedMethodDefs() {}
ParseLexedAttributes()285  void Parser::LateParsedDeclaration::ParseLexedAttributes() {}
ParseLexedPragmas()286  void Parser::LateParsedDeclaration::ParseLexedPragmas() {}
287  
LateParsedClass(Parser * P,ParsingClass * C)288  Parser::LateParsedClass::LateParsedClass(Parser *P, ParsingClass *C)
289    : Self(P), Class(C) {}
290  
~LateParsedClass()291  Parser::LateParsedClass::~LateParsedClass() {
292    Self->DeallocateParsedClasses(Class);
293  }
294  
ParseLexedMethodDeclarations()295  void Parser::LateParsedClass::ParseLexedMethodDeclarations() {
296    Self->ParseLexedMethodDeclarations(*Class);
297  }
298  
ParseLexedMemberInitializers()299  void Parser::LateParsedClass::ParseLexedMemberInitializers() {
300    Self->ParseLexedMemberInitializers(*Class);
301  }
302  
ParseLexedMethodDefs()303  void Parser::LateParsedClass::ParseLexedMethodDefs() {
304    Self->ParseLexedMethodDefs(*Class);
305  }
306  
ParseLexedAttributes()307  void Parser::LateParsedClass::ParseLexedAttributes() {
308    Self->ParseLexedAttributes(*Class);
309  }
310  
ParseLexedPragmas()311  void Parser::LateParsedClass::ParseLexedPragmas() {
312    Self->ParseLexedPragmas(*Class);
313  }
314  
ParseLexedMethodDeclarations()315  void Parser::LateParsedMethodDeclaration::ParseLexedMethodDeclarations() {
316    Self->ParseLexedMethodDeclaration(*this);
317  }
318  
ParseLexedMethodDefs()319  void Parser::LexedMethod::ParseLexedMethodDefs() {
320    Self->ParseLexedMethodDef(*this);
321  }
322  
ParseLexedMemberInitializers()323  void Parser::LateParsedMemberInitializer::ParseLexedMemberInitializers() {
324    Self->ParseLexedMemberInitializer(*this);
325  }
326  
ParseLexedAttributes()327  void Parser::LateParsedAttribute::ParseLexedAttributes() {
328    Self->ParseLexedAttribute(*this, true, false);
329  }
330  
ParseLexedPragmas()331  void Parser::LateParsedPragma::ParseLexedPragmas() {
332    Self->ParseLexedPragma(*this);
333  }
334  
335  /// Utility to re-enter a possibly-templated scope while parsing its
336  /// late-parsed components.
337  struct Parser::ReenterTemplateScopeRAII {
338    Parser &P;
339    MultiParseScope Scopes;
340    TemplateParameterDepthRAII CurTemplateDepthTracker;
341  
ReenterTemplateScopeRAIIParser::ReenterTemplateScopeRAII342    ReenterTemplateScopeRAII(Parser &P, Decl *MaybeTemplated, bool Enter = true)
343        : P(P), Scopes(P), CurTemplateDepthTracker(P.TemplateParameterDepth) {
344      if (Enter) {
345        CurTemplateDepthTracker.addDepth(
346            P.ReenterTemplateScopes(Scopes, MaybeTemplated));
347      }
348    }
349  };
350  
351  /// Utility to re-enter a class scope while parsing its late-parsed components.
352  struct Parser::ReenterClassScopeRAII : ReenterTemplateScopeRAII {
353    ParsingClass &Class;
354  
ReenterClassScopeRAIIParser::ReenterClassScopeRAII355    ReenterClassScopeRAII(Parser &P, ParsingClass &Class)
356        : ReenterTemplateScopeRAII(P, Class.TagOrTemplate,
357                                   /*Enter=*/!Class.TopLevelClass),
358          Class(Class) {
359      // If this is the top-level class, we're still within its scope.
360      if (Class.TopLevelClass)
361        return;
362  
363      // Re-enter the class scope itself.
364      Scopes.Enter(Scope::ClassScope|Scope::DeclScope);
365      P.Actions.ActOnStartDelayedMemberDeclarations(P.getCurScope(),
366                                                    Class.TagOrTemplate);
367    }
~ReenterClassScopeRAIIParser::ReenterClassScopeRAII368    ~ReenterClassScopeRAII() {
369      if (Class.TopLevelClass)
370        return;
371  
372      P.Actions.ActOnFinishDelayedMemberDeclarations(P.getCurScope(),
373                                                     Class.TagOrTemplate);
374    }
375  };
376  
377  /// ParseLexedMethodDeclarations - We finished parsing the member
378  /// specification of a top (non-nested) C++ class. Now go over the
379  /// stack of method declarations with some parts for which parsing was
380  /// delayed (such as default arguments) and parse them.
ParseLexedMethodDeclarations(ParsingClass & Class)381  void Parser::ParseLexedMethodDeclarations(ParsingClass &Class) {
382    ReenterClassScopeRAII InClassScope(*this, Class);
383  
384    for (LateParsedDeclaration *LateD : Class.LateParsedDeclarations)
385      LateD->ParseLexedMethodDeclarations();
386  }
387  
ParseLexedMethodDeclaration(LateParsedMethodDeclaration & LM)388  void Parser::ParseLexedMethodDeclaration(LateParsedMethodDeclaration &LM) {
389    // If this is a member template, introduce the template parameter scope.
390    ReenterTemplateScopeRAII InFunctionTemplateScope(*this, LM.Method);
391  
392    // Start the delayed C++ method declaration
393    Actions.ActOnStartDelayedCXXMethodDeclaration(getCurScope(), LM.Method);
394  
395    // Introduce the parameters into scope and parse their default
396    // arguments.
397    InFunctionTemplateScope.Scopes.Enter(Scope::FunctionPrototypeScope |
398                                         Scope::FunctionDeclarationScope |
399                                         Scope::DeclScope);
400    for (unsigned I = 0, N = LM.DefaultArgs.size(); I != N; ++I) {
401      auto Param = cast<ParmVarDecl>(LM.DefaultArgs[I].Param);
402      // Introduce the parameter into scope.
403      bool HasUnparsed = Param->hasUnparsedDefaultArg();
404      Actions.ActOnDelayedCXXMethodParameter(getCurScope(), Param);
405      std::unique_ptr<CachedTokens> Toks = std::move(LM.DefaultArgs[I].Toks);
406      if (Toks) {
407        ParenBraceBracketBalancer BalancerRAIIObj(*this);
408  
409        // Mark the end of the default argument so that we know when to stop when
410        // we parse it later on.
411        Token LastDefaultArgToken = Toks->back();
412        Token DefArgEnd;
413        DefArgEnd.startToken();
414        DefArgEnd.setKind(tok::eof);
415        DefArgEnd.setLocation(LastDefaultArgToken.getEndLoc());
416        DefArgEnd.setEofData(Param);
417        Toks->push_back(DefArgEnd);
418  
419        // Parse the default argument from its saved token stream.
420        Toks->push_back(Tok); // So that the current token doesn't get lost
421        PP.EnterTokenStream(*Toks, true, /*IsReinject*/ true);
422  
423        // Consume the previously-pushed token.
424        ConsumeAnyToken();
425  
426        // Consume the '='.
427        assert(Tok.is(tok::equal) && "Default argument not starting with '='");
428        SourceLocation EqualLoc = ConsumeToken();
429  
430        // The argument isn't actually potentially evaluated unless it is
431        // used.
432        EnterExpressionEvaluationContext Eval(
433            Actions,
434            Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, Param);
435  
436        ExprResult DefArgResult;
437        if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {
438          Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
439          DefArgResult = ParseBraceInitializer();
440        } else
441          DefArgResult = ParseAssignmentExpression();
442        DefArgResult = Actions.CorrectDelayedTyposInExpr(DefArgResult, Param);
443        if (DefArgResult.isInvalid()) {
444          Actions.ActOnParamDefaultArgumentError(Param, EqualLoc,
445                                                 /*DefaultArg=*/nullptr);
446        } else {
447          if (Tok.isNot(tok::eof) || Tok.getEofData() != Param) {
448            // The last two tokens are the terminator and the saved value of
449            // Tok; the last token in the default argument is the one before
450            // those.
451            assert(Toks->size() >= 3 && "expected a token in default arg");
452            Diag(Tok.getLocation(), diag::err_default_arg_unparsed)
453              << SourceRange(Tok.getLocation(),
454                             (*Toks)[Toks->size() - 3].getLocation());
455          }
456          Actions.ActOnParamDefaultArgument(Param, EqualLoc,
457                                            DefArgResult.get());
458        }
459  
460        // There could be leftover tokens (e.g. because of an error).
461        // Skip through until we reach the 'end of default argument' token.
462        while (Tok.isNot(tok::eof))
463          ConsumeAnyToken();
464  
465        if (Tok.is(tok::eof) && Tok.getEofData() == Param)
466          ConsumeAnyToken();
467      } else if (HasUnparsed) {
468        assert(Param->hasInheritedDefaultArg());
469        FunctionDecl *Old;
470        if (const auto *FunTmpl = dyn_cast<FunctionTemplateDecl>(LM.Method))
471          Old =
472              cast<FunctionDecl>(FunTmpl->getTemplatedDecl())->getPreviousDecl();
473        else
474          Old = cast<FunctionDecl>(LM.Method)->getPreviousDecl();
475        if (Old) {
476          ParmVarDecl *OldParam = Old->getParamDecl(I);
477          assert(!OldParam->hasUnparsedDefaultArg());
478          if (OldParam->hasUninstantiatedDefaultArg())
479            Param->setUninstantiatedDefaultArg(
480                OldParam->getUninstantiatedDefaultArg());
481          else
482            Param->setDefaultArg(OldParam->getInit());
483        }
484      }
485    }
486  
487    // Parse a delayed exception-specification, if there is one.
488    if (CachedTokens *Toks = LM.ExceptionSpecTokens) {
489      ParenBraceBracketBalancer BalancerRAIIObj(*this);
490  
491      // Add the 'stop' token.
492      Token LastExceptionSpecToken = Toks->back();
493      Token ExceptionSpecEnd;
494      ExceptionSpecEnd.startToken();
495      ExceptionSpecEnd.setKind(tok::eof);
496      ExceptionSpecEnd.setLocation(LastExceptionSpecToken.getEndLoc());
497      ExceptionSpecEnd.setEofData(LM.Method);
498      Toks->push_back(ExceptionSpecEnd);
499  
500      // Parse the default argument from its saved token stream.
501      Toks->push_back(Tok); // So that the current token doesn't get lost
502      PP.EnterTokenStream(*Toks, true, /*IsReinject*/true);
503  
504      // Consume the previously-pushed token.
505      ConsumeAnyToken();
506  
507      // C++11 [expr.prim.general]p3:
508      //   If a declaration declares a member function or member function
509      //   template of a class X, the expression this is a prvalue of type
510      //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
511      //   and the end of the function-definition, member-declarator, or
512      //   declarator.
513      CXXMethodDecl *Method;
514      FunctionDecl *FunctionToPush;
515      if (FunctionTemplateDecl *FunTmpl
516            = dyn_cast<FunctionTemplateDecl>(LM.Method))
517        FunctionToPush = FunTmpl->getTemplatedDecl();
518      else
519        FunctionToPush = cast<FunctionDecl>(LM.Method);
520      Method = dyn_cast<CXXMethodDecl>(FunctionToPush);
521  
522      // Push a function scope so that tryCaptureVariable() can properly visit
523      // function scopes involving function parameters that are referenced inside
524      // the noexcept specifier e.g. through a lambda expression.
525      // Example:
526      // struct X {
527      //   void ICE(int val) noexcept(noexcept([val]{}));
528      // };
529      // Setup the CurScope to match the function DeclContext - we have such
530      // assumption in IsInFnTryBlockHandler().
531      ParseScope FnScope(this, Scope::FnScope);
532      Sema::ContextRAII FnContext(Actions, FunctionToPush,
533                                  /*NewThisContext=*/false);
534      Sema::FunctionScopeRAII PopFnContext(Actions);
535      Actions.PushFunctionScope();
536  
537      Sema::CXXThisScopeRAII ThisScope(
538          Actions, Method ? Method->getParent() : nullptr,
539          Method ? Method->getMethodQualifiers() : Qualifiers{},
540          Method && getLangOpts().CPlusPlus11);
541  
542      // Parse the exception-specification.
543      SourceRange SpecificationRange;
544      SmallVector<ParsedType, 4> DynamicExceptions;
545      SmallVector<SourceRange, 4> DynamicExceptionRanges;
546      ExprResult NoexceptExpr;
547      CachedTokens *ExceptionSpecTokens;
548  
549      ExceptionSpecificationType EST
550        = tryParseExceptionSpecification(/*Delayed=*/false, SpecificationRange,
551                                         DynamicExceptions,
552                                         DynamicExceptionRanges, NoexceptExpr,
553                                         ExceptionSpecTokens);
554  
555      if (Tok.isNot(tok::eof) || Tok.getEofData() != LM.Method)
556        Diag(Tok.getLocation(), diag::err_except_spec_unparsed);
557  
558      // Attach the exception-specification to the method.
559      Actions.actOnDelayedExceptionSpecification(LM.Method, EST,
560                                                 SpecificationRange,
561                                                 DynamicExceptions,
562                                                 DynamicExceptionRanges,
563                                                 NoexceptExpr.isUsable()?
564                                                   NoexceptExpr.get() : nullptr);
565  
566      // There could be leftover tokens (e.g. because of an error).
567      // Skip through until we reach the original token position.
568      while (Tok.isNot(tok::eof))
569        ConsumeAnyToken();
570  
571      // Clean up the remaining EOF token.
572      if (Tok.is(tok::eof) && Tok.getEofData() == LM.Method)
573        ConsumeAnyToken();
574  
575      delete Toks;
576      LM.ExceptionSpecTokens = nullptr;
577    }
578  
579    InFunctionTemplateScope.Scopes.Exit();
580  
581    // Finish the delayed C++ method declaration.
582    Actions.ActOnFinishDelayedCXXMethodDeclaration(getCurScope(), LM.Method);
583  }
584  
585  /// ParseLexedMethodDefs - We finished parsing the member specification of a top
586  /// (non-nested) C++ class. Now go over the stack of lexed methods that were
587  /// collected during its parsing and parse them all.
ParseLexedMethodDefs(ParsingClass & Class)588  void Parser::ParseLexedMethodDefs(ParsingClass &Class) {
589    ReenterClassScopeRAII InClassScope(*this, Class);
590  
591    for (LateParsedDeclaration *D : Class.LateParsedDeclarations)
592      D->ParseLexedMethodDefs();
593  }
594  
ParseLexedMethodDef(LexedMethod & LM)595  void Parser::ParseLexedMethodDef(LexedMethod &LM) {
596    // If this is a member template, introduce the template parameter scope.
597    ReenterTemplateScopeRAII InFunctionTemplateScope(*this, LM.D);
598  
599    ParenBraceBracketBalancer BalancerRAIIObj(*this);
600  
601    assert(!LM.Toks.empty() && "Empty body!");
602    Token LastBodyToken = LM.Toks.back();
603    Token BodyEnd;
604    BodyEnd.startToken();
605    BodyEnd.setKind(tok::eof);
606    BodyEnd.setLocation(LastBodyToken.getEndLoc());
607    BodyEnd.setEofData(LM.D);
608    LM.Toks.push_back(BodyEnd);
609    // Append the current token at the end of the new token stream so that it
610    // doesn't get lost.
611    LM.Toks.push_back(Tok);
612    PP.EnterTokenStream(LM.Toks, true, /*IsReinject*/true);
613  
614    // Consume the previously pushed token.
615    ConsumeAnyToken(/*ConsumeCodeCompletionTok=*/true);
616    assert(Tok.isOneOf(tok::l_brace, tok::colon, tok::kw_try)
617           && "Inline method not starting with '{', ':' or 'try'");
618  
619    // Parse the method body. Function body parsing code is similar enough
620    // to be re-used for method bodies as well.
621    ParseScope FnScope(this, Scope::FnScope | Scope::DeclScope |
622                                 Scope::CompoundStmtScope);
623    Sema::FPFeaturesStateRAII SaveFPFeatures(Actions);
624  
625    Actions.ActOnStartOfFunctionDef(getCurScope(), LM.D);
626  
627    if (Tok.is(tok::kw_try)) {
628      ParseFunctionTryBlock(LM.D, FnScope);
629  
630      while (Tok.isNot(tok::eof))
631        ConsumeAnyToken();
632  
633      if (Tok.is(tok::eof) && Tok.getEofData() == LM.D)
634        ConsumeAnyToken();
635      return;
636    }
637    if (Tok.is(tok::colon)) {
638      ParseConstructorInitializer(LM.D);
639  
640      // Error recovery.
641      if (!Tok.is(tok::l_brace)) {
642        FnScope.Exit();
643        Actions.ActOnFinishFunctionBody(LM.D, nullptr);
644  
645        while (Tok.isNot(tok::eof))
646          ConsumeAnyToken();
647  
648        if (Tok.is(tok::eof) && Tok.getEofData() == LM.D)
649          ConsumeAnyToken();
650        return;
651      }
652    } else
653      Actions.ActOnDefaultCtorInitializers(LM.D);
654  
655    assert((Actions.getDiagnostics().hasErrorOccurred() ||
656            !isa<FunctionTemplateDecl>(LM.D) ||
657            cast<FunctionTemplateDecl>(LM.D)->getTemplateParameters()->getDepth()
658              < TemplateParameterDepth) &&
659           "TemplateParameterDepth should be greater than the depth of "
660           "current template being instantiated!");
661  
662    ParseFunctionStatementBody(LM.D, FnScope);
663  
664    while (Tok.isNot(tok::eof))
665      ConsumeAnyToken();
666  
667    if (Tok.is(tok::eof) && Tok.getEofData() == LM.D)
668      ConsumeAnyToken();
669  
670    if (auto *FD = dyn_cast_or_null<FunctionDecl>(LM.D))
671      if (isa<CXXMethodDecl>(FD) ||
672          FD->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend))
673        Actions.ActOnFinishInlineFunctionDef(FD);
674  }
675  
676  /// ParseLexedMemberInitializers - We finished parsing the member specification
677  /// of a top (non-nested) C++ class. Now go over the stack of lexed data member
678  /// initializers that were collected during its parsing and parse them all.
ParseLexedMemberInitializers(ParsingClass & Class)679  void Parser::ParseLexedMemberInitializers(ParsingClass &Class) {
680    ReenterClassScopeRAII InClassScope(*this, Class);
681  
682    if (!Class.LateParsedDeclarations.empty()) {
683      // C++11 [expr.prim.general]p4:
684      //   Otherwise, if a member-declarator declares a non-static data member
685      //  (9.2) of a class X, the expression this is a prvalue of type "pointer
686      //  to X" within the optional brace-or-equal-initializer. It shall not
687      //  appear elsewhere in the member-declarator.
688      // FIXME: This should be done in ParseLexedMemberInitializer, not here.
689      Sema::CXXThisScopeRAII ThisScope(Actions, Class.TagOrTemplate,
690                                       Qualifiers());
691  
692      for (LateParsedDeclaration *D : Class.LateParsedDeclarations)
693        D->ParseLexedMemberInitializers();
694    }
695  
696    Actions.ActOnFinishDelayedMemberInitializers(Class.TagOrTemplate);
697  }
698  
ParseLexedMemberInitializer(LateParsedMemberInitializer & MI)699  void Parser::ParseLexedMemberInitializer(LateParsedMemberInitializer &MI) {
700    if (!MI.Field || MI.Field->isInvalidDecl())
701      return;
702  
703    ParenBraceBracketBalancer BalancerRAIIObj(*this);
704  
705    // Append the current token at the end of the new token stream so that it
706    // doesn't get lost.
707    MI.Toks.push_back(Tok);
708    PP.EnterTokenStream(MI.Toks, true, /*IsReinject*/true);
709  
710    // Consume the previously pushed token.
711    ConsumeAnyToken(/*ConsumeCodeCompletionTok=*/true);
712  
713    SourceLocation EqualLoc;
714  
715    Actions.ActOnStartCXXInClassMemberInitializer();
716  
717    // The initializer isn't actually potentially evaluated unless it is
718    // used.
719    EnterExpressionEvaluationContext Eval(
720        Actions, Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed);
721  
722    ExprResult Init = ParseCXXMemberInitializer(MI.Field, /*IsFunction=*/false,
723                                                EqualLoc);
724  
725    Actions.ActOnFinishCXXInClassMemberInitializer(MI.Field, EqualLoc,
726                                                   Init.get());
727  
728    // The next token should be our artificial terminating EOF token.
729    if (Tok.isNot(tok::eof)) {
730      if (!Init.isInvalid()) {
731        SourceLocation EndLoc = PP.getLocForEndOfToken(PrevTokLocation);
732        if (!EndLoc.isValid())
733          EndLoc = Tok.getLocation();
734        // No fixit; we can't recover as if there were a semicolon here.
735        Diag(EndLoc, diag::err_expected_semi_decl_list);
736      }
737  
738      // Consume tokens until we hit the artificial EOF.
739      while (Tok.isNot(tok::eof))
740        ConsumeAnyToken();
741    }
742    // Make sure this is *our* artificial EOF token.
743    if (Tok.getEofData() == MI.Field)
744      ConsumeAnyToken();
745  }
746  
747  /// Wrapper class which calls ParseLexedAttribute, after setting up the
748  /// scope appropriately.
ParseLexedAttributes(ParsingClass & Class)749  void Parser::ParseLexedAttributes(ParsingClass &Class) {
750    ReenterClassScopeRAII InClassScope(*this, Class);
751  
752    for (LateParsedDeclaration *LateD : Class.LateParsedDeclarations)
753      LateD->ParseLexedAttributes();
754  }
755  
756  /// Parse all attributes in LAs, and attach them to Decl D.
ParseLexedAttributeList(LateParsedAttrList & LAs,Decl * D,bool EnterScope,bool OnDefinition)757  void Parser::ParseLexedAttributeList(LateParsedAttrList &LAs, Decl *D,
758                                       bool EnterScope, bool OnDefinition) {
759    assert(LAs.parseSoon() &&
760           "Attribute list should be marked for immediate parsing.");
761    for (unsigned i = 0, ni = LAs.size(); i < ni; ++i) {
762      if (D)
763        LAs[i]->addDecl(D);
764      ParseLexedAttribute(*LAs[i], EnterScope, OnDefinition);
765      delete LAs[i];
766    }
767    LAs.clear();
768  }
769  
770  /// Finish parsing an attribute for which parsing was delayed.
771  /// This will be called at the end of parsing a class declaration
772  /// for each LateParsedAttribute. We consume the saved tokens and
773  /// create an attribute with the arguments filled in. We add this
774  /// to the Attribute list for the decl.
ParseLexedAttribute(LateParsedAttribute & LA,bool EnterScope,bool OnDefinition)775  void Parser::ParseLexedAttribute(LateParsedAttribute &LA,
776                                   bool EnterScope, bool OnDefinition) {
777    // Create a fake EOF so that attribute parsing won't go off the end of the
778    // attribute.
779    Token AttrEnd;
780    AttrEnd.startToken();
781    AttrEnd.setKind(tok::eof);
782    AttrEnd.setLocation(Tok.getLocation());
783    AttrEnd.setEofData(LA.Toks.data());
784    LA.Toks.push_back(AttrEnd);
785  
786    // Append the current token at the end of the new token stream so that it
787    // doesn't get lost.
788    LA.Toks.push_back(Tok);
789    PP.EnterTokenStream(LA.Toks, true, /*IsReinject=*/true);
790    // Consume the previously pushed token.
791    ConsumeAnyToken(/*ConsumeCodeCompletionTok=*/true);
792  
793    ParsedAttributes Attrs(AttrFactory);
794  
795    if (LA.Decls.size() > 0) {
796      Decl *D = LA.Decls[0];
797      NamedDecl *ND  = dyn_cast<NamedDecl>(D);
798      RecordDecl *RD = dyn_cast_or_null<RecordDecl>(D->getDeclContext());
799  
800      // Allow 'this' within late-parsed attributes.
801      Sema::CXXThisScopeRAII ThisScope(Actions, RD, Qualifiers(),
802                                       ND && ND->isCXXInstanceMember());
803  
804      if (LA.Decls.size() == 1) {
805        // If the Decl is templatized, add template parameters to scope.
806        ReenterTemplateScopeRAII InDeclScope(*this, D, EnterScope);
807  
808        // If the Decl is on a function, add function parameters to the scope.
809        bool HasFunScope = EnterScope && D->isFunctionOrFunctionTemplate();
810        if (HasFunScope) {
811          InDeclScope.Scopes.Enter(Scope::FnScope | Scope::DeclScope |
812                                   Scope::CompoundStmtScope);
813          Actions.ActOnReenterFunctionContext(Actions.CurScope, D);
814        }
815  
816        ParseGNUAttributeArgs(&LA.AttrName, LA.AttrNameLoc, Attrs, nullptr,
817                              nullptr, SourceLocation(), ParsedAttr::Form::GNU(),
818                              nullptr);
819  
820        if (HasFunScope)
821          Actions.ActOnExitFunctionContext();
822      } else {
823        // If there are multiple decls, then the decl cannot be within the
824        // function scope.
825        ParseGNUAttributeArgs(&LA.AttrName, LA.AttrNameLoc, Attrs, nullptr,
826                              nullptr, SourceLocation(), ParsedAttr::Form::GNU(),
827                              nullptr);
828      }
829    } else {
830      Diag(Tok, diag::warn_attribute_no_decl) << LA.AttrName.getName();
831    }
832  
833    if (OnDefinition && !Attrs.empty() && !Attrs.begin()->isCXX11Attribute() &&
834        Attrs.begin()->isKnownToGCC())
835      Diag(Tok, diag::warn_attribute_on_function_definition)
836        << &LA.AttrName;
837  
838    for (unsigned i = 0, ni = LA.Decls.size(); i < ni; ++i)
839      Actions.ActOnFinishDelayedAttribute(getCurScope(), LA.Decls[i], Attrs);
840  
841    // Due to a parsing error, we either went over the cached tokens or
842    // there are still cached tokens left, so we skip the leftover tokens.
843    while (Tok.isNot(tok::eof))
844      ConsumeAnyToken();
845  
846    if (Tok.is(tok::eof) && Tok.getEofData() == AttrEnd.getEofData())
847      ConsumeAnyToken();
848  }
849  
ParseLexedPragmas(ParsingClass & Class)850  void Parser::ParseLexedPragmas(ParsingClass &Class) {
851    ReenterClassScopeRAII InClassScope(*this, Class);
852  
853    for (LateParsedDeclaration *D : Class.LateParsedDeclarations)
854      D->ParseLexedPragmas();
855  }
856  
ParseLexedPragma(LateParsedPragma & LP)857  void Parser::ParseLexedPragma(LateParsedPragma &LP) {
858    PP.EnterToken(Tok, /*IsReinject=*/true);
859    PP.EnterTokenStream(LP.toks(), /*DisableMacroExpansion=*/true,
860                        /*IsReinject=*/true);
861  
862    // Consume the previously pushed token.
863    ConsumeAnyToken(/*ConsumeCodeCompletionTok=*/true);
864    assert(Tok.isAnnotation() && "Expected annotation token.");
865    switch (Tok.getKind()) {
866    case tok::annot_attr_openmp:
867    case tok::annot_pragma_openmp: {
868      AccessSpecifier AS = LP.getAccessSpecifier();
869      ParsedAttributes Attrs(AttrFactory);
870      (void)ParseOpenMPDeclarativeDirectiveWithExtDecl(AS, Attrs);
871      break;
872    }
873    default:
874      llvm_unreachable("Unexpected token.");
875    }
876  }
877  
878  /// ConsumeAndStoreUntil - Consume and store the token at the passed token
879  /// container until the token 'T' is reached (which gets
880  /// consumed/stored too, if ConsumeFinalToken).
881  /// If StopAtSemi is true, then we will stop early at a ';' character.
882  /// Returns true if token 'T1' or 'T2' was found.
883  /// NOTE: This is a specialized version of Parser::SkipUntil.
ConsumeAndStoreUntil(tok::TokenKind T1,tok::TokenKind T2,CachedTokens & Toks,bool StopAtSemi,bool ConsumeFinalToken)884  bool Parser::ConsumeAndStoreUntil(tok::TokenKind T1, tok::TokenKind T2,
885                                    CachedTokens &Toks,
886                                    bool StopAtSemi, bool ConsumeFinalToken) {
887    // We always want this function to consume at least one token if the first
888    // token isn't T and if not at EOF.
889    bool isFirstTokenConsumed = true;
890    while (true) {
891      // If we found one of the tokens, stop and return true.
892      if (Tok.is(T1) || Tok.is(T2)) {
893        if (ConsumeFinalToken) {
894          Toks.push_back(Tok);
895          ConsumeAnyToken();
896        }
897        return true;
898      }
899  
900      switch (Tok.getKind()) {
901      case tok::eof:
902      case tok::annot_module_begin:
903      case tok::annot_module_end:
904      case tok::annot_module_include:
905      case tok::annot_repl_input_end:
906        // Ran out of tokens.
907        return false;
908  
909      case tok::l_paren:
910        // Recursively consume properly-nested parens.
911        Toks.push_back(Tok);
912        ConsumeParen();
913        ConsumeAndStoreUntil(tok::r_paren, Toks, /*StopAtSemi=*/false);
914        break;
915      case tok::l_square:
916        // Recursively consume properly-nested square brackets.
917        Toks.push_back(Tok);
918        ConsumeBracket();
919        ConsumeAndStoreUntil(tok::r_square, Toks, /*StopAtSemi=*/false);
920        break;
921      case tok::l_brace:
922        // Recursively consume properly-nested braces.
923        Toks.push_back(Tok);
924        ConsumeBrace();
925        ConsumeAndStoreUntil(tok::r_brace, Toks, /*StopAtSemi=*/false);
926        break;
927  
928      // Okay, we found a ']' or '}' or ')', which we think should be balanced.
929      // Since the user wasn't looking for this token (if they were, it would
930      // already be handled), this isn't balanced.  If there is a LHS token at a
931      // higher level, we will assume that this matches the unbalanced token
932      // and return it.  Otherwise, this is a spurious RHS token, which we skip.
933      case tok::r_paren:
934        if (ParenCount && !isFirstTokenConsumed)
935          return false;  // Matches something.
936        Toks.push_back(Tok);
937        ConsumeParen();
938        break;
939      case tok::r_square:
940        if (BracketCount && !isFirstTokenConsumed)
941          return false;  // Matches something.
942        Toks.push_back(Tok);
943        ConsumeBracket();
944        break;
945      case tok::r_brace:
946        if (BraceCount && !isFirstTokenConsumed)
947          return false;  // Matches something.
948        Toks.push_back(Tok);
949        ConsumeBrace();
950        break;
951  
952      case tok::semi:
953        if (StopAtSemi)
954          return false;
955        [[fallthrough]];
956      default:
957        // consume this token.
958        Toks.push_back(Tok);
959        ConsumeAnyToken(/*ConsumeCodeCompletionTok*/true);
960        break;
961      }
962      isFirstTokenConsumed = false;
963    }
964  }
965  
966  /// Consume tokens and store them in the passed token container until
967  /// we've passed the try keyword and constructor initializers and have consumed
968  /// the opening brace of the function body. The opening brace will be consumed
969  /// if and only if there was no error.
970  ///
971  /// \return True on error.
ConsumeAndStoreFunctionPrologue(CachedTokens & Toks)972  bool Parser::ConsumeAndStoreFunctionPrologue(CachedTokens &Toks) {
973    if (Tok.is(tok::kw_try)) {
974      Toks.push_back(Tok);
975      ConsumeToken();
976    }
977  
978    if (Tok.isNot(tok::colon)) {
979      // Easy case, just a function body.
980  
981      // Grab any remaining garbage to be diagnosed later. We stop when we reach a
982      // brace: an opening one is the function body, while a closing one probably
983      // means we've reached the end of the class.
984      ConsumeAndStoreUntil(tok::l_brace, tok::r_brace, Toks,
985                           /*StopAtSemi=*/true,
986                           /*ConsumeFinalToken=*/false);
987      if (Tok.isNot(tok::l_brace))
988        return Diag(Tok.getLocation(), diag::err_expected) << tok::l_brace;
989  
990      Toks.push_back(Tok);
991      ConsumeBrace();
992      return false;
993    }
994  
995    Toks.push_back(Tok);
996    ConsumeToken();
997  
998    // We can't reliably skip over a mem-initializer-id, because it could be
999    // a template-id involving not-yet-declared names. Given:
1000    //
1001    //   S ( ) : a < b < c > ( e )
1002    //
1003    // 'e' might be an initializer or part of a template argument, depending
1004    // on whether 'b' is a template.
1005  
1006    // Track whether we might be inside a template argument. We can give
1007    // significantly better diagnostics if we know that we're not.
1008    bool MightBeTemplateArgument = false;
1009  
1010    while (true) {
1011      // Skip over the mem-initializer-id, if possible.
1012      if (Tok.is(tok::kw_decltype)) {
1013        Toks.push_back(Tok);
1014        SourceLocation OpenLoc = ConsumeToken();
1015        if (Tok.isNot(tok::l_paren))
1016          return Diag(Tok.getLocation(), diag::err_expected_lparen_after)
1017                   << "decltype";
1018        Toks.push_back(Tok);
1019        ConsumeParen();
1020        if (!ConsumeAndStoreUntil(tok::r_paren, Toks, /*StopAtSemi=*/true)) {
1021          Diag(Tok.getLocation(), diag::err_expected) << tok::r_paren;
1022          Diag(OpenLoc, diag::note_matching) << tok::l_paren;
1023          return true;
1024        }
1025      }
1026      do {
1027        // Walk over a component of a nested-name-specifier.
1028        if (Tok.is(tok::coloncolon)) {
1029          Toks.push_back(Tok);
1030          ConsumeToken();
1031  
1032          if (Tok.is(tok::kw_template)) {
1033            Toks.push_back(Tok);
1034            ConsumeToken();
1035          }
1036        }
1037  
1038        if (Tok.is(tok::identifier)) {
1039          Toks.push_back(Tok);
1040          ConsumeToken();
1041        } else {
1042          break;
1043        }
1044        // Pack indexing
1045        if (Tok.is(tok::ellipsis) && NextToken().is(tok::l_square)) {
1046          Toks.push_back(Tok);
1047          SourceLocation OpenLoc = ConsumeToken();
1048          Toks.push_back(Tok);
1049          ConsumeBracket();
1050          if (!ConsumeAndStoreUntil(tok::r_square, Toks, /*StopAtSemi=*/true)) {
1051            Diag(Tok.getLocation(), diag::err_expected) << tok::r_square;
1052            Diag(OpenLoc, diag::note_matching) << tok::l_square;
1053            return true;
1054          }
1055        }
1056  
1057      } while (Tok.is(tok::coloncolon));
1058  
1059      if (Tok.is(tok::code_completion)) {
1060        Toks.push_back(Tok);
1061        ConsumeCodeCompletionToken();
1062        if (Tok.isOneOf(tok::identifier, tok::coloncolon, tok::kw_decltype)) {
1063          // Could be the start of another member initializer (the ',' has not
1064          // been written yet)
1065          continue;
1066        }
1067      }
1068  
1069      if (Tok.is(tok::comma)) {
1070        // The initialization is missing, we'll diagnose it later.
1071        Toks.push_back(Tok);
1072        ConsumeToken();
1073        continue;
1074      }
1075      if (Tok.is(tok::less))
1076        MightBeTemplateArgument = true;
1077  
1078      if (MightBeTemplateArgument) {
1079        // We may be inside a template argument list. Grab up to the start of the
1080        // next parenthesized initializer or braced-init-list. This *might* be the
1081        // initializer, or it might be a subexpression in the template argument
1082        // list.
1083        // FIXME: Count angle brackets, and clear MightBeTemplateArgument
1084        //        if all angles are closed.
1085        if (!ConsumeAndStoreUntil(tok::l_paren, tok::l_brace, Toks,
1086                                  /*StopAtSemi=*/true,
1087                                  /*ConsumeFinalToken=*/false)) {
1088          // We're not just missing the initializer, we're also missing the
1089          // function body!
1090          return Diag(Tok.getLocation(), diag::err_expected) << tok::l_brace;
1091        }
1092      } else if (Tok.isNot(tok::l_paren) && Tok.isNot(tok::l_brace)) {
1093        // We found something weird in a mem-initializer-id.
1094        if (getLangOpts().CPlusPlus11)
1095          return Diag(Tok.getLocation(), diag::err_expected_either)
1096                 << tok::l_paren << tok::l_brace;
1097        else
1098          return Diag(Tok.getLocation(), diag::err_expected) << tok::l_paren;
1099      }
1100  
1101      tok::TokenKind kind = Tok.getKind();
1102      Toks.push_back(Tok);
1103      bool IsLParen = (kind == tok::l_paren);
1104      SourceLocation OpenLoc = Tok.getLocation();
1105  
1106      if (IsLParen) {
1107        ConsumeParen();
1108      } else {
1109        assert(kind == tok::l_brace && "Must be left paren or brace here.");
1110        ConsumeBrace();
1111        // In C++03, this has to be the start of the function body, which
1112        // means the initializer is malformed; we'll diagnose it later.
1113        if (!getLangOpts().CPlusPlus11)
1114          return false;
1115  
1116        const Token &PreviousToken = Toks[Toks.size() - 2];
1117        if (!MightBeTemplateArgument &&
1118            !PreviousToken.isOneOf(tok::identifier, tok::greater,
1119                                   tok::greatergreater)) {
1120          // If the opening brace is not preceded by one of these tokens, we are
1121          // missing the mem-initializer-id. In order to recover better, we need
1122          // to use heuristics to determine if this '{' is most likely the
1123          // beginning of a brace-init-list or the function body.
1124          // Check the token after the corresponding '}'.
1125          TentativeParsingAction PA(*this);
1126          if (SkipUntil(tok::r_brace) &&
1127              !Tok.isOneOf(tok::comma, tok::ellipsis, tok::l_brace)) {
1128            // Consider there was a malformed initializer and this is the start
1129            // of the function body. We'll diagnose it later.
1130            PA.Revert();
1131            return false;
1132          }
1133          PA.Revert();
1134        }
1135      }
1136  
1137      // Grab the initializer (or the subexpression of the template argument).
1138      // FIXME: If we support lambdas here, we'll need to set StopAtSemi to false
1139      //        if we might be inside the braces of a lambda-expression.
1140      tok::TokenKind CloseKind = IsLParen ? tok::r_paren : tok::r_brace;
1141      if (!ConsumeAndStoreUntil(CloseKind, Toks, /*StopAtSemi=*/true)) {
1142        Diag(Tok, diag::err_expected) << CloseKind;
1143        Diag(OpenLoc, diag::note_matching) << kind;
1144        return true;
1145      }
1146  
1147      // Grab pack ellipsis, if present.
1148      if (Tok.is(tok::ellipsis)) {
1149        Toks.push_back(Tok);
1150        ConsumeToken();
1151      }
1152  
1153      // If we know we just consumed a mem-initializer, we must have ',' or '{'
1154      // next.
1155      if (Tok.is(tok::comma)) {
1156        Toks.push_back(Tok);
1157        ConsumeToken();
1158      } else if (Tok.is(tok::l_brace)) {
1159        // This is the function body if the ')' or '}' is immediately followed by
1160        // a '{'. That cannot happen within a template argument, apart from the
1161        // case where a template argument contains a compound literal:
1162        //
1163        //   S ( ) : a < b < c > ( d ) { }
1164        //   // End of declaration, or still inside the template argument?
1165        //
1166        // ... and the case where the template argument contains a lambda:
1167        //
1168        //   S ( ) : a < 0 && b < c > ( d ) + [ ] ( ) { return 0; }
1169        //     ( ) > ( ) { }
1170        //
1171        // FIXME: Disambiguate these cases. Note that the latter case is probably
1172        //        going to be made ill-formed by core issue 1607.
1173        Toks.push_back(Tok);
1174        ConsumeBrace();
1175        return false;
1176      } else if (!MightBeTemplateArgument) {
1177        return Diag(Tok.getLocation(), diag::err_expected_either) << tok::l_brace
1178                                                                  << tok::comma;
1179      }
1180    }
1181  }
1182  
1183  /// Consume and store tokens from the '?' to the ':' in a conditional
1184  /// expression.
ConsumeAndStoreConditional(CachedTokens & Toks)1185  bool Parser::ConsumeAndStoreConditional(CachedTokens &Toks) {
1186    // Consume '?'.
1187    assert(Tok.is(tok::question));
1188    Toks.push_back(Tok);
1189    ConsumeToken();
1190  
1191    while (Tok.isNot(tok::colon)) {
1192      if (!ConsumeAndStoreUntil(tok::question, tok::colon, Toks,
1193                                /*StopAtSemi=*/true,
1194                                /*ConsumeFinalToken=*/false))
1195        return false;
1196  
1197      // If we found a nested conditional, consume it.
1198      if (Tok.is(tok::question) && !ConsumeAndStoreConditional(Toks))
1199        return false;
1200    }
1201  
1202    // Consume ':'.
1203    Toks.push_back(Tok);
1204    ConsumeToken();
1205    return true;
1206  }
1207  
1208  /// A tentative parsing action that can also revert token annotations.
1209  class Parser::UnannotatedTentativeParsingAction : public TentativeParsingAction {
1210  public:
UnannotatedTentativeParsingAction(Parser & Self,tok::TokenKind EndKind)1211    explicit UnannotatedTentativeParsingAction(Parser &Self,
1212                                               tok::TokenKind EndKind)
1213        : TentativeParsingAction(Self), Self(Self), EndKind(EndKind) {
1214      // Stash away the old token stream, so we can restore it once the
1215      // tentative parse is complete.
1216      TentativeParsingAction Inner(Self);
1217      Self.ConsumeAndStoreUntil(EndKind, Toks, true, /*ConsumeFinalToken*/false);
1218      Inner.Revert();
1219    }
1220  
RevertAnnotations()1221    void RevertAnnotations() {
1222      Revert();
1223  
1224      // Put back the original tokens.
1225      Self.SkipUntil(EndKind, StopAtSemi | StopBeforeMatch);
1226      if (Toks.size()) {
1227        auto Buffer = std::make_unique<Token[]>(Toks.size());
1228        std::copy(Toks.begin() + 1, Toks.end(), Buffer.get());
1229        Buffer[Toks.size() - 1] = Self.Tok;
1230        Self.PP.EnterTokenStream(std::move(Buffer), Toks.size(), true,
1231                                 /*IsReinject*/ true);
1232  
1233        Self.Tok = Toks.front();
1234      }
1235    }
1236  
1237  private:
1238    Parser &Self;
1239    CachedTokens Toks;
1240    tok::TokenKind EndKind;
1241  };
1242  
1243  /// ConsumeAndStoreInitializer - Consume and store the token at the passed token
1244  /// container until the end of the current initializer expression (either a
1245  /// default argument or an in-class initializer for a non-static data member).
1246  ///
1247  /// Returns \c true if we reached the end of something initializer-shaped,
1248  /// \c false if we bailed out.
ConsumeAndStoreInitializer(CachedTokens & Toks,CachedInitKind CIK)1249  bool Parser::ConsumeAndStoreInitializer(CachedTokens &Toks,
1250                                          CachedInitKind CIK) {
1251    // We always want this function to consume at least one token if not at EOF.
1252    bool IsFirstToken = true;
1253  
1254    // Number of possible unclosed <s we've seen so far. These might be templates,
1255    // and might not, but if there were none of them (or we know for sure that
1256    // we're within a template), we can avoid a tentative parse.
1257    unsigned AngleCount = 0;
1258    unsigned KnownTemplateCount = 0;
1259  
1260    while (true) {
1261      switch (Tok.getKind()) {
1262      case tok::comma:
1263        // If we might be in a template, perform a tentative parse to check.
1264        if (!AngleCount)
1265          // Not a template argument: this is the end of the initializer.
1266          return true;
1267        if (KnownTemplateCount)
1268          goto consume_token;
1269  
1270        // We hit a comma inside angle brackets. This is the hard case. The
1271        // rule we follow is:
1272        //  * For a default argument, if the tokens after the comma form a
1273        //    syntactically-valid parameter-declaration-clause, in which each
1274        //    parameter has an initializer, then this comma ends the default
1275        //    argument.
1276        //  * For a default initializer, if the tokens after the comma form a
1277        //    syntactically-valid init-declarator-list, then this comma ends
1278        //    the default initializer.
1279        {
1280          UnannotatedTentativeParsingAction PA(*this,
1281                                               CIK == CIK_DefaultInitializer
1282                                                 ? tok::semi : tok::r_paren);
1283          Sema::TentativeAnalysisScope Scope(Actions);
1284  
1285          TPResult Result = TPResult::Error;
1286          ConsumeToken();
1287          switch (CIK) {
1288          case CIK_DefaultInitializer:
1289            Result = TryParseInitDeclaratorList();
1290            // If we parsed a complete, ambiguous init-declarator-list, this
1291            // is only syntactically-valid if it's followed by a semicolon.
1292            if (Result == TPResult::Ambiguous && Tok.isNot(tok::semi))
1293              Result = TPResult::False;
1294            break;
1295  
1296          case CIK_DefaultArgument:
1297            bool InvalidAsDeclaration = false;
1298            Result = TryParseParameterDeclarationClause(
1299                &InvalidAsDeclaration, /*VersusTemplateArg=*/true);
1300            // If this is an expression or a declaration with a missing
1301            // 'typename', assume it's not a declaration.
1302            if (Result == TPResult::Ambiguous && InvalidAsDeclaration)
1303              Result = TPResult::False;
1304            break;
1305          }
1306  
1307          // Put the token stream back and undo any annotations we performed
1308          // after the comma. They may reflect a different parse than the one
1309          // we will actually perform at the end of the class.
1310          PA.RevertAnnotations();
1311  
1312          // If what follows could be a declaration, it is a declaration.
1313          if (Result != TPResult::False && Result != TPResult::Error)
1314            return true;
1315        }
1316  
1317        // Keep going. We know we're inside a template argument list now.
1318        ++KnownTemplateCount;
1319        goto consume_token;
1320  
1321      case tok::eof:
1322      case tok::annot_module_begin:
1323      case tok::annot_module_end:
1324      case tok::annot_module_include:
1325      case tok::annot_repl_input_end:
1326        // Ran out of tokens.
1327        return false;
1328  
1329      case tok::less:
1330        // FIXME: A '<' can only start a template-id if it's preceded by an
1331        // identifier, an operator-function-id, or a literal-operator-id.
1332        ++AngleCount;
1333        goto consume_token;
1334  
1335      case tok::question:
1336        // In 'a ? b : c', 'b' can contain an unparenthesized comma. If it does,
1337        // that is *never* the end of the initializer. Skip to the ':'.
1338        if (!ConsumeAndStoreConditional(Toks))
1339          return false;
1340        break;
1341  
1342      case tok::greatergreatergreater:
1343        if (!getLangOpts().CPlusPlus11)
1344          goto consume_token;
1345        if (AngleCount) --AngleCount;
1346        if (KnownTemplateCount) --KnownTemplateCount;
1347        [[fallthrough]];
1348      case tok::greatergreater:
1349        if (!getLangOpts().CPlusPlus11)
1350          goto consume_token;
1351        if (AngleCount) --AngleCount;
1352        if (KnownTemplateCount) --KnownTemplateCount;
1353        [[fallthrough]];
1354      case tok::greater:
1355        if (AngleCount) --AngleCount;
1356        if (KnownTemplateCount) --KnownTemplateCount;
1357        goto consume_token;
1358  
1359      case tok::kw_template:
1360        // 'template' identifier '<' is known to start a template argument list,
1361        // and can be used to disambiguate the parse.
1362        // FIXME: Support all forms of 'template' unqualified-id '<'.
1363        Toks.push_back(Tok);
1364        ConsumeToken();
1365        if (Tok.is(tok::identifier)) {
1366          Toks.push_back(Tok);
1367          ConsumeToken();
1368          if (Tok.is(tok::less)) {
1369            ++AngleCount;
1370            ++KnownTemplateCount;
1371            Toks.push_back(Tok);
1372            ConsumeToken();
1373          }
1374        }
1375        break;
1376  
1377      case tok::kw_operator:
1378        // If 'operator' precedes other punctuation, that punctuation loses
1379        // its special behavior.
1380        Toks.push_back(Tok);
1381        ConsumeToken();
1382        switch (Tok.getKind()) {
1383        case tok::comma:
1384        case tok::greatergreatergreater:
1385        case tok::greatergreater:
1386        case tok::greater:
1387        case tok::less:
1388          Toks.push_back(Tok);
1389          ConsumeToken();
1390          break;
1391        default:
1392          break;
1393        }
1394        break;
1395  
1396      case tok::l_paren:
1397        // Recursively consume properly-nested parens.
1398        Toks.push_back(Tok);
1399        ConsumeParen();
1400        ConsumeAndStoreUntil(tok::r_paren, Toks, /*StopAtSemi=*/false);
1401        break;
1402      case tok::l_square:
1403        // Recursively consume properly-nested square brackets.
1404        Toks.push_back(Tok);
1405        ConsumeBracket();
1406        ConsumeAndStoreUntil(tok::r_square, Toks, /*StopAtSemi=*/false);
1407        break;
1408      case tok::l_brace:
1409        // Recursively consume properly-nested braces.
1410        Toks.push_back(Tok);
1411        ConsumeBrace();
1412        ConsumeAndStoreUntil(tok::r_brace, Toks, /*StopAtSemi=*/false);
1413        break;
1414  
1415      // Okay, we found a ']' or '}' or ')', which we think should be balanced.
1416      // Since the user wasn't looking for this token (if they were, it would
1417      // already be handled), this isn't balanced.  If there is a LHS token at a
1418      // higher level, we will assume that this matches the unbalanced token
1419      // and return it.  Otherwise, this is a spurious RHS token, which we
1420      // consume and pass on to downstream code to diagnose.
1421      case tok::r_paren:
1422        if (CIK == CIK_DefaultArgument)
1423          return true; // End of the default argument.
1424        if (ParenCount && !IsFirstToken)
1425          return false;
1426        Toks.push_back(Tok);
1427        ConsumeParen();
1428        continue;
1429      case tok::r_square:
1430        if (BracketCount && !IsFirstToken)
1431          return false;
1432        Toks.push_back(Tok);
1433        ConsumeBracket();
1434        continue;
1435      case tok::r_brace:
1436        if (BraceCount && !IsFirstToken)
1437          return false;
1438        Toks.push_back(Tok);
1439        ConsumeBrace();
1440        continue;
1441  
1442      case tok::code_completion:
1443        Toks.push_back(Tok);
1444        ConsumeCodeCompletionToken();
1445        break;
1446  
1447      case tok::string_literal:
1448      case tok::wide_string_literal:
1449      case tok::utf8_string_literal:
1450      case tok::utf16_string_literal:
1451      case tok::utf32_string_literal:
1452        Toks.push_back(Tok);
1453        ConsumeStringToken();
1454        break;
1455      case tok::semi:
1456        if (CIK == CIK_DefaultInitializer)
1457          return true; // End of the default initializer.
1458        [[fallthrough]];
1459      default:
1460      consume_token:
1461        Toks.push_back(Tok);
1462        ConsumeToken();
1463        break;
1464      }
1465      IsFirstToken = false;
1466    }
1467  }
1468