1 //===--- ParseCXXInlineMethods.cpp - C++ class inline methods parsing------===//
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
7 //===----------------------------------------------------------------------===//
9 // This file implements parsing for C++ class inline methods.
11 //===----------------------------------------------------------------------===//
13 #include "clang/AST/DeclTemplate.h"
14 #include "clang/Basic/DiagnosticParse.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"
21 using namespace clang
;
23 /// Parse the optional ("message") part of a deleted-function-body.
24 StringLiteral
*Parser::ParseCXXDeletedFunctionMessage() {
25 if (!Tok
.is(tok::l_paren
))
27 StringLiteral
*Message
= nullptr;
28 BalancedDelimiterTracker BT
{*this, tok::l_paren
};
31 if (isTokenStringLiteral()) {
32 ExprResult Res
= ParseUnevaluatedStringLiteralExpression();
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();
41 Diag(Tok
.getLocation(), diag::err_expected_string_literal
)
42 << /*Source='in'*/ 0 << "'delete'";
43 SkipUntil(tok::r_paren
, StopAtSemi
| StopBeforeMatch
);
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.
53 void Parser::SkipDeletedFunctionBody() {
54 if (!Tok
.is(tok::l_paren
))
57 BalancedDelimiterTracker BT
{*this, tok::l_paren
};
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
))
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.
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'!");
77 MultiTemplateParamsArg
TemplateParams(
78 TemplateInfo
.TemplateParams
? TemplateInfo
.TemplateParams
->data()
80 TemplateInfo
.TemplateParams
? TemplateInfo
.TemplateParams
->size() : 0);
83 if (D
.getDeclSpec().isFriendSpecified())
84 FnD
= Actions
.ActOnFriendFunctionDecl(getCurScope(), D
,
87 FnD
= Actions
.ActOnCXXMemberDeclarator(getCurScope(), AS
, D
,
88 TemplateParams
, nullptr,
91 Actions
.ProcessDeclAttributeList(getCurScope(), FnD
, AccessAttrs
);
92 if (PureSpecLoc
.isValid())
93 Actions
.ActOnPureSpecifier(FnD
, PureSpecLoc
);
98 HandleMemberFunctionDeclDelays(D
, FnD
);
102 if (TryConsumeToken(tok::equal
)) {
104 SkipUntil(tok::semi
);
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
)
116 StringLiteral
*Message
= ParseCXXDeletedFunctionMessage();
117 Actions
.SetDeclDeleted(FnD
, KWLoc
, Message
);
119 if (auto *DeclAsFunction
= dyn_cast
<FunctionDecl
>(FnD
)) {
120 DeclAsFunction
->setRangeEnd(KWEndLoc
);
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
);
132 llvm_unreachable("function definition after = not 'delete' or 'default'");
135 if (Tok
.is(tok::comma
)) {
136 Diag(KWLoc
, diag::err_default_delete_in_multiple_declaration
)
138 SkipUntil(tok::semi
);
139 } else if (ExpectAndConsume(tok::semi
, diag::err_expected_after
,
140 Delete
? "delete" : "default")) {
141 SkipUntil(tok::semi
);
147 if (SkipFunctionBodies
&& (!FnD
|| Actions
.canSkipFunctionBody(FnD
)) &&
148 trySkippingFunctionBody()) {
149 Actions
.ActOnSkippedFunctionBody(FnD
);
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())) {
167 LexTemplateFunctionForLateParsing(Toks
);
170 FunctionDecl
*FD
= FnD
->getAsFunction();
171 Actions
.CheckForFunctionRedefinition(FD
);
172 Actions
.MarkAsLateParsedTemplate(FD
, FnD
, Toks
);
178 // Consume the tokens and store them for later parsing.
180 LexedMethod
* LM
= new LexedMethod(this, FnD
);
181 getCurrentClass().LateParsedDeclarations
.push_back(LM
);
182 CachedTokens
&Toks
= LM
->Toks
;
184 tok::TokenKind kind
= Tok
.getKind();
185 // Consume everything up to (and including) the left brace of the
187 if (ConsumeAndStoreFunctionPrologue(Toks
)) {
188 // We didn't find the left-brace we expected after the
189 // constructor initializer.
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
);
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.
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
208 delete getCurrentClass().LateParsedDeclarations
.back();
209 getCurrentClass().LateParsedDeclarations
.pop_back();
212 // Consume everything up to (and including) the matching right brace.
213 ConsumeAndStoreUntil(tok::r_brace
, Toks
, /*StopAtSemi=*/false);
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);
225 FunctionDecl
*FD
= FnD
->getAsFunction();
226 // Track that this function will eventually have a body; Sema needs
228 Actions
.CheckForFunctionRedefinition(FD
);
229 FD
->setWillHaveBody(true);
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();
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.
244 void Parser::ParseCXXNonStaticMemberInitializer(Decl
*VarD
) {
245 assert(Tok
.isOneOf(tok::l_brace
, tok::equal
) &&
246 "Current token not a '{' or '='!");
248 LateParsedMemberInitializer
*MI
=
249 new LateParsedMemberInitializer(this, VarD
);
250 getCurrentClass().LateParsedDeclarations
.push_back(MI
);
251 CachedTokens
&Toks
= MI
->Toks
;
253 tok::TokenKind kind
= Tok
.getKind();
254 if (kind
== tok::equal
) {
259 if (kind
== tok::l_brace
) {
260 // Begin by storing the '{' token.
264 // Consume everything up to (and including) the matching right brace.
265 ConsumeAndStoreUntil(tok::r_brace
, Toks
, /*StopAtSemi=*/true);
267 // Consume everything up to (but excluding) the comma or semicolon.
268 ConsumeAndStoreInitializer(Toks
, CIK_DefaultInitializer
);
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.
275 Eof
.setKind(tok::eof
);
276 Eof
.setLocation(Tok
.getLocation());
277 Eof
.setEofData(VarD
);
281 Parser::LateParsedDeclaration::~LateParsedDeclaration() {}
282 void Parser::LateParsedDeclaration::ParseLexedMethodDeclarations() {}
283 void Parser::LateParsedDeclaration::ParseLexedMemberInitializers() {}
284 void Parser::LateParsedDeclaration::ParseLexedMethodDefs() {}
285 void Parser::LateParsedDeclaration::ParseLexedAttributes() {}
286 void Parser::LateParsedDeclaration::ParseLexedPragmas() {}
288 Parser::LateParsedClass::LateParsedClass(Parser
*P
, ParsingClass
*C
)
289 : Self(P
), Class(C
) {}
291 Parser::LateParsedClass::~LateParsedClass() {
292 Self
->DeallocateParsedClasses(Class
);
295 void Parser::LateParsedClass::ParseLexedMethodDeclarations() {
296 Self
->ParseLexedMethodDeclarations(*Class
);
299 void Parser::LateParsedClass::ParseLexedMemberInitializers() {
300 Self
->ParseLexedMemberInitializers(*Class
);
303 void Parser::LateParsedClass::ParseLexedMethodDefs() {
304 Self
->ParseLexedMethodDefs(*Class
);
307 void Parser::LateParsedClass::ParseLexedAttributes() {
308 Self
->ParseLexedAttributes(*Class
);
311 void Parser::LateParsedClass::ParseLexedPragmas() {
312 Self
->ParseLexedPragmas(*Class
);
315 void Parser::LateParsedMethodDeclaration::ParseLexedMethodDeclarations() {
316 Self
->ParseLexedMethodDeclaration(*this);
319 void Parser::LexedMethod::ParseLexedMethodDefs() {
320 Self
->ParseLexedMethodDef(*this);
323 void Parser::LateParsedMemberInitializer::ParseLexedMemberInitializers() {
324 Self
->ParseLexedMemberInitializer(*this);
327 void Parser::LateParsedAttribute::ParseLexedAttributes() {
328 Self
->ParseLexedAttribute(*this, true, false);
331 void Parser::LateParsedPragma::ParseLexedPragmas() {
332 Self
->ParseLexedPragma(*this);
335 /// Utility to re-enter a possibly-templated scope while parsing its
336 /// late-parsed components.
337 struct Parser::ReenterTemplateScopeRAII
{
339 MultiParseScope Scopes
;
340 TemplateParameterDepthRAII CurTemplateDepthTracker
;
342 ReenterTemplateScopeRAII(Parser
&P
, Decl
*MaybeTemplated
, bool Enter
= true)
343 : P(P
), Scopes(P
), CurTemplateDepthTracker(P
.TemplateParameterDepth
) {
345 CurTemplateDepthTracker
.addDepth(
346 P
.ReenterTemplateScopes(Scopes
, MaybeTemplated
));
351 /// Utility to re-enter a class scope while parsing its late-parsed components.
352 struct Parser::ReenterClassScopeRAII
: ReenterTemplateScopeRAII
{
355 ReenterClassScopeRAII(Parser
&P
, ParsingClass
&Class
)
356 : ReenterTemplateScopeRAII(P
, Class
.TagOrTemplate
,
357 /*Enter=*/!Class
.TopLevelClass
),
359 // If this is the top-level class, we're still within its scope.
360 if (Class
.TopLevelClass
)
363 // Re-enter the class scope itself.
364 Scopes
.Enter(Scope::ClassScope
|Scope::DeclScope
);
365 P
.Actions
.ActOnStartDelayedMemberDeclarations(P
.getCurScope(),
366 Class
.TagOrTemplate
);
368 ~ReenterClassScopeRAII() {
369 if (Class
.TopLevelClass
)
372 P
.Actions
.ActOnFinishDelayedMemberDeclarations(P
.getCurScope(),
373 Class
.TagOrTemplate
);
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.
381 void Parser::ParseLexedMethodDeclarations(ParsingClass
&Class
) {
382 ReenterClassScopeRAII
InClassScope(*this, Class
);
384 for (LateParsedDeclaration
*LateD
: Class
.LateParsedDeclarations
)
385 LateD
->ParseLexedMethodDeclarations();
388 void Parser::ParseLexedMethodDeclaration(LateParsedMethodDeclaration
&LM
) {
389 // If this is a member template, introduce the template parameter scope.
390 ReenterTemplateScopeRAII
InFunctionTemplateScope(*this, LM
.Method
);
392 // Start the delayed C++ method declaration
393 Actions
.ActOnStartDelayedCXXMethodDeclaration(getCurScope(), LM
.Method
);
395 // Introduce the parameters into scope and parse their default
397 InFunctionTemplateScope
.Scopes
.Enter(Scope::FunctionPrototypeScope
|
398 Scope::FunctionDeclarationScope
|
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
);
407 ParenBraceBracketBalancer
BalancerRAIIObj(*this);
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();
413 DefArgEnd
.startToken();
414 DefArgEnd
.setKind(tok::eof
);
415 DefArgEnd
.setLocation(LastDefaultArgToken
.getEndLoc());
416 DefArgEnd
.setEofData(Param
);
417 Toks
->push_back(DefArgEnd
);
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);
423 // Consume the previously-pushed token.
427 assert(Tok
.is(tok::equal
) && "Default argument not starting with '='");
428 SourceLocation EqualLoc
= ConsumeToken();
430 // The argument isn't actually potentially evaluated unless it is
432 EnterExpressionEvaluationContext
Eval(
434 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed
, Param
);
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();
441 DefArgResult
= ParseAssignmentExpression();
442 DefArgResult
= Actions
.CorrectDelayedTyposInExpr(DefArgResult
, Param
);
443 if (DefArgResult
.isInvalid()) {
444 Actions
.ActOnParamDefaultArgumentError(Param
, EqualLoc
,
445 /*DefaultArg=*/nullptr);
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
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());
456 Actions
.ActOnParamDefaultArgument(Param
, EqualLoc
,
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
))
465 if (Tok
.is(tok::eof
) && Tok
.getEofData() == Param
)
467 } else if (HasUnparsed
) {
468 assert(Param
->hasInheritedDefaultArg());
470 if (const auto *FunTmpl
= dyn_cast
<FunctionTemplateDecl
>(LM
.Method
))
472 cast
<FunctionDecl
>(FunTmpl
->getTemplatedDecl())->getPreviousDecl();
474 Old
= cast
<FunctionDecl
>(LM
.Method
)->getPreviousDecl();
476 ParmVarDecl
*OldParam
= Old
->getParamDecl(I
);
477 assert(!OldParam
->hasUnparsedDefaultArg());
478 if (OldParam
->hasUninstantiatedDefaultArg())
479 Param
->setUninstantiatedDefaultArg(
480 OldParam
->getUninstantiatedDefaultArg());
482 Param
->setDefaultArg(OldParam
->getInit());
487 // Parse a delayed exception-specification, if there is one.
488 if (CachedTokens
*Toks
= LM
.ExceptionSpecTokens
) {
489 ParenBraceBracketBalancer
BalancerRAIIObj(*this);
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
);
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);
504 // Consume the previously-pushed token.
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
513 CXXMethodDecl
*Method
;
514 FunctionDecl
*FunctionToPush
;
515 if (FunctionTemplateDecl
*FunTmpl
516 = dyn_cast
<FunctionTemplateDecl
>(LM
.Method
))
517 FunctionToPush
= FunTmpl
->getTemplatedDecl();
519 FunctionToPush
= cast
<FunctionDecl
>(LM
.Method
);
520 Method
= dyn_cast
<CXXMethodDecl
>(FunctionToPush
);
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.
527 // void ICE(int val) noexcept(noexcept([val]{}));
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();
537 Sema::CXXThisScopeRAII
ThisScope(
538 Actions
, Method
? Method
->getParent() : nullptr,
539 Method
? Method
->getMethodQualifiers() : Qualifiers
{},
540 Method
&& getLangOpts().CPlusPlus11
);
542 // Parse the exception-specification.
543 SourceRange SpecificationRange
;
544 SmallVector
<ParsedType
, 4> DynamicExceptions
;
545 SmallVector
<SourceRange
, 4> DynamicExceptionRanges
;
546 ExprResult NoexceptExpr
;
547 CachedTokens
*ExceptionSpecTokens
;
549 ExceptionSpecificationType EST
550 = tryParseExceptionSpecification(/*Delayed=*/false, SpecificationRange
,
552 DynamicExceptionRanges
, NoexceptExpr
,
553 ExceptionSpecTokens
);
555 if (Tok
.isNot(tok::eof
) || Tok
.getEofData() != LM
.Method
)
556 Diag(Tok
.getLocation(), diag::err_except_spec_unparsed
);
558 // Attach the exception-specification to the method.
559 Actions
.actOnDelayedExceptionSpecification(LM
.Method
, EST
,
562 DynamicExceptionRanges
,
563 NoexceptExpr
.isUsable()?
564 NoexceptExpr
.get() : nullptr);
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
))
571 // Clean up the remaining EOF token.
572 if (Tok
.is(tok::eof
) && Tok
.getEofData() == LM
.Method
)
576 LM
.ExceptionSpecTokens
= nullptr;
579 InFunctionTemplateScope
.Scopes
.Exit();
581 // Finish the delayed C++ method declaration.
582 Actions
.ActOnFinishDelayedCXXMethodDeclaration(getCurScope(), LM
.Method
);
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.
588 void Parser::ParseLexedMethodDefs(ParsingClass
&Class
) {
589 ReenterClassScopeRAII
InClassScope(*this, Class
);
591 for (LateParsedDeclaration
*D
: Class
.LateParsedDeclarations
)
592 D
->ParseLexedMethodDefs();
595 void Parser::ParseLexedMethodDef(LexedMethod
&LM
) {
596 // If this is a member template, introduce the template parameter scope.
597 ReenterTemplateScopeRAII
InFunctionTemplateScope(*this, LM
.D
);
599 ParenBraceBracketBalancer
BalancerRAIIObj(*this);
601 assert(!LM
.Toks
.empty() && "Empty body!");
602 Token LastBodyToken
= LM
.Toks
.back();
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
611 LM
.Toks
.push_back(Tok
);
612 PP
.EnterTokenStream(LM
.Toks
, true, /*IsReinject*/true);
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'");
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
);
625 Actions
.ActOnStartOfFunctionDef(getCurScope(), LM
.D
);
627 if (Tok
.is(tok::kw_try
)) {
628 ParseFunctionTryBlock(LM
.D
, FnScope
);
630 while (Tok
.isNot(tok::eof
))
633 if (Tok
.is(tok::eof
) && Tok
.getEofData() == LM
.D
)
637 if (Tok
.is(tok::colon
)) {
638 ParseConstructorInitializer(LM
.D
);
641 if (!Tok
.is(tok::l_brace
)) {
643 Actions
.ActOnFinishFunctionBody(LM
.D
, nullptr);
645 while (Tok
.isNot(tok::eof
))
648 if (Tok
.is(tok::eof
) && Tok
.getEofData() == LM
.D
)
653 Actions
.ActOnDefaultCtorInitializers(LM
.D
);
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!");
662 ParseFunctionStatementBody(LM
.D
, FnScope
);
664 while (Tok
.isNot(tok::eof
))
667 if (Tok
.is(tok::eof
) && Tok
.getEofData() == LM
.D
)
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
);
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.
679 void Parser::ParseLexedMemberInitializers(ParsingClass
&Class
) {
680 ReenterClassScopeRAII
InClassScope(*this, Class
);
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
,
692 for (LateParsedDeclaration
*D
: Class
.LateParsedDeclarations
)
693 D
->ParseLexedMemberInitializers();
696 Actions
.ActOnFinishDelayedMemberInitializers(Class
.TagOrTemplate
);
699 void Parser::ParseLexedMemberInitializer(LateParsedMemberInitializer
&MI
) {
700 if (!MI
.Field
|| MI
.Field
->isInvalidDecl())
703 ParenBraceBracketBalancer
BalancerRAIIObj(*this);
705 // Append the current token at the end of the new token stream so that it
707 MI
.Toks
.push_back(Tok
);
708 PP
.EnterTokenStream(MI
.Toks
, true, /*IsReinject*/true);
710 // Consume the previously pushed token.
711 ConsumeAnyToken(/*ConsumeCodeCompletionTok=*/true);
713 SourceLocation EqualLoc
;
715 Actions
.ActOnStartCXXInClassMemberInitializer();
717 // The initializer isn't actually potentially evaluated unless it is
719 EnterExpressionEvaluationContext
Eval(
720 Actions
, Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed
);
722 ExprResult Init
= ParseCXXMemberInitializer(MI
.Field
, /*IsFunction=*/false,
725 Actions
.ActOnFinishCXXInClassMemberInitializer(MI
.Field
, EqualLoc
,
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
);
738 // Consume tokens until we hit the artificial EOF.
739 while (Tok
.isNot(tok::eof
))
742 // Make sure this is *our* artificial EOF token.
743 if (Tok
.getEofData() == MI
.Field
)
747 /// Wrapper class which calls ParseLexedAttribute, after setting up the
748 /// scope appropriately.
749 void Parser::ParseLexedAttributes(ParsingClass
&Class
) {
750 ReenterClassScopeRAII
InClassScope(*this, Class
);
752 for (LateParsedDeclaration
*LateD
: Class
.LateParsedDeclarations
)
753 LateD
->ParseLexedAttributes();
756 /// Parse all attributes in LAs, and attach them to Decl D.
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
) {
764 ParseLexedAttribute(*LAs
[i
], EnterScope
, OnDefinition
);
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.
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
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
);
786 // Append the current token at the end of the new token stream so that it
788 LA
.Toks
.push_back(Tok
);
789 PP
.EnterTokenStream(LA
.Toks
, true, /*IsReinject=*/true);
790 // Consume the previously pushed token.
791 ConsumeAnyToken(/*ConsumeCodeCompletionTok=*/true);
793 ParsedAttributes
Attrs(AttrFactory
);
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());
800 // Allow 'this' within late-parsed attributes.
801 Sema::CXXThisScopeRAII
ThisScope(Actions
, RD
, Qualifiers(),
802 ND
&& ND
->isCXXInstanceMember());
804 if (LA
.Decls
.size() == 1) {
805 // If the Decl is templatized, add template parameters to scope.
806 ReenterTemplateScopeRAII
InDeclScope(*this, D
, EnterScope
);
808 // If the Decl is on a function, add function parameters to the scope.
809 bool HasFunScope
= EnterScope
&& D
->isFunctionOrFunctionTemplate();
811 InDeclScope
.Scopes
.Enter(Scope::FnScope
| Scope::DeclScope
|
812 Scope::CompoundStmtScope
);
813 Actions
.ActOnReenterFunctionContext(Actions
.CurScope
, D
);
816 ParseGNUAttributeArgs(&LA
.AttrName
, LA
.AttrNameLoc
, Attrs
, nullptr,
817 nullptr, SourceLocation(), ParsedAttr::Form::GNU(),
821 Actions
.ActOnExitFunctionContext();
823 // If there are multiple decls, then the decl cannot be within the
825 ParseGNUAttributeArgs(&LA
.AttrName
, LA
.AttrNameLoc
, Attrs
, nullptr,
826 nullptr, SourceLocation(), ParsedAttr::Form::GNU(),
830 Diag(Tok
, diag::warn_attribute_no_decl
) << LA
.AttrName
.getName();
833 if (OnDefinition
&& !Attrs
.empty() && !Attrs
.begin()->isCXX11Attribute() &&
834 Attrs
.begin()->isKnownToGCC())
835 Diag(Tok
, diag::warn_attribute_on_function_definition
)
838 for (unsigned i
= 0, ni
= LA
.Decls
.size(); i
< ni
; ++i
)
839 Actions
.ActOnFinishDelayedAttribute(getCurScope(), LA
.Decls
[i
], Attrs
);
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
))
846 if (Tok
.is(tok::eof
) && Tok
.getEofData() == AttrEnd
.getEofData())
850 void Parser::ParseLexedPragmas(ParsingClass
&Class
) {
851 ReenterClassScopeRAII
InClassScope(*this, Class
);
853 for (LateParsedDeclaration
*D
: Class
.LateParsedDeclarations
)
854 D
->ParseLexedPragmas();
857 void Parser::ParseLexedPragma(LateParsedPragma
&LP
) {
858 PP
.EnterToken(Tok
, /*IsReinject=*/true);
859 PP
.EnterTokenStream(LP
.toks(), /*DisableMacroExpansion=*/true,
860 /*IsReinject=*/true);
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
);
874 llvm_unreachable("Unexpected token.");
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.
884 bool Parser::ConsumeAndStoreUntil(tok::TokenKind T1
, tok::TokenKind T2
,
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;
891 // If we found one of the tokens, stop and return true.
892 if (Tok
.is(T1
) || Tok
.is(T2
)) {
893 if (ConsumeFinalToken
) {
900 switch (Tok
.getKind()) {
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.
910 // Recursively consume properly-nested parens.
913 ConsumeAndStoreUntil(tok::r_paren
, Toks
, /*StopAtSemi=*/false);
916 // Recursively consume properly-nested square brackets.
919 ConsumeAndStoreUntil(tok::r_square
, Toks
, /*StopAtSemi=*/false);
922 // Recursively consume properly-nested braces.
925 ConsumeAndStoreUntil(tok::r_brace
, Toks
, /*StopAtSemi=*/false);
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.
934 if (ParenCount
&& !isFirstTokenConsumed
)
935 return false; // Matches something.
940 if (BracketCount
&& !isFirstTokenConsumed
)
941 return false; // Matches something.
946 if (BraceCount
&& !isFirstTokenConsumed
)
947 return false; // Matches something.
957 // consume this token.
959 ConsumeAnyToken(/*ConsumeCodeCompletionTok*/true);
962 isFirstTokenConsumed
= false;
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.
971 /// \return True on error.
972 bool Parser::ConsumeAndStoreFunctionPrologue(CachedTokens
&Toks
) {
973 if (Tok
.is(tok::kw_try
)) {
978 if (Tok
.isNot(tok::colon
)) {
979 // Easy case, just a function body.
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
,
986 /*ConsumeFinalToken=*/false);
987 if (Tok
.isNot(tok::l_brace
))
988 return Diag(Tok
.getLocation(), diag::err_expected
) << tok::l_brace
;
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:
1001 // S ( ) : a < b < c > ( e )
1003 // 'e' might be an initializer or part of a template argument, depending
1004 // on whether 'b' is a template.
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;
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
)
1018 Toks
.push_back(Tok
);
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
;
1027 // Walk over a component of a nested-name-specifier.
1028 if (Tok
.is(tok::coloncolon
)) {
1029 Toks
.push_back(Tok
);
1032 if (Tok
.is(tok::kw_template
)) {
1033 Toks
.push_back(Tok
);
1038 if (Tok
.is(tok::identifier
)) {
1039 Toks
.push_back(Tok
);
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
);
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
;
1057 } while (Tok
.is(tok::coloncolon
));
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)
1069 if (Tok
.is(tok::comma
)) {
1070 // The initialization is missing, we'll diagnose it later.
1071 Toks
.push_back(Tok
);
1075 if (Tok
.is(tok::less
))
1076 MightBeTemplateArgument
= true;
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
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
1090 return Diag(Tok
.getLocation(), diag::err_expected
) << tok::l_brace
;
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
;
1098 return Diag(Tok
.getLocation(), diag::err_expected
) << tok::l_paren
;
1101 tok::TokenKind kind
= Tok
.getKind();
1102 Toks
.push_back(Tok
);
1103 bool IsLParen
= (kind
== tok::l_paren
);
1104 SourceLocation OpenLoc
= Tok
.getLocation();
1109 assert(kind
== tok::l_brace
&& "Must be left paren or brace here.");
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
)
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.
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
;
1147 // Grab pack ellipsis, if present.
1148 if (Tok
.is(tok::ellipsis
)) {
1149 Toks
.push_back(Tok
);
1153 // If we know we just consumed a mem-initializer, we must have ',' or '{'
1155 if (Tok
.is(tok::comma
)) {
1156 Toks
.push_back(Tok
);
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:
1163 // S ( ) : a < b < c > ( d ) { }
1164 // // End of declaration, or still inside the template argument?
1166 // ... and the case where the template argument contains a lambda:
1168 // S ( ) : a < 0 && b < c > ( d ) + [ ] ( ) { return 0; }
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
);
1176 } else if (!MightBeTemplateArgument
) {
1177 return Diag(Tok
.getLocation(), diag::err_expected_either
) << tok::l_brace
1183 /// Consume and store tokens from the '?' to the ':' in a conditional
1185 bool Parser::ConsumeAndStoreConditional(CachedTokens
&Toks
) {
1187 assert(Tok
.is(tok::question
));
1188 Toks
.push_back(Tok
);
1191 while (Tok
.isNot(tok::colon
)) {
1192 if (!ConsumeAndStoreUntil(tok::question
, tok::colon
, Toks
,
1193 /*StopAtSemi=*/true,
1194 /*ConsumeFinalToken=*/false))
1197 // If we found a nested conditional, consume it.
1198 if (Tok
.is(tok::question
) && !ConsumeAndStoreConditional(Toks
))
1203 Toks
.push_back(Tok
);
1208 /// ConsumeAndStoreInitializer - Consume and store the token at the passed token
1209 /// container until the end of the current initializer expression (either a
1210 /// default argument or an in-class initializer for a non-static data member).
1212 /// Returns \c true if we reached the end of something initializer-shaped,
1213 /// \c false if we bailed out.
1214 bool Parser::ConsumeAndStoreInitializer(CachedTokens
&Toks
,
1215 CachedInitKind CIK
) {
1216 // We always want this function to consume at least one token if not at EOF.
1217 bool IsFirstToken
= true;
1219 // Number of possible unclosed <s we've seen so far. These might be templates,
1220 // and might not, but if there were none of them (or we know for sure that
1221 // we're within a template), we can avoid a tentative parse.
1222 unsigned AngleCount
= 0;
1223 unsigned KnownTemplateCount
= 0;
1226 switch (Tok
.getKind()) {
1228 // If we might be in a template, perform a tentative parse to check.
1230 // Not a template argument: this is the end of the initializer.
1232 if (KnownTemplateCount
)
1235 // We hit a comma inside angle brackets. This is the hard case. The
1236 // rule we follow is:
1237 // * For a default argument, if the tokens after the comma form a
1238 // syntactically-valid parameter-declaration-clause, in which each
1239 // parameter has an initializer, then this comma ends the default
1241 // * For a default initializer, if the tokens after the comma form a
1242 // syntactically-valid init-declarator-list, then this comma ends
1243 // the default initializer.
1245 TentativeParsingAction
TPA(*this, /*Unannotated=*/true);
1246 Sema::TentativeAnalysisScope
Scope(Actions
);
1248 TPResult Result
= TPResult::Error
;
1251 case CIK_DefaultInitializer
:
1252 Result
= TryParseInitDeclaratorList();
1253 // If we parsed a complete, ambiguous init-declarator-list, this
1254 // is only syntactically-valid if it's followed by a semicolon.
1255 if (Result
== TPResult::Ambiguous
&& Tok
.isNot(tok::semi
))
1256 Result
= TPResult::False
;
1259 case CIK_DefaultArgument
:
1260 bool InvalidAsDeclaration
= false;
1261 Result
= TryParseParameterDeclarationClause(
1262 &InvalidAsDeclaration
, /*VersusTemplateArg=*/true);
1263 // If this is an expression or a declaration with a missing
1264 // 'typename', assume it's not a declaration.
1265 if (Result
== TPResult::Ambiguous
&& InvalidAsDeclaration
)
1266 Result
= TPResult::False
;
1270 // Put the token stream back and undo any annotations we performed
1271 // after the comma. They may reflect a different parse than the one
1272 // we will actually perform at the end of the class.
1275 // If what follows could be a declaration, it is a declaration.
1276 if (Result
!= TPResult::False
&& Result
!= TPResult::Error
)
1280 // Keep going. We know we're inside a template argument list now.
1281 ++KnownTemplateCount
;
1285 case tok::annot_module_begin
:
1286 case tok::annot_module_end
:
1287 case tok::annot_module_include
:
1288 case tok::annot_repl_input_end
:
1289 // Ran out of tokens.
1293 // FIXME: A '<' can only start a template-id if it's preceded by an
1294 // identifier, an operator-function-id, or a literal-operator-id.
1299 // In 'a ? b : c', 'b' can contain an unparenthesized comma. If it does,
1300 // that is *never* the end of the initializer. Skip to the ':'.
1301 if (!ConsumeAndStoreConditional(Toks
))
1305 case tok::greatergreatergreater
:
1306 if (!getLangOpts().CPlusPlus11
)
1308 if (AngleCount
) --AngleCount
;
1309 if (KnownTemplateCount
) --KnownTemplateCount
;
1311 case tok::greatergreater
:
1312 if (!getLangOpts().CPlusPlus11
)
1314 if (AngleCount
) --AngleCount
;
1315 if (KnownTemplateCount
) --KnownTemplateCount
;
1318 if (AngleCount
) --AngleCount
;
1319 if (KnownTemplateCount
) --KnownTemplateCount
;
1322 case tok::kw_template
:
1323 // 'template' identifier '<' is known to start a template argument list,
1324 // and can be used to disambiguate the parse.
1325 // FIXME: Support all forms of 'template' unqualified-id '<'.
1326 Toks
.push_back(Tok
);
1328 if (Tok
.is(tok::identifier
)) {
1329 Toks
.push_back(Tok
);
1331 if (Tok
.is(tok::less
)) {
1333 ++KnownTemplateCount
;
1334 Toks
.push_back(Tok
);
1340 case tok::kw_operator
:
1341 // If 'operator' precedes other punctuation, that punctuation loses
1342 // its special behavior.
1343 Toks
.push_back(Tok
);
1345 switch (Tok
.getKind()) {
1347 case tok::greatergreatergreater
:
1348 case tok::greatergreater
:
1351 Toks
.push_back(Tok
);
1360 // Recursively consume properly-nested parens.
1361 Toks
.push_back(Tok
);
1363 ConsumeAndStoreUntil(tok::r_paren
, Toks
, /*StopAtSemi=*/false);
1366 // Recursively consume properly-nested square brackets.
1367 Toks
.push_back(Tok
);
1369 ConsumeAndStoreUntil(tok::r_square
, Toks
, /*StopAtSemi=*/false);
1372 // Recursively consume properly-nested braces.
1373 Toks
.push_back(Tok
);
1375 ConsumeAndStoreUntil(tok::r_brace
, Toks
, /*StopAtSemi=*/false);
1378 // Okay, we found a ']' or '}' or ')', which we think should be balanced.
1379 // Since the user wasn't looking for this token (if they were, it would
1380 // already be handled), this isn't balanced. If there is a LHS token at a
1381 // higher level, we will assume that this matches the unbalanced token
1382 // and return it. Otherwise, this is a spurious RHS token, which we
1383 // consume and pass on to downstream code to diagnose.
1385 if (CIK
== CIK_DefaultArgument
)
1386 return true; // End of the default argument.
1387 if (ParenCount
&& !IsFirstToken
)
1389 Toks
.push_back(Tok
);
1393 if (BracketCount
&& !IsFirstToken
)
1395 Toks
.push_back(Tok
);
1399 if (BraceCount
&& !IsFirstToken
)
1401 Toks
.push_back(Tok
);
1405 case tok::code_completion
:
1406 Toks
.push_back(Tok
);
1407 ConsumeCodeCompletionToken();
1410 case tok::string_literal
:
1411 case tok::wide_string_literal
:
1412 case tok::utf8_string_literal
:
1413 case tok::utf16_string_literal
:
1414 case tok::utf32_string_literal
:
1415 Toks
.push_back(Tok
);
1416 ConsumeStringToken();
1419 if (CIK
== CIK_DefaultInitializer
)
1420 return true; // End of the default initializer.
1424 Toks
.push_back(Tok
);
1428 IsFirstToken
= false;