ParseCXXInlineMethods.cpp revision 263508
137535Sdes//===--- ParseCXXInlineMethods.cpp - C++ class inline methods parsing------===//
2262560Sdes//
337535Sdes//                     The LLVM Compiler Infrastructure
437535Sdes//
537535Sdes// This file is distributed under the University of Illinois Open Source
637535Sdes// License. See LICENSE.TXT for details.
737535Sdes//
837535Sdes//===----------------------------------------------------------------------===//
937535Sdes//
1037535Sdes//  This file implements parsing for C++ class inline methods.
1137535Sdes//
1237535Sdes//===----------------------------------------------------------------------===//
1337535Sdes
1437535Sdes#include "clang/Parse/Parser.h"
1563012Sdes#include "RAIIObjectsForParser.h"
1637535Sdes#include "clang/AST/DeclTemplate.h"
1737535Sdes#include "clang/Parse/ParseDiagnostic.h"
1837535Sdes#include "clang/Sema/DeclSpec.h"
1937535Sdes#include "clang/Sema/Scope.h"
2037535Sdesusing namespace clang;
2137535Sdes
2237535Sdes/// Get the FunctionDecl for a function or function template decl.
2337535Sdesstatic FunctionDecl *getFunctionDecl(Decl *D) {
2437535Sdes  if (FunctionDecl *fn = dyn_cast<FunctionDecl>(D))
2537535Sdes    return fn;
2637535Sdes  return cast<FunctionTemplateDecl>(D)->getTemplatedDecl();
2737535Sdes}
2837535Sdes
2984203Sdillon/// ParseCXXInlineMethodDef - We parsed and verified that the specified
3084203Sdillon/// Declarator is a well formed C++ inline method definition. Now lex its body
3184203Sdillon/// and store its tokens for parsing after the C++ class is complete.
3263236SdesNamedDecl *Parser::ParseCXXInlineMethodDef(AccessSpecifier AS,
3363236Sdes                                      AttributeList *AccessAttrs,
3463236Sdes                                      ParsingDeclarator &D,
3563236Sdes                                      const ParsedTemplateInfo &TemplateInfo,
3663236Sdes                                      const VirtSpecifiers& VS,
3763236Sdes                                      FunctionDefinitionKind DefinitionKind,
3863236Sdes                                      ExprResult& Init) {
3963236Sdes  assert(D.isFunctionDeclarator() && "This isn't a function declarator!");
4063236Sdes  assert((Tok.is(tok::l_brace) || Tok.is(tok::colon) || Tok.is(tok::kw_try) ||
4163236Sdes          Tok.is(tok::equal)) &&
4263236Sdes         "Current token not a '{', ':', '=', or 'try'!");
4363236Sdes
4463236Sdes  MultiTemplateParamsArg TemplateParams(
4563236Sdes          TemplateInfo.TemplateParams ? TemplateInfo.TemplateParams->data() : 0,
4663236Sdes          TemplateInfo.TemplateParams ? TemplateInfo.TemplateParams->size() : 0);
4763236Sdes
4863236Sdes  NamedDecl *FnD;
4990267Sdes  D.setFunctionDefinitionKind(DefinitionKind);
5063236Sdes  if (D.getDeclSpec().isFriendSpecified())
5163236Sdes    FnD = Actions.ActOnFriendFunctionDecl(getCurScope(), D,
5263236Sdes                                          TemplateParams);
5363236Sdes  else {
5463236Sdes    FnD = Actions.ActOnCXXMemberDeclarator(getCurScope(), AS, D,
5563236Sdes                                           TemplateParams, 0,
5663236Sdes                                           VS, ICIS_NoInit);
5763236Sdes    if (FnD) {
5863236Sdes      Actions.ProcessDeclAttributeList(getCurScope(), FnD, AccessAttrs);
5963236Sdes      bool TypeSpecContainsAuto = D.getDeclSpec().containsPlaceholderType();
6063236Sdes      if (Init.isUsable())
6163236Sdes        Actions.AddInitializerToDecl(FnD, Init.get(), false,
6263236Sdes                                     TypeSpecContainsAuto);
6363236Sdes      else
6437535Sdes        Actions.ActOnUninitializedDecl(FnD, TypeSpecContainsAuto);
6560737Sume    }
66186124Smurray  }
6737535Sdes
6863012Sdes  HandleMemberFunctionDeclDelays(D, FnD);
6937535Sdes
7063012Sdes  D.complete(FnD);
7160376Sdes
7260189Sdes  if (Tok.is(tok::equal)) {
7337608Sdes    ConsumeToken();
7437535Sdes
7537535Sdes    if (!FnD) {
7637535Sdes      SkipUntil(tok::semi);
7760376Sdes      return 0;
7837535Sdes    }
79240496Sdes
80240496Sdes    bool Delete = false;
81240496Sdes    SourceLocation KWLoc;
82240496Sdes    if (Tok.is(tok::kw_delete)) {
83240496Sdes      Diag(Tok, getLangOpts().CPlusPlus11 ?
84240496Sdes           diag::warn_cxx98_compat_deleted_function :
85240496Sdes           diag::ext_deleted_function);
86202613Sdes
87240496Sdes      KWLoc = ConsumeToken();
8837535Sdes      Actions.SetDeclDeleted(FnD, KWLoc);
89141958Skbyanc      Delete = true;
90141958Skbyanc    } else if (Tok.is(tok::kw_default)) {
91141958Skbyanc      Diag(Tok, getLangOpts().CPlusPlus11 ?
9237535Sdes           diag::warn_cxx98_compat_defaulted_function :
9340939Sdes           diag::ext_defaulted_function);
9441862Sdes
9537535Sdes      KWLoc = ConsumeToken();
9663012Sdes      Actions.SetDeclDefaulted(FnD, KWLoc);
97241839Seadler    } else {
9837535Sdes      llvm_unreachable("function definition after = not 'delete' or 'default'");
9963012Sdes    }
10063012Sdes
10163012Sdes    if (Tok.is(tok::comma)) {
10263012Sdes      Diag(KWLoc, diag::err_default_delete_in_multiple_declaration)
10363012Sdes        << Delete;
10463012Sdes      SkipUntil(tok::semi);
105186124Smurray    } else {
106241841Seadler      ExpectAndConsume(tok::semi, diag::err_expected_semi_after,
107169386Sdes                       Delete ? "delete" : "default", tok::semi);
108241840Seadler    }
10963012Sdes
11087317Sdes    return FnD;
111125696Sdes  }
11263012Sdes
11360196Sdes  // In delayed template parsing mode, if we are within a class template
11463012Sdes  // or if we are about to parse function member template then consume
11590267Sdes  // the tokens and store them for parsing at the end of the translation unit.
116169386Sdes  if (getLangOpts().DelayedTemplateParsing &&
117241841Seadler      DefinitionKind == FDK_Definition &&
11890267Sdes      !D.getDeclSpec().isConstexprSpecified() &&
11963012Sdes      !(FnD && getFunctionDecl(FnD) &&
12088771Sdes          getFunctionDecl(FnD)->getResultType()->getContainedAutoType()) &&
12163012Sdes      ((Actions.CurContext->isDependentContext() ||
12290267Sdes        (TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate &&
12363012Sdes         TemplateInfo.Kind != ParsedTemplateInfo::ExplicitSpecialization)) &&
12463012Sdes       !Actions.IsInsideALocalClassWithinATemplateFunction())) {
12563012Sdes
12663012Sdes    CachedTokens Toks;
12797859Sdes    LexTemplateFunctionForLateParsing(Toks);
12837535Sdes
12997858Sdes    if (FnD) {
13097866Sdes      FunctionDecl *FD = getFunctionDecl(FnD);
13197858Sdes      Actions.CheckForFunctionRedefinition(FD);
13297866Sdes      Actions.MarkAsLateParsedTemplate(FD, FnD, Toks);
133294194Sdes    }
134294194Sdes
13597858Sdes    return FnD;
13697858Sdes  }
13797858Sdes
13863281Sdes  // Consume the tokens and store them for later parsing.
13990267Sdes
14063012Sdes  LexedMethod* LM = new LexedMethod(this, FnD);
14137535Sdes  getCurrentClass().LateParsedDeclarations.push_back(LM);
14237535Sdes  LM->TemplateScope = getCurScope()->isTemplateParamScope();
14337608Sdes  CachedTokens &Toks = LM->Toks;
14463012Sdes
14537608Sdes  tok::TokenKind kind = Tok.getKind();
14637608Sdes  // Consume everything up to (and including) the left brace of the
147174588Sdes  // function body.
14837608Sdes  if (ConsumeAndStoreFunctionPrologue(Toks)) {
14990267Sdes    // We didn't find the left-brace we expected after the
15090267Sdes    // constructor initializer; we already printed an error, and it's likely
151174588Sdes    // impossible to recover, so don't try to parse this method later.
15290267Sdes    // Skip over the rest of the decl and back to somewhere that looks
15390267Sdes    // reasonable.
154174761Sdes    SkipMalformedDecl();
15590267Sdes    delete getCurrentClass().LateParsedDeclarations.back();
15690267Sdes    getCurrentClass().LateParsedDeclarations.pop_back();
157174761Sdes    return FnD;
15890267Sdes  } else {
15990267Sdes    // Consume everything up to (and including) the matching right brace.
160174761Sdes    ConsumeAndStoreUntil(tok::r_brace, Toks, /*StopAtSemi=*/false);
16190267Sdes  }
162174761Sdes
16397859Sdes  // If we're in a function-try-block, we need to store all the catch blocks.
16490267Sdes  if (kind == tok::kw_try) {
16590267Sdes    while (Tok.is(tok::kw_catch)) {
16697859Sdes      ConsumeAndStoreUntil(tok::l_brace, Toks, /*StopAtSemi=*/false);
167176036Sdes      ConsumeAndStoreUntil(tok::r_brace, Toks, /*StopAtSemi=*/false);
16890267Sdes    }
16990267Sdes  }
17090267Sdes
17163281Sdes  if (FnD) {
17290267Sdes    // If this is a friend function, mark that it's late-parsed so that
17397859Sdes    // it's still known to be a definition even before we attach the
17497859Sdes    // parsed body.  Sema needs to treat friend function definitions
175106207Sdes    // differently during template instantiation, and it's possible for
17690267Sdes    // the containing class to be instantiated before all its member
177106207Sdes    // function definitions are parsed.
178106207Sdes    //
179106207Sdes    // If you remove this, you can remove the code that clears the flag
18090267Sdes    // after parsing the member.
18163012Sdes    if (D.getDeclSpec().isFriendSpecified()) {
18290267Sdes      FunctionDecl *FD = getFunctionDecl(FnD);
18397859Sdes      Actions.CheckForFunctionRedefinition(FD);
18437608Sdes      FD->setLateTemplateParsed(true);
18537608Sdes    }
18637608Sdes  } else {
18797866Sdes    // If semantic analysis could not build a function declaration,
18897866Sdes    // just throw away the late-parsed declaration.
18997866Sdes    delete getCurrentClass().LateParsedDeclarations.back();
190174588Sdes    getCurrentClass().LateParsedDeclarations.pop_back();
19197866Sdes  }
19297866Sdes
19397866Sdes  return FnD;
19497866Sdes}
19597866Sdes
19697866Sdes/// ParseCXXNonStaticMemberInitializer - We parsed and verified that the
19797866Sdes/// specified Declarator is a well formed C++ non-static data member
19897866Sdes/// declaration. Now lex its initializer and store its tokens for parsing
19997866Sdes/// after the class is complete.
20097866Sdesvoid Parser::ParseCXXNonStaticMemberInitializer(Decl *VarD) {
201106044Sdes  assert((Tok.is(tok::l_brace) || Tok.is(tok::equal)) &&
20297866Sdes         "Current token not a '{' or '='!");
20397866Sdes
20497866Sdes  LateParsedMemberInitializer *MI =
20537608Sdes    new LateParsedMemberInitializer(this, VarD);
20637608Sdes  getCurrentClass().LateParsedDeclarations.push_back(MI);
207262560Sdes  CachedTokens &Toks = MI->Toks;
208174588Sdes
20937535Sdes  tok::TokenKind kind = Tok.getKind();
210230307Sdes  if (kind == tok::equal) {
211262560Sdes    Toks.push_back(Tok);
212230307Sdes    ConsumeToken();
21397859Sdes  }
21490267Sdes
21597859Sdes  if (kind == tok::l_brace) {
21690267Sdes    // Begin by storing the '{' token.
21790267Sdes    Toks.push_back(Tok);
218294194Sdes    ConsumeBrace();
21997866Sdes
220174588Sdes    // Consume everything up to (and including) the matching right brace.
22197866Sdes    ConsumeAndStoreUntil(tok::r_brace, Toks, /*StopAtSemi=*/true);
222230307Sdes  } else {
223230307Sdes    // Consume everything up to (but excluding) the comma or semicolon.
22497866Sdes    ConsumeAndStoreInitializer(Toks, CIK_DefaultInitializer);
225106185Sdes  }
226230307Sdes
22797866Sdes  // Store an artificial EOF token to ensure that we don't run off the end of
22897866Sdes  // the initializer when we come to parse it.
22997866Sdes  Token Eof;
23097866Sdes  Eof.startToken();
231294194Sdes  Eof.setKind(tok::eof);
23297859Sdes  Eof.setLocation(Tok.getLocation());
233174588Sdes  Toks.push_back(Eof);
23490267Sdes}
235262560Sdes
23690267SdesParser::LateParsedDeclaration::~LateParsedDeclaration() {}
23790267Sdesvoid Parser::LateParsedDeclaration::ParseLexedMethodDeclarations() {}
23897859Sdesvoid Parser::LateParsedDeclaration::ParseLexedMemberInitializers() {}
23990267Sdesvoid Parser::LateParsedDeclaration::ParseLexedMethodDefs() {}
24090267Sdes
24137535SdesParser::LateParsedClass::LateParsedClass(Parser *P, ParsingClass *C)
24263012Sdes  : Self(P), Class(C) {}
243294194Sdes
24497866SdesParser::LateParsedClass::~LateParsedClass() {
24597866Sdes  Self->DeallocateParsedClasses(Class);
246174588Sdes}
24790267Sdes
248230307Sdesvoid Parser::LateParsedClass::ParseLexedMethodDeclarations() {
249230307Sdes  Self->ParseLexedMethodDeclarations(*Class);
25097866Sdes}
251106185Sdes
252294194Sdesvoid Parser::LateParsedClass::ParseLexedMemberInitializers() {
253230307Sdes  Self->ParseLexedMemberInitializers(*Class);
254294194Sdes}
25590267Sdes
25697859Sdesvoid Parser::LateParsedClass::ParseLexedMethodDefs() {
257262560Sdes  Self->ParseLexedMethodDefs(*Class);
258262560Sdes}
25990267Sdes
26090267Sdesvoid Parser::LateParsedMethodDeclaration::ParseLexedMethodDeclarations() {
26190267Sdes  Self->ParseLexedMethodDeclaration(*this);
26297866Sdes}
26337535Sdes
26437535Sdesvoid Parser::LexedMethod::ParseLexedMethodDefs() {
26537608Sdes  Self->ParseLexedMethodDef(*this);
26637608Sdes}
26737608Sdes
26837535Sdesvoid Parser::LateParsedMemberInitializer::ParseLexedMemberInitializers() {
269174588Sdes  Self->ParseLexedMemberInitializer(*this);
27037535Sdes}
27197859Sdes
272262560Sdes/// ParseLexedMethodDeclarations - We finished parsing the member
27363012Sdes/// specification of a top (non-nested) C++ class. Now go over the
27497859Sdes/// stack of method declarations with some parts for which parsing was
27590267Sdes/// delayed (such as default arguments) and parse them.
27697859Sdesvoid Parser::ParseLexedMethodDeclarations(ParsingClass &Class) {
27790267Sdes  bool HasTemplateScope = !Class.TopLevelClass && Class.TemplateScope;
27863012Sdes  ParseScope ClassTemplateScope(this, Scope::TemplateParamScope, HasTemplateScope);
279262560Sdes  TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
280262560Sdes  if (HasTemplateScope) {
281262560Sdes    Actions.ActOnReenterTemplateScope(getCurScope(), Class.TagOrTemplate);
282262560Sdes    ++CurTemplateDepthTracker;
283262560Sdes  }
284262560Sdes
285262560Sdes  // The current scope is still active if we're the top-level class.
286262560Sdes  // Otherwise we'll need to push and enter a new scope.
287262560Sdes  bool HasClassScope = !Class.TopLevelClass;
28890267Sdes  ParseScope ClassScope(this, Scope::ClassScope|Scope::DeclScope,
28937535Sdes                        HasClassScope);
290262560Sdes  if (HasClassScope)
291262560Sdes    Actions.ActOnStartDelayedMemberDeclarations(getCurScope(), Class.TagOrTemplate);
292262560Sdes
293262560Sdes  for (size_t i = 0; i < Class.LateParsedDeclarations.size(); ++i) {
294262560Sdes    Class.LateParsedDeclarations[i]->ParseLexedMethodDeclarations();
295262560Sdes  }
29637535Sdes
29737535Sdes  if (HasClassScope)
29837608Sdes    Actions.ActOnFinishDelayedMemberDeclarations(getCurScope(), Class.TagOrTemplate);
29937608Sdes}
30037608Sdes
30137535Sdesvoid Parser::ParseLexedMethodDeclaration(LateParsedMethodDeclaration &LM) {
302174588Sdes  // If this is a member template, introduce the template parameter scope.
30337535Sdes  ParseScope TemplateScope(this, Scope::TemplateParamScope, LM.TemplateScope);
30497859Sdes  TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
30590267Sdes  if (LM.TemplateScope) {
306174588Sdes    Actions.ActOnReenterTemplateScope(getCurScope(), LM.Method);
30737535Sdes    ++CurTemplateDepthTracker;
30837535Sdes  }
30937608Sdes  // Start the delayed C++ method declaration
31037608Sdes  Actions.ActOnStartDelayedCXXMethodDeclaration(getCurScope(), LM.Method);
31137608Sdes
31237535Sdes  // Introduce the parameters into scope and parse their default
313174588Sdes  // arguments.
31437535Sdes  ParseScope PrototypeScope(this, Scope::FunctionPrototypeScope |
31597859Sdes                            Scope::FunctionDeclarationScope | Scope::DeclScope);
31690267Sdes  for (unsigned I = 0, N = LM.DefaultArgs.size(); I != N; ++I) {
31763012Sdes    // Introduce the parameter into scope.
318174588Sdes    Actions.ActOnDelayedCXXMethodParameter(getCurScope(),
31997859Sdes                                           LM.DefaultArgs[I].Param);
32097859Sdes
32197859Sdes    if (CachedTokens *Toks = LM.DefaultArgs[I].Toks) {
32290267Sdes      // Save the current token position.
32337535Sdes      SourceLocation origLoc = Tok.getLocation();
32437535Sdes
32537608Sdes      // Parse the default argument from its saved token stream.
32663012Sdes      Toks->push_back(Tok); // So that the current token doesn't get lost
32737608Sdes      PP.EnterTokenStream(&Toks->front(), Toks->size(), true, false);
32863012Sdes
329174588Sdes      // Consume the previously-pushed token.
33037535Sdes      ConsumeAnyToken();
33197859Sdes
33290267Sdes      // Consume the '='.
33363012Sdes      assert(Tok.is(tok::equal) && "Default argument not starting with '='");
334109967Sdes      SourceLocation EqualLoc = ConsumeToken();
335174588Sdes
33690267Sdes      // The argument isn't actually potentially evaluated unless it is
33790267Sdes      // used.
33897859Sdes      EnterExpressionEvaluationContext Eval(Actions,
33997866Sdes                                            Sema::PotentiallyEvaluatedIfUsed,
340174588Sdes                                            LM.DefaultArgs[I].Param);
34190267Sdes
342174588Sdes      ExprResult DefArgResult;
34397859Sdes      if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {
34490267Sdes        Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
34590267Sdes        DefArgResult = ParseBraceInitializer();
34690267Sdes      } else
34763012Sdes        DefArgResult = ParseAssignmentExpression();
34863012Sdes      if (DefArgResult.isInvalid())
34990267Sdes        Actions.ActOnParamDefaultArgumentError(LM.DefaultArgs[I].Param);
35063012Sdes      else {
35163012Sdes        if (Tok.is(tok::cxx_defaultarg_end))
35263012Sdes          ConsumeToken();
35363012Sdes        else {
35463012Sdes          // The last two tokens are the terminator and the saved value of
35563012Sdes          // Tok; the last token in the default argument is the one before
35690267Sdes          // those.
35790267Sdes          assert(Toks->size() >= 3 && "expected a token in default arg");
35890267Sdes          Diag(Tok.getLocation(), diag::err_default_arg_unparsed)
35990267Sdes            << SourceRange(Tok.getLocation(),
36090267Sdes                           (*Toks)[Toks->size() - 3].getLocation());
36190267Sdes        }
36290267Sdes        Actions.ActOnParamDefaultArgument(LM.DefaultArgs[I].Param, EqualLoc,
36390267Sdes                                          DefArgResult.take());
36490267Sdes      }
365202613Sdes
366202613Sdes      assert(!PP.getSourceManager().isBeforeInTranslationUnit(origLoc,
36785093Sdes                                                         Tok.getLocation()) &&
36863012Sdes             "ParseAssignmentExpression went over the default arg tokens!");
36963012Sdes      // There could be leftover tokens (e.g. because of an error).
37063012Sdes      // Skip through until we reach the original token position.
37190267Sdes      while (Tok.getLocation() != origLoc && Tok.isNot(tok::eof))
37290267Sdes        ConsumeAnyToken();
37363012Sdes
37490267Sdes      delete Toks;
37590267Sdes      LM.DefaultArgs[I].Toks = 0;
37690267Sdes    }
37790267Sdes  }
37890267Sdes
37990267Sdes  PrototypeScope.Exit();
380202613Sdes
38190267Sdes  // Finish the delayed C++ method declaration.
38263012Sdes  Actions.ActOnFinishDelayedCXXMethodDeclaration(getCurScope(), LM.Method);
38363012Sdes}
38463012Sdes
38563012Sdes/// ParseLexedMethodDefs - We finished parsing the member specification of a top
38663012Sdes/// (non-nested) C++ class. Now go over the stack of lexed methods that were
38763012Sdes/// collected during its parsing and parse them all.
388174588Sdesvoid Parser::ParseLexedMethodDefs(ParsingClass &Class) {
38963012Sdes  bool HasTemplateScope = !Class.TopLevelClass && Class.TemplateScope;
39090267Sdes  ParseScope ClassTemplateScope(this, Scope::TemplateParamScope, HasTemplateScope);
39190267Sdes  TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
39290267Sdes  if (HasTemplateScope) {
39390267Sdes    Actions.ActOnReenterTemplateScope(getCurScope(), Class.TagOrTemplate);
39463012Sdes    ++CurTemplateDepthTracker;
39590267Sdes  }
39690267Sdes  bool HasClassScope = !Class.TopLevelClass;
39790267Sdes  ParseScope ClassScope(this, Scope::ClassScope|Scope::DeclScope,
39890267Sdes                        HasClassScope);
39990267Sdes
40090267Sdes  for (size_t i = 0; i < Class.LateParsedDeclarations.size(); ++i) {
401174588Sdes    Class.LateParsedDeclarations[i]->ParseLexedMethodDefs();
40290267Sdes  }
40390267Sdes}
40490267Sdes
405174588Sdesvoid Parser::ParseLexedMethodDef(LexedMethod &LM) {
40690267Sdes  // If this is a member template, introduce the template parameter scope.
40790267Sdes  ParseScope TemplateScope(this, Scope::TemplateParamScope, LM.TemplateScope);
40890267Sdes  TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
409174588Sdes  if (LM.TemplateScope) {
41090267Sdes    Actions.ActOnReenterTemplateScope(getCurScope(), LM.D);
41190267Sdes    ++CurTemplateDepthTracker;
41290267Sdes  }
41390267Sdes  // Save the current token position.
41463012Sdes  SourceLocation origLoc = Tok.getLocation();
41563012Sdes
41663012Sdes  assert(!LM.Toks.empty() && "Empty body!");
41763012Sdes  // Append the current token at the end of the new token stream so that it
41863012Sdes  // doesn't get lost.
41963012Sdes  LM.Toks.push_back(Tok);
420174588Sdes  PP.EnterTokenStream(LM.Toks.data(), LM.Toks.size(), true, false);
42163012Sdes
42290267Sdes  // Consume the previously pushed token.
42390267Sdes  ConsumeAnyToken(/*ConsumeCodeCompletionTok=*/true);
424174588Sdes  assert((Tok.is(tok::l_brace) || Tok.is(tok::colon) || Tok.is(tok::kw_try))
42590267Sdes         && "Inline method not starting with '{', ':' or 'try'");
42690267Sdes
42790267Sdes  // Parse the method body. Function body parsing code is similar enough
42890267Sdes  // to be re-used for method bodies as well.
42990267Sdes  ParseScope FnScope(this, Scope::FnScope|Scope::DeclScope);
43090267Sdes  Actions.ActOnStartOfFunctionDef(getCurScope(), LM.D);
43190267Sdes
43290267Sdes  if (Tok.is(tok::kw_try)) {
43390267Sdes    ParseFunctionTryBlock(LM.D, FnScope);
43490267Sdes    assert(!PP.getSourceManager().isBeforeInTranslationUnit(origLoc,
43597856Sdes                                                         Tok.getLocation()) &&
43690267Sdes           "ParseFunctionTryBlock went over the cached tokens!");
43797856Sdes    // There could be leftover tokens (e.g. because of an error).
43890267Sdes    // Skip through until we reach the original token position.
43990267Sdes    while (Tok.getLocation() != origLoc && Tok.isNot(tok::eof))
44090267Sdes      ConsumeAnyToken();
44190267Sdes    return;
44290267Sdes  }
443174761Sdes  if (Tok.is(tok::colon)) {
444174761Sdes    ParseConstructorInitializer(LM.D);
445174761Sdes
446174761Sdes    // Error recovery.
44790267Sdes    if (!Tok.is(tok::l_brace)) {
44890267Sdes      FnScope.Exit();
44997856Sdes      Actions.ActOnFinishFunctionBody(LM.D, 0);
45097856Sdes      while (Tok.getLocation() != origLoc && Tok.isNot(tok::eof))
45137535Sdes        ConsumeAnyToken();
45237535Sdes      return;
45337608Sdes    }
45490267Sdes  } else
45590267Sdes    Actions.ActOnDefaultCtorInitializers(LM.D);
45663012Sdes
45775891Sarchie  assert((Actions.getDiagnostics().hasErrorOccurred() ||
458174588Sdes          !isa<FunctionTemplateDecl>(LM.D) ||
45963012Sdes          cast<FunctionTemplateDecl>(LM.D)->getTemplateParameters()->getDepth()
460176036Sdes            < TemplateParameterDepth) &&
461176036Sdes         "TemplateParameterDepth should be greater than the depth of "
46290267Sdes         "current template being instantiated!");
46390267Sdes
46490267Sdes  ParseFunctionStatementBody(LM.D, FnScope);
465174761Sdes
46690267Sdes  // Clear the late-template-parsed bit if we set it before.
46790267Sdes  if (LM.D) getFunctionDecl(LM.D)->setLateTemplateParsed(false);
46863012Sdes
46963012Sdes  if (Tok.getLocation() != origLoc) {
470202613Sdes    // Due to parsing error, we either went over the cached tokens or
47163012Sdes    // there are still cached tokens left. If it's the latter case skip the
472202613Sdes    // leftover tokens.
473202613Sdes    // Since this is an uncommon situation that should be avoided, use the
474202613Sdes    // expensive isBeforeInTranslationUnit call.
475221821Sdes    if (PP.getSourceManager().isBeforeInTranslationUnit(Tok.getLocation(),
476202613Sdes                                                        origLoc))
477202613Sdes      while (Tok.getLocation() != origLoc && Tok.isNot(tok::eof))
478202613Sdes        ConsumeAnyToken();
479202613Sdes  }
480202613Sdes}
481202613Sdes
482202613Sdes/// ParseLexedMemberInitializers - We finished parsing the member specification
483221821Sdes/// of a top (non-nested) C++ class. Now go over the stack of lexed data member
484202613Sdes/// initializers that were collected during its parsing and parse them all.
485202613Sdesvoid Parser::ParseLexedMemberInitializers(ParsingClass &Class) {
486202613Sdes  bool HasTemplateScope = !Class.TopLevelClass && Class.TemplateScope;
487202613Sdes  ParseScope ClassTemplateScope(this, Scope::TemplateParamScope,
48863012Sdes                                HasTemplateScope);
489202613Sdes  TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
490202613Sdes  if (HasTemplateScope) {
491202613Sdes    Actions.ActOnReenterTemplateScope(getCurScope(), Class.TagOrTemplate);
492202613Sdes    ++CurTemplateDepthTracker;
493202613Sdes  }
494202613Sdes  // Set or update the scope flags.
495202613Sdes  bool AlreadyHasClassScope = Class.TopLevelClass;
496202613Sdes  unsigned ScopeFlags = Scope::ClassScope|Scope::DeclScope;
497202613Sdes  ParseScope ClassScope(this, ScopeFlags, !AlreadyHasClassScope);
498202613Sdes  ParseScopeFlags ClassScopeFlags(this, ScopeFlags, AlreadyHasClassScope);
499202613Sdes
500202613Sdes  if (!AlreadyHasClassScope)
501202613Sdes    Actions.ActOnStartDelayedMemberDeclarations(getCurScope(),
50263012Sdes                                                Class.TagOrTemplate);
503202613Sdes
504202613Sdes  if (!Class.LateParsedDeclarations.empty()) {
505202613Sdes    // C++11 [expr.prim.general]p4:
506202613Sdes    //   Otherwise, if a member-declarator declares a non-static data member
50790267Sdes    //  (9.2) of a class X, the expression this is a prvalue of type "pointer
508221821Sdes    //  to X" within the optional brace-or-equal-initializer. It shall not
509202613Sdes    //  appear elsewhere in the member-declarator.
510202613Sdes    Sema::CXXThisScopeRAII ThisScope(Actions, Class.TagOrTemplate,
511202613Sdes                                     /*TypeQuals=*/(unsigned)0);
512202613Sdes
513202613Sdes    for (size_t i = 0; i < Class.LateParsedDeclarations.size(); ++i) {
514202613Sdes      Class.LateParsedDeclarations[i]->ParseLexedMemberInitializers();
515202613Sdes    }
516202613Sdes  }
517221821Sdes
518202613Sdes  if (!AlreadyHasClassScope)
519202613Sdes    Actions.ActOnFinishDelayedMemberDeclarations(getCurScope(),
520221821Sdes                                                 Class.TagOrTemplate);
521202613Sdes
52297856Sdes  Actions.ActOnFinishDelayedMemberInitializers(Class.TagOrTemplate);
52397856Sdes}
524202613Sdes
525202613Sdesvoid Parser::ParseLexedMemberInitializer(LateParsedMemberInitializer &MI) {
526202613Sdes  if (!MI.Field || MI.Field->isInvalidDecl())
527202613Sdes    return;
528202613Sdes
529221820Sdes  // Append the current token at the end of the new token stream so that it
530202613Sdes  // doesn't get lost.
531221821Sdes  MI.Toks.push_back(Tok);
532202613Sdes  PP.EnterTokenStream(MI.Toks.data(), MI.Toks.size(), true, false);
533221821Sdes
534202613Sdes  // Consume the previously pushed token.
535202613Sdes  ConsumeAnyToken(/*ConsumeCodeCompletionTok=*/true);
53697856Sdes
53797856Sdes  SourceLocation EqualLoc;
538202613Sdes
539202613Sdes  ExprResult Init = ParseCXXMemberInitializer(MI.Field, /*IsFunction=*/false,
540202613Sdes                                              EqualLoc);
541202613Sdes
542202613Sdes  Actions.ActOnCXXInClassMemberInitializer(MI.Field, EqualLoc, Init.release());
543202613Sdes
544202613Sdes  // The next token should be our artificial terminating EOF token.
545202613Sdes  if (Tok.isNot(tok::eof)) {
546202613Sdes    SourceLocation EndLoc = PP.getLocForEndOfToken(PrevTokLocation);
547202613Sdes    if (!EndLoc.isValid())
548221821Sdes      EndLoc = Tok.getLocation();
549202613Sdes    // No fixit; we can't recover as if there were a semicolon here.
550221821Sdes    Diag(EndLoc, diag::err_expected_semi_decl_list);
551221821Sdes
552202613Sdes    // Consume tokens until we hit the artificial EOF.
553202613Sdes    while (Tok.isNot(tok::eof))
554202613Sdes      ConsumeAnyToken();
555202613Sdes  }
556221821Sdes  ConsumeAnyToken();
557202613Sdes}
558202613Sdes
559202613Sdes/// ConsumeAndStoreUntil - Consume and store the token at the passed token
560221821Sdes/// container until the token 'T' is reached (which gets
561202613Sdes/// consumed/stored too, if ConsumeFinalToken).
562202613Sdes/// If StopAtSemi is true, then we will stop early at a ';' character.
563202613Sdes/// Returns true if token 'T1' or 'T2' was found.
564202613Sdes/// NOTE: This is a specialized version of Parser::SkipUntil.
565202613Sdesbool Parser::ConsumeAndStoreUntil(tok::TokenKind T1, tok::TokenKind T2,
566202613Sdes                                  CachedTokens &Toks,
567202613Sdes                                  bool StopAtSemi, bool ConsumeFinalToken) {
568202613Sdes  // We always want this function to consume at least one token if the first
569202613Sdes  // token isn't T and if not at EOF.
570202613Sdes  bool isFirstTokenConsumed = true;
571202613Sdes  while (1) {
572202613Sdes    // If we found one of the tokens, stop and return true.
573202613Sdes    if (Tok.is(T1) || Tok.is(T2)) {
574202613Sdes      if (ConsumeFinalToken) {
575202613Sdes        Toks.push_back(Tok);
576221821Sdes        ConsumeAnyToken();
577202613Sdes      }
57890267Sdes      return true;
57990267Sdes    }
58090267Sdes
58190267Sdes    switch (Tok.getKind()) {
58290267Sdes    case tok::eof:
58390267Sdes      // Ran out of tokens.
58490267Sdes      return false;
585202613Sdes
58690267Sdes    case tok::l_paren:
587202613Sdes      // Recursively consume properly-nested parens.
58890267Sdes      Toks.push_back(Tok);
58963012Sdes      ConsumeParen();
59063012Sdes      ConsumeAndStoreUntil(tok::r_paren, Toks, /*StopAtSemi=*/false);
591202613Sdes      break;
592202613Sdes    case tok::l_square:
593202613Sdes      // Recursively consume properly-nested square brackets.
594202613Sdes      Toks.push_back(Tok);
595221821Sdes      ConsumeBracket();
596221821Sdes      ConsumeAndStoreUntil(tok::r_square, Toks, /*StopAtSemi=*/false);
597202613Sdes      break;
598202613Sdes    case tok::l_brace:
599221821Sdes      // Recursively consume properly-nested braces.
600221821Sdes      Toks.push_back(Tok);
601202613Sdes      ConsumeBrace();
602202613Sdes      ConsumeAndStoreUntil(tok::r_brace, Toks, /*StopAtSemi=*/false);
603202613Sdes      break;
604202613Sdes
605202613Sdes    // Okay, we found a ']' or '}' or ')', which we think should be balanced.
606202613Sdes    // Since the user wasn't looking for this token (if they were, it would
607202613Sdes    // already be handled), this isn't balanced.  If there is a LHS token at a
608202613Sdes    // higher level, we will assume that this matches the unbalanced token
609202613Sdes    // and return it.  Otherwise, this is a spurious RHS token, which we skip.
610202613Sdes    case tok::r_paren:
611202613Sdes      if (ParenCount && !isFirstTokenConsumed)
612202613Sdes        return false;  // Matches something.
613202613Sdes      Toks.push_back(Tok);
614202613Sdes      ConsumeParen();
615202613Sdes      break;
616202613Sdes    case tok::r_square:
617202613Sdes      if (BracketCount && !isFirstTokenConsumed)
618202613Sdes        return false;  // Matches something.
619202613Sdes      Toks.push_back(Tok);
620202613Sdes      ConsumeBracket();
621202613Sdes      break;
622202613Sdes    case tok::r_brace:
623202613Sdes      if (BraceCount && !isFirstTokenConsumed)
624202613Sdes        return false;  // Matches something.
625202613Sdes      Toks.push_back(Tok);
626202613Sdes      ConsumeBrace();
627202613Sdes      break;
628202613Sdes
629202613Sdes    case tok::code_completion:
630202613Sdes      Toks.push_back(Tok);
631202613Sdes      ConsumeCodeCompletionToken();
632202613Sdes      break;
633202613Sdes
634202613Sdes    case tok::string_literal:
635202613Sdes    case tok::wide_string_literal:
636202613Sdes    case tok::utf8_string_literal:
637202613Sdes    case tok::utf16_string_literal:
638202613Sdes    case tok::utf32_string_literal:
639202613Sdes      Toks.push_back(Tok);
640202613Sdes      ConsumeStringToken();
641221821Sdes      break;
642202613Sdes    case tok::semi:
643202613Sdes      if (StopAtSemi)
644202613Sdes        return false;
645202613Sdes      // FALL THROUGH.
646202613Sdes    default:
647202613Sdes      // consume this token.
648202613Sdes      Toks.push_back(Tok);
649221821Sdes      ConsumeToken();
650202613Sdes      break;
651202613Sdes    }
652221821Sdes    isFirstTokenConsumed = false;
653202613Sdes  }
654221821Sdes}
655202613Sdes
656221821Sdes/// \brief Consume tokens and store them in the passed token container until
657202613Sdes/// we've passed the try keyword and constructor initializers and have consumed
658221821Sdes/// the opening brace of the function body. The opening brace will be consumed
659202613Sdes/// if and only if there was no error.
660221821Sdes///
661202613Sdes/// \return True on error.
662202613Sdesbool Parser::ConsumeAndStoreFunctionPrologue(CachedTokens &Toks) {
663202613Sdes  if (Tok.is(tok::kw_try)) {
664202613Sdes    Toks.push_back(Tok);
665202613Sdes    ConsumeToken();
666202613Sdes  }
667202613Sdes
668202613Sdes  if (Tok.isNot(tok::colon)) {
669202613Sdes    // Easy case, just a function body.
670202613Sdes
671202613Sdes    // Grab any remaining garbage to be diagnosed later. We stop when we reach a
672202613Sdes    // brace: an opening one is the function body, while a closing one probably
673221821Sdes    // means we've reached the end of the class.
674202613Sdes    ConsumeAndStoreUntil(tok::l_brace, tok::r_brace, Toks,
675202613Sdes                         /*StopAtSemi=*/true,
676202613Sdes                         /*ConsumeFinalToken=*/false);
677202613Sdes    if (Tok.isNot(tok::l_brace))
678202613Sdes      return Diag(Tok.getLocation(), diag::err_expected_lbrace);
679202613Sdes
680202613Sdes    Toks.push_back(Tok);
681202613Sdes    ConsumeBrace();
682221821Sdes    return false;
683202613Sdes  }
684202613Sdes
685202613Sdes  Toks.push_back(Tok);
686202613Sdes  ConsumeToken();
687202613Sdes
688202613Sdes  // We can't reliably skip over a mem-initializer-id, because it could be
689202613Sdes  // a template-id involving not-yet-declared names. Given:
690202613Sdes  //
691202613Sdes  //   S ( ) : a < b < c > ( e )
692202613Sdes  //
693202613Sdes  // 'e' might be an initializer or part of a template argument, depending
694202613Sdes  // on whether 'b' is a template.
695202613Sdes
696221821Sdes  // Track whether we might be inside a template argument. We can give
697202613Sdes  // significantly better diagnostics if we know that we're not.
698202613Sdes  bool MightBeTemplateArgument = false;
699202613Sdes
700202613Sdes  while (true) {
701202613Sdes    // Skip over the mem-initializer-id, if possible.
702202613Sdes    if (Tok.is(tok::kw_decltype)) {
703221821Sdes      Toks.push_back(Tok);
704202613Sdes      SourceLocation OpenLoc = ConsumeToken();
705202613Sdes      if (Tok.isNot(tok::l_paren))
706221821Sdes        return Diag(Tok.getLocation(), diag::err_expected_lparen_after)
707202613Sdes                 << "decltype";
708221821Sdes      Toks.push_back(Tok);
709202613Sdes      ConsumeParen();
710202613Sdes      if (!ConsumeAndStoreUntil(tok::r_paren, Toks, /*StopAtSemi=*/true)) {
711202613Sdes        Diag(Tok.getLocation(), diag::err_expected_rparen);
712202613Sdes        Diag(OpenLoc, diag::note_matching) << "(";
713202613Sdes        return true;
714202613Sdes      }
715202613Sdes    }
716202613Sdes    do {
717202613Sdes      // Walk over a component of a nested-name-specifier.
718202613Sdes      if (Tok.is(tok::coloncolon)) {
719202613Sdes        Toks.push_back(Tok);
720202613Sdes        ConsumeToken();
721202613Sdes
722202613Sdes        if (Tok.is(tok::kw_template)) {
723202613Sdes          Toks.push_back(Tok);
724202613Sdes          ConsumeToken();
725202613Sdes        }
726202613Sdes      }
727202613Sdes
728202613Sdes      if (Tok.is(tok::identifier) || Tok.is(tok::kw_template)) {
729202613Sdes        Toks.push_back(Tok);
730202613Sdes        ConsumeToken();
731202613Sdes      } else if (Tok.is(tok::code_completion)) {
732202613Sdes        Toks.push_back(Tok);
733202613Sdes        ConsumeCodeCompletionToken();
734202613Sdes        // Consume the rest of the initializers permissively.
735202613Sdes        // FIXME: We should be able to perform code-completion here even if
736202613Sdes        //        there isn't a subsequent '{' token.
737221821Sdes        MightBeTemplateArgument = true;
738202613Sdes        break;
739202613Sdes      } else {
740202613Sdes        break;
741202613Sdes      }
742202613Sdes    } while (Tok.is(tok::coloncolon));
743202613Sdes
744202613Sdes    if (Tok.is(tok::less))
745202613Sdes      MightBeTemplateArgument = true;
746202613Sdes
747202613Sdes    if (MightBeTemplateArgument) {
748202613Sdes      // We may be inside a template argument list. Grab up to the start of the
749221821Sdes      // next parenthesized initializer or braced-init-list. This *might* be the
750202613Sdes      // initializer, or it might be a subexpression in the template argument
751202613Sdes      // list.
752202613Sdes      // FIXME: Count angle brackets, and clear MightBeTemplateArgument
753202613Sdes      //        if all angles are closed.
754202613Sdes      if (!ConsumeAndStoreUntil(tok::l_paren, tok::l_brace, Toks,
755202613Sdes                                /*StopAtSemi=*/true,
756202613Sdes                                /*ConsumeFinalToken=*/false)) {
757202613Sdes        // We're not just missing the initializer, we're also missing the
758202613Sdes        // function body!
759202613Sdes        return Diag(Tok.getLocation(), diag::err_expected_lbrace);
760202613Sdes      }
761202613Sdes    } else if (Tok.isNot(tok::l_paren) && Tok.isNot(tok::l_brace)) {
762202613Sdes      // We found something weird in a mem-initializer-id.
763202613Sdes      return Diag(Tok.getLocation(), getLangOpts().CPlusPlus11
764202613Sdes                                         ? diag::err_expected_lparen_or_lbrace
765202613Sdes                                         : diag::err_expected_lparen);
766202613Sdes    }
767202613Sdes
768202613Sdes    tok::TokenKind kind = Tok.getKind();
769202613Sdes    Toks.push_back(Tok);
770202613Sdes    bool IsLParen = (kind == tok::l_paren);
771202613Sdes    SourceLocation OpenLoc = Tok.getLocation();
772202613Sdes
773221821Sdes    if (IsLParen) {
774202613Sdes      ConsumeParen();
775202613Sdes    } else {
776202613Sdes      assert(kind == tok::l_brace && "Must be left paren or brace here.");
777202613Sdes      ConsumeBrace();
778202613Sdes      // In C++03, this has to be the start of the function body, which
779202613Sdes      // means the initializer is malformed; we'll diagnose it later.
780202613Sdes      if (!getLangOpts().CPlusPlus11)
781202613Sdes        return false;
782202613Sdes    }
783202613Sdes
784202613Sdes    // Grab the initializer (or the subexpression of the template argument).
785202613Sdes    // FIXME: If we support lambdas here, we'll need to set StopAtSemi to false
786221821Sdes    //        if we might be inside the braces of a lambda-expression.
787221821Sdes    if (!ConsumeAndStoreUntil(IsLParen ? tok::r_paren : tok::r_brace,
788202613Sdes                              Toks, /*StopAtSemi=*/true)) {
789202613Sdes      Diag(Tok, IsLParen ? diag::err_expected_rparen :
790202613Sdes                           diag::err_expected_rbrace);
791202613Sdes      Diag(OpenLoc, diag::note_matching) << (IsLParen ? "(" : "{");
792202613Sdes      return true;
793221821Sdes    }
794202613Sdes
795202613Sdes    // Grab pack ellipsis, if present.
796202613Sdes    if (Tok.is(tok::ellipsis)) {
797202613Sdes      Toks.push_back(Tok);
798202613Sdes      ConsumeToken();
799202613Sdes    }
800202613Sdes
801202613Sdes    // If we know we just consumed a mem-initializer, we must have ',' or '{'
802202613Sdes    // next.
803202613Sdes    if (Tok.is(tok::comma)) {
804202613Sdes      Toks.push_back(Tok);
805202613Sdes      ConsumeToken();
806202613Sdes    } else if (Tok.is(tok::l_brace)) {
807202613Sdes      // This is the function body if the ')' or '}' is immediately followed by
808202613Sdes      // a '{'. That cannot happen within a template argument, apart from the
809202613Sdes      // case where a template argument contains a compound literal:
810202613Sdes      //
811202613Sdes      //   S ( ) : a < b < c > ( d ) { }
812221821Sdes      //   // End of declaration, or still inside the template argument?
813202613Sdes      //
814202613Sdes      // ... and the case where the template argument contains a lambda:
815221821Sdes      //
816202613Sdes      //   S ( ) : a < 0 && b < c > ( d ) + [ ] ( ) { return 0; }
817202613Sdes      //     ( ) > ( ) { }
818221821Sdes      //
819202613Sdes      // FIXME: Disambiguate these cases. Note that the latter case is probably
820202613Sdes      //        going to be made ill-formed by core issue 1607.
821221821Sdes      Toks.push_back(Tok);
822202613Sdes      ConsumeBrace();
823202613Sdes      return false;
824221821Sdes    } else if (!MightBeTemplateArgument) {
825202613Sdes      return Diag(Tok.getLocation(), diag::err_expected_lbrace_or_comma);
826202613Sdes    }
827221821Sdes  }
828202613Sdes}
829202613Sdes
830202613Sdes/// \brief Consume and store tokens from the '?' to the ':' in a conditional
831202613Sdes/// expression.
832202613Sdesbool Parser::ConsumeAndStoreConditional(CachedTokens &Toks) {
833221821Sdes  // Consume '?'.
834221821Sdes  assert(Tok.is(tok::question));
835221821Sdes  Toks.push_back(Tok);
836221821Sdes  ConsumeToken();
837202613Sdes
838202613Sdes  while (Tok.isNot(tok::colon)) {
839202613Sdes    if (!ConsumeAndStoreUntil(tok::question, tok::colon, Toks, /*StopAtSemi*/true,
840202613Sdes                              /*ConsumeFinalToken*/false))
841202613Sdes      return false;
842202613Sdes
843202613Sdes    // If we found a nested conditional, consume it.
844202613Sdes    if (Tok.is(tok::question) && !ConsumeAndStoreConditional(Toks))
845202613Sdes      return false;
846202613Sdes  }
847202613Sdes
848202613Sdes  // Consume ':'.
849202613Sdes  Toks.push_back(Tok);
850202613Sdes  ConsumeToken();
851202613Sdes  return true;
852202613Sdes}
853221821Sdes
854221821Sdes/// \brief A tentative parsing action that can also revert token annotations.
855221821Sdesclass Parser::UnannotatedTentativeParsingAction : public TentativeParsingAction {
856221821Sdespublic:
857202613Sdes  explicit UnannotatedTentativeParsingAction(Parser &Self,
858202613Sdes                                             tok::TokenKind EndKind)
859202613Sdes      : TentativeParsingAction(Self), Self(Self), EndKind(EndKind) {
860202613Sdes    // Stash away the old token stream, so we can restore it once the
861202613Sdes    // tentative parse is complete.
862202613Sdes    TentativeParsingAction Inner(Self);
863202613Sdes    Self.ConsumeAndStoreUntil(EndKind, Toks, true, /*ConsumeFinalToken*/false);
864202613Sdes    Inner.Revert();
865202613Sdes  }
866202613Sdes
867202613Sdes  void RevertAnnotations() {
868202613Sdes    Revert();
86963012Sdes
87063012Sdes    // Put back the original tokens.
87163012Sdes    Self.SkipUntil(EndKind, StopAtSemi | StopBeforeMatch);
87263716Sdes    if (Toks.size()) {
873174588Sdes      Token *Buffer = new Token[Toks.size()];
87463012Sdes      std::copy(Toks.begin() + 1, Toks.end(), Buffer);
87590267Sdes      Buffer[Toks.size() - 1] = Self.Tok;
87690267Sdes      Self.PP.EnterTokenStream(Buffer, Toks.size(), true, /*Owned*/true);
87763012Sdes
878311863Sdes      Self.Tok = Toks.front();
87990267Sdes    }
88090267Sdes  }
881263325Sbdrewery
882263325Sbdreweryprivate:
883263325Sbdrewery  Parser &Self;
884263325Sbdrewery  CachedTokens Toks;
885263325Sbdrewery  tok::TokenKind EndKind;
886263325Sbdrewery};
88790267Sdes
88890267Sdes/// ConsumeAndStoreInitializer - Consume and store the token at the passed token
88990267Sdes/// container until the end of the current initializer expression (either a
89090267Sdes/// default argument or an in-class initializer for a non-static data member).
89190267Sdes/// The final token is not consumed.
89288769Sdesbool Parser::ConsumeAndStoreInitializer(CachedTokens &Toks,
89363012Sdes                                        CachedInitKind CIK) {
89463012Sdes  // We always want this function to consume at least one token if not at EOF.
89590267Sdes  bool IsFirstTokenConsumed = true;
89690267Sdes
89763012Sdes  // Number of possible unclosed <s we've seen so far. These might be templates,
89863012Sdes  // and might not, but if there were none of them (or we know for sure that
89963012Sdes  // we're within a template), we can avoid a tentative parse.
90063012Sdes  unsigned AngleCount = 0;
90163012Sdes  unsigned KnownTemplateCount = 0;
90263716Sdes
903174588Sdes  while (1) {
90463012Sdes    switch (Tok.getKind()) {
90590267Sdes    case tok::comma:
90690267Sdes      // If we might be in a template, perform a tentative parse to check.
907174761Sdes      if (!AngleCount)
90890267Sdes        // Not a template argument: this is the end of the initializer.
90990267Sdes        return true;
91090267Sdes      if (KnownTemplateCount)
91190267Sdes        goto consume_token;
91290267Sdes
91390267Sdes      // We hit a comma inside angle brackets. This is the hard case. The
91490267Sdes      // rule we follow is:
91563012Sdes      //  * For a default argument, if the tokens after the comma form a
91663012Sdes      //    syntactically-valid parameter-declaration-clause, in which each
91763012Sdes      //    parameter has an initializer, then this comma ends the default
91863012Sdes      //    argument.
91963012Sdes      //  * For a default initializer, if the tokens after the comma form a
92063716Sdes      //    syntactically-valid init-declarator-list, then this comma ends
921174588Sdes      //    the default initializer.
92263012Sdes      {
92390267Sdes        UnannotatedTentativeParsingAction PA(*this,
92463716Sdes                                             CIK == CIK_DefaultInitializer
92590267Sdes                                               ? tok::semi : tok::r_paren);
92690267Sdes        Sema::TentativeAnalysisScope Scope(Actions);
927125696Sdes
928125696Sdes        TPResult Result = TPResult::Error();
929125696Sdes        ConsumeToken();
930125696Sdes        switch (CIK) {
931125696Sdes        case CIK_DefaultInitializer:
932174761Sdes          Result = TryParseInitDeclaratorList();
933125696Sdes          // If we parsed a complete, ambiguous init-declarator-list, this
934125696Sdes          // is only syntactically-valid if it's followed by a semicolon.
935125696Sdes          if (Result == TPResult::Ambiguous() && Tok.isNot(tok::semi))
936174761Sdes            Result = TPResult::False();
937125696Sdes          break;
938125696Sdes
93990267Sdes        case CIK_DefaultArgument:
94090267Sdes          bool InvalidAsDeclaration = false;
941174761Sdes          Result = TryParseParameterDeclarationClause(
94290267Sdes              &InvalidAsDeclaration, /*VersusTemplateArgument*/true);
94390267Sdes          // If this is an expression or a declaration with a missing
94490267Sdes          // 'typename', assume it's not a declaration.
945125696Sdes          if (Result == TPResult::Ambiguous() && InvalidAsDeclaration)
946125696Sdes            Result = TPResult::False();
947125696Sdes          break;
948125696Sdes        }
949125696Sdes
950125696Sdes        // If what follows could be a declaration, it is a declaration.
951125696Sdes        if (Result != TPResult::False() && Result != TPResult::Error()) {
952125696Sdes          PA.Revert();
953125696Sdes          return true;
95490267Sdes        }
95590267Sdes
95690267Sdes        // In the uncommon case that we decide the following tokens are part
95763012Sdes        // of a template argument, revert any annotations we've performed in
95863012Sdes        // those tokens. We're not going to look them up until we've parsed
95990267Sdes        // the rest of the class, and that might add more declarations.
96063012Sdes        PA.RevertAnnotations();
96163012Sdes      }
96263012Sdes
96363012Sdes      // Keep going. We know we're inside a template argument list now.
96463012Sdes      ++KnownTemplateCount;
96537608Sdes      goto consume_token;
96637608Sdes
96762965Sdes    case tok::eof:
968174588Sdes      // Ran out of tokens.
96937608Sdes      return false;
97090267Sdes
97190267Sdes    case tok::less:
97290267Sdes      // FIXME: A '<' can only start a template-id if it's preceded by an
97390267Sdes      // identifier, an operator-function-id, or a literal-operator-id.
97490267Sdes      ++AngleCount;
97590267Sdes      goto consume_token;
97690267Sdes
97762965Sdes    case tok::question:
97890267Sdes      // In 'a ? b : c', 'b' can contain an unparenthesized comma. If it does,
979133280Sdes      // that is *never* the end of the initializer. Skip to the ':'.
98090267Sdes      if (!ConsumeAndStoreConditional(Toks))
98190267Sdes        return false;
98290267Sdes      break;
98337608Sdes
98490267Sdes    case tok::greatergreatergreater:
98590267Sdes      if (!getLangOpts().CPlusPlus11)
98690267Sdes        goto consume_token;
98790267Sdes      if (AngleCount) --AngleCount;
98890267Sdes      if (KnownTemplateCount) --KnownTemplateCount;
98990267Sdes      // Fall through.
99090267Sdes    case tok::greatergreater:
99190267Sdes      if (!getLangOpts().CPlusPlus11)
99290267Sdes        goto consume_token;
99337608Sdes      if (AngleCount) --AngleCount;
99490267Sdes      if (KnownTemplateCount) --KnownTemplateCount;
99590267Sdes      // Fall through.
99690267Sdes    case tok::greater:
99790267Sdes      if (AngleCount) --AngleCount;
99890267Sdes      if (KnownTemplateCount) --KnownTemplateCount;
99990267Sdes      goto consume_token;
100090267Sdes
100190267Sdes    case tok::kw_template:
100290267Sdes      // 'template' identifier '<' is known to start a template argument list,
100390267Sdes      // and can be used to disambiguate the parse.
100490267Sdes      // FIXME: Support all forms of 'template' unqualified-id '<'.
100590267Sdes      Toks.push_back(Tok);
100690267Sdes      ConsumeToken();
100790267Sdes      if (Tok.is(tok::identifier)) {
100890267Sdes        Toks.push_back(Tok);
100990267Sdes        ConsumeToken();
101090267Sdes        if (Tok.is(tok::less)) {
101190267Sdes          ++KnownTemplateCount;
101290267Sdes          Toks.push_back(Tok);
101390267Sdes          ConsumeToken();
101490267Sdes        }
101590267Sdes      }
101690267Sdes      break;
101790267Sdes
101837608Sdes    case tok::kw_operator:
101937608Sdes      // If 'operator' precedes other punctuation, that punctuation loses
1020202613Sdes      // its special behavior.
102137608Sdes      Toks.push_back(Tok);
1022202613Sdes      ConsumeToken();
1023202613Sdes      switch (Tok.getKind()) {
1024202613Sdes      case tok::comma:
1025202613Sdes      case tok::greatergreatergreater:
1026202613Sdes      case tok::greatergreater:
1027202613Sdes      case tok::greater:
1028202613Sdes      case tok::less:
1029202613Sdes        Toks.push_back(Tok);
1030202613Sdes        ConsumeToken();
1031202613Sdes        break;
1032202613Sdes      default:
1033202613Sdes        break;
1034202613Sdes      }
1035268900Sbapt      break;
1036202613Sdes
1037202613Sdes    case tok::l_paren:
1038221821Sdes      // Recursively consume properly-nested parens.
1039202613Sdes      Toks.push_back(Tok);
1040202613Sdes      ConsumeParen();
1041221821Sdes      ConsumeAndStoreUntil(tok::r_paren, Toks, /*StopAtSemi=*/false);
1042202613Sdes      break;
1043221821Sdes    case tok::l_square:
1044202613Sdes      // Recursively consume properly-nested square brackets.
1045221821Sdes      Toks.push_back(Tok);
1046202613Sdes      ConsumeBracket();
1047221821Sdes      ConsumeAndStoreUntil(tok::r_square, Toks, /*StopAtSemi=*/false);
1048202613Sdes      break;
1049202613Sdes    case tok::l_brace:
1050202613Sdes      // Recursively consume properly-nested braces.
1051202613Sdes      Toks.push_back(Tok);
1052202613Sdes      ConsumeBrace();
1053202613Sdes      ConsumeAndStoreUntil(tok::r_brace, Toks, /*StopAtSemi=*/false);
1054202613Sdes      break;
1055202613Sdes
1056202613Sdes    // Okay, we found a ']' or '}' or ')', which we think should be balanced.
1057202613Sdes    // Since the user wasn't looking for this token (if they were, it would
1058202613Sdes    // already be handled), this isn't balanced.  If there is a LHS token at a
1059202613Sdes    // higher level, we will assume that this matches the unbalanced token
1060202613Sdes    // and return it.  Otherwise, this is a spurious RHS token, which we skip.
1061202613Sdes    case tok::r_paren:
1062202613Sdes      if (CIK == CIK_DefaultArgument)
1063202613Sdes        return true; // End of the default argument.
1064202613Sdes      if (ParenCount && !IsFirstTokenConsumed)
1065202613Sdes        return false;  // Matches something.
1066202613Sdes      goto consume_token;
1067202613Sdes    case tok::r_square:
1068202613Sdes      if (BracketCount && !IsFirstTokenConsumed)
1069202613Sdes        return false;  // Matches something.
1070202613Sdes      goto consume_token;
1071202613Sdes    case tok::r_brace:
1072202613Sdes      if (BraceCount && !IsFirstTokenConsumed)
1073202613Sdes        return false;  // Matches something.
1074202613Sdes      goto consume_token;
1075202613Sdes
1076202613Sdes    case tok::code_completion:
1077202613Sdes      Toks.push_back(Tok);
1078202613Sdes      ConsumeCodeCompletionToken();
1079202613Sdes      break;
1080202613Sdes
1081202613Sdes    case tok::string_literal:
1082202613Sdes    case tok::wide_string_literal:
1083202613Sdes    case tok::utf8_string_literal:
1084202613Sdes    case tok::utf16_string_literal:
1085202613Sdes    case tok::utf32_string_literal:
1086202613Sdes      Toks.push_back(Tok);
1087202613Sdes      ConsumeStringToken();
1088202613Sdes      break;
1089202613Sdes    case tok::semi:
1090202613Sdes      if (CIK == CIK_DefaultInitializer)
1091202613Sdes        return true; // End of the default initializer.
1092202613Sdes      // FALL THROUGH.
1093202613Sdes    default:
1094202613Sdes    consume_token:
1095202613Sdes      Toks.push_back(Tok);
1096202613Sdes      ConsumeToken();
1097202613Sdes      break;
1098202613Sdes    }
1099202613Sdes    IsFirstTokenConsumed = false;
1100202613Sdes  }
1101202613Sdes}
1102221821Sdes