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/Parse/ParseDiagnostic.h"
15 #include "clang/Parse/Parser.h"
16 #include "clang/Parse/RAIIObjectsForParser.h"
17 #include "clang/Sema/DeclSpec.h"
18 #include "clang/Sema/EnterExpressionEvaluationContext.h"
19 #include "clang/Sema/Scope.h"
21 using namespace clang
;
23 /// ParseCXXInlineMethodDef - We parsed and verified that the specified
24 /// Declarator is a well formed C++ inline method definition. Now lex its body
25 /// and store its tokens for parsing after the C++ class is complete.
26 NamedDecl
*Parser::ParseCXXInlineMethodDef(
27 AccessSpecifier AS
, const ParsedAttributesView
&AccessAttrs
,
28 ParsingDeclarator
&D
, const ParsedTemplateInfo
&TemplateInfo
,
29 const VirtSpecifiers
&VS
, SourceLocation PureSpecLoc
) {
30 assert(D
.isFunctionDeclarator() && "This isn't a function declarator!");
31 assert(Tok
.isOneOf(tok::l_brace
, tok::colon
, tok::kw_try
, tok::equal
) &&
32 "Current token not a '{', ':', '=', or 'try'!");
34 MultiTemplateParamsArg
TemplateParams(
35 TemplateInfo
.TemplateParams
? TemplateInfo
.TemplateParams
->data()
37 TemplateInfo
.TemplateParams
? TemplateInfo
.TemplateParams
->size() : 0);
40 if (D
.getDeclSpec().isFriendSpecified())
41 FnD
= Actions
.ActOnFriendFunctionDecl(getCurScope(), D
,
44 FnD
= Actions
.ActOnCXXMemberDeclarator(getCurScope(), AS
, D
,
45 TemplateParams
, nullptr,
48 Actions
.ProcessDeclAttributeList(getCurScope(), FnD
, AccessAttrs
);
49 if (PureSpecLoc
.isValid())
50 Actions
.ActOnPureSpecifier(FnD
, PureSpecLoc
);
55 HandleMemberFunctionDeclDelays(D
, FnD
);
59 if (TryConsumeToken(tok::equal
)) {
67 SourceLocation KWEndLoc
= Tok
.getEndLoc().getLocWithOffset(-1);
68 if (TryConsumeToken(tok::kw_delete
, KWLoc
)) {
69 Diag(KWLoc
, getLangOpts().CPlusPlus11
70 ? diag::warn_cxx98_compat_defaulted_deleted_function
71 : diag::ext_defaulted_deleted_function
)
73 Actions
.SetDeclDeleted(FnD
, KWLoc
);
75 if (auto *DeclAsFunction
= dyn_cast
<FunctionDecl
>(FnD
)) {
76 DeclAsFunction
->setRangeEnd(KWEndLoc
);
78 } else if (TryConsumeToken(tok::kw_default
, KWLoc
)) {
79 Diag(KWLoc
, getLangOpts().CPlusPlus11
80 ? diag::warn_cxx98_compat_defaulted_deleted_function
81 : diag::ext_defaulted_deleted_function
)
83 Actions
.SetDeclDefaulted(FnD
, KWLoc
);
84 if (auto *DeclAsFunction
= dyn_cast
<FunctionDecl
>(FnD
)) {
85 DeclAsFunction
->setRangeEnd(KWEndLoc
);
88 llvm_unreachable("function definition after = not 'delete' or 'default'");
91 if (Tok
.is(tok::comma
)) {
92 Diag(KWLoc
, diag::err_default_delete_in_multiple_declaration
)
95 } else if (ExpectAndConsume(tok::semi
, diag::err_expected_after
,
96 Delete
? "delete" : "default")) {
103 if (SkipFunctionBodies
&& (!FnD
|| Actions
.canSkipFunctionBody(FnD
)) &&
104 trySkippingFunctionBody()) {
105 Actions
.ActOnSkippedFunctionBody(FnD
);
109 // In delayed template parsing mode, if we are within a class template
110 // or if we are about to parse function member template then consume
111 // the tokens and store them for parsing at the end of the translation unit.
112 if (getLangOpts().DelayedTemplateParsing
&&
113 D
.getFunctionDefinitionKind() == FunctionDefinitionKind::Definition
&&
114 !D
.getDeclSpec().hasConstexprSpecifier() &&
115 !(FnD
&& FnD
->getAsFunction() &&
116 FnD
->getAsFunction()->getReturnType()->getContainedAutoType()) &&
117 ((Actions
.CurContext
->isDependentContext() ||
118 (TemplateInfo
.Kind
!= ParsedTemplateInfo::NonTemplate
&&
119 TemplateInfo
.Kind
!= ParsedTemplateInfo::ExplicitSpecialization
)) &&
120 !Actions
.IsInsideALocalClassWithinATemplateFunction())) {
123 LexTemplateFunctionForLateParsing(Toks
);
126 FunctionDecl
*FD
= FnD
->getAsFunction();
127 Actions
.CheckForFunctionRedefinition(FD
);
128 Actions
.MarkAsLateParsedTemplate(FD
, FnD
, Toks
);
134 // Consume the tokens and store them for later parsing.
136 LexedMethod
* LM
= new LexedMethod(this, FnD
);
137 getCurrentClass().LateParsedDeclarations
.push_back(LM
);
138 CachedTokens
&Toks
= LM
->Toks
;
140 tok::TokenKind kind
= Tok
.getKind();
141 // Consume everything up to (and including) the left brace of the
143 if (ConsumeAndStoreFunctionPrologue(Toks
)) {
144 // We didn't find the left-brace we expected after the
145 // constructor initializer.
147 // If we're code-completing and the completion point was in the broken
148 // initializer, we want to parse it even though that will fail.
149 if (PP
.isCodeCompletionEnabled() &&
150 llvm::any_of(Toks
, [](const Token
&Tok
) {
151 return Tok
.is(tok::code_completion
);
153 // If we gave up at the completion point, the initializer list was
154 // likely truncated, so don't eat more tokens. We'll hit some extra
155 // errors, but they should be ignored in code completion.
159 // We already printed an error, and it's likely impossible to recover,
160 // so don't try to parse this method later.
161 // Skip over the rest of the decl and back to somewhere that looks
164 delete getCurrentClass().LateParsedDeclarations
.back();
165 getCurrentClass().LateParsedDeclarations
.pop_back();
168 // Consume everything up to (and including) the matching right brace.
169 ConsumeAndStoreUntil(tok::r_brace
, Toks
, /*StopAtSemi=*/false);
172 // If we're in a function-try-block, we need to store all the catch blocks.
173 if (kind
== tok::kw_try
) {
174 while (Tok
.is(tok::kw_catch
)) {
175 ConsumeAndStoreUntil(tok::l_brace
, Toks
, /*StopAtSemi=*/false);
176 ConsumeAndStoreUntil(tok::r_brace
, Toks
, /*StopAtSemi=*/false);
181 FunctionDecl
*FD
= FnD
->getAsFunction();
182 // Track that this function will eventually have a body; Sema needs
184 Actions
.CheckForFunctionRedefinition(FD
);
185 FD
->setWillHaveBody(true);
187 // If semantic analysis could not build a function declaration,
188 // just throw away the late-parsed declaration.
189 delete getCurrentClass().LateParsedDeclarations
.back();
190 getCurrentClass().LateParsedDeclarations
.pop_back();
196 /// ParseCXXNonStaticMemberInitializer - We parsed and verified that the
197 /// specified Declarator is a well formed C++ non-static data member
198 /// declaration. Now lex its initializer and store its tokens for parsing
199 /// after the class is complete.
200 void Parser::ParseCXXNonStaticMemberInitializer(Decl
*VarD
) {
201 assert(Tok
.isOneOf(tok::l_brace
, tok::equal
) &&
202 "Current token not a '{' or '='!");
204 LateParsedMemberInitializer
*MI
=
205 new LateParsedMemberInitializer(this, VarD
);
206 getCurrentClass().LateParsedDeclarations
.push_back(MI
);
207 CachedTokens
&Toks
= MI
->Toks
;
209 tok::TokenKind kind
= Tok
.getKind();
210 if (kind
== tok::equal
) {
215 if (kind
== tok::l_brace
) {
216 // Begin by storing the '{' token.
220 // Consume everything up to (and including) the matching right brace.
221 ConsumeAndStoreUntil(tok::r_brace
, Toks
, /*StopAtSemi=*/true);
223 // Consume everything up to (but excluding) the comma or semicolon.
224 ConsumeAndStoreInitializer(Toks
, CIK_DefaultInitializer
);
227 // Store an artificial EOF token to ensure that we don't run off the end of
228 // the initializer when we come to parse it.
231 Eof
.setKind(tok::eof
);
232 Eof
.setLocation(Tok
.getLocation());
233 Eof
.setEofData(VarD
);
237 Parser::LateParsedDeclaration::~LateParsedDeclaration() {}
238 void Parser::LateParsedDeclaration::ParseLexedMethodDeclarations() {}
239 void Parser::LateParsedDeclaration::ParseLexedMemberInitializers() {}
240 void Parser::LateParsedDeclaration::ParseLexedMethodDefs() {}
241 void Parser::LateParsedDeclaration::ParseLexedAttributes() {}
242 void Parser::LateParsedDeclaration::ParseLexedPragmas() {}
244 Parser::LateParsedClass::LateParsedClass(Parser
*P
, ParsingClass
*C
)
245 : Self(P
), Class(C
) {}
247 Parser::LateParsedClass::~LateParsedClass() {
248 Self
->DeallocateParsedClasses(Class
);
251 void Parser::LateParsedClass::ParseLexedMethodDeclarations() {
252 Self
->ParseLexedMethodDeclarations(*Class
);
255 void Parser::LateParsedClass::ParseLexedMemberInitializers() {
256 Self
->ParseLexedMemberInitializers(*Class
);
259 void Parser::LateParsedClass::ParseLexedMethodDefs() {
260 Self
->ParseLexedMethodDefs(*Class
);
263 void Parser::LateParsedClass::ParseLexedAttributes() {
264 Self
->ParseLexedAttributes(*Class
);
267 void Parser::LateParsedClass::ParseLexedPragmas() {
268 Self
->ParseLexedPragmas(*Class
);
271 void Parser::LateParsedMethodDeclaration::ParseLexedMethodDeclarations() {
272 Self
->ParseLexedMethodDeclaration(*this);
275 void Parser::LexedMethod::ParseLexedMethodDefs() {
276 Self
->ParseLexedMethodDef(*this);
279 void Parser::LateParsedMemberInitializer::ParseLexedMemberInitializers() {
280 Self
->ParseLexedMemberInitializer(*this);
283 void Parser::LateParsedAttribute::ParseLexedAttributes() {
284 Self
->ParseLexedAttribute(*this, true, false);
287 void Parser::LateParsedPragma::ParseLexedPragmas() {
288 Self
->ParseLexedPragma(*this);
291 /// Utility to re-enter a possibly-templated scope while parsing its
292 /// late-parsed components.
293 struct Parser::ReenterTemplateScopeRAII
{
295 MultiParseScope Scopes
;
296 TemplateParameterDepthRAII CurTemplateDepthTracker
;
298 ReenterTemplateScopeRAII(Parser
&P
, Decl
*MaybeTemplated
, bool Enter
= true)
299 : P(P
), Scopes(P
), CurTemplateDepthTracker(P
.TemplateParameterDepth
) {
301 CurTemplateDepthTracker
.addDepth(
302 P
.ReenterTemplateScopes(Scopes
, MaybeTemplated
));
307 /// Utility to re-enter a class scope while parsing its late-parsed components.
308 struct Parser::ReenterClassScopeRAII
: ReenterTemplateScopeRAII
{
311 ReenterClassScopeRAII(Parser
&P
, ParsingClass
&Class
)
312 : ReenterTemplateScopeRAII(P
, Class
.TagOrTemplate
,
313 /*Enter=*/!Class
.TopLevelClass
),
315 // If this is the top-level class, we're still within its scope.
316 if (Class
.TopLevelClass
)
319 // Re-enter the class scope itself.
320 Scopes
.Enter(Scope::ClassScope
|Scope::DeclScope
);
321 P
.Actions
.ActOnStartDelayedMemberDeclarations(P
.getCurScope(),
322 Class
.TagOrTemplate
);
324 ~ReenterClassScopeRAII() {
325 if (Class
.TopLevelClass
)
328 P
.Actions
.ActOnFinishDelayedMemberDeclarations(P
.getCurScope(),
329 Class
.TagOrTemplate
);
333 /// ParseLexedMethodDeclarations - We finished parsing the member
334 /// specification of a top (non-nested) C++ class. Now go over the
335 /// stack of method declarations with some parts for which parsing was
336 /// delayed (such as default arguments) and parse them.
337 void Parser::ParseLexedMethodDeclarations(ParsingClass
&Class
) {
338 ReenterClassScopeRAII
InClassScope(*this, Class
);
340 for (LateParsedDeclaration
*LateD
: Class
.LateParsedDeclarations
)
341 LateD
->ParseLexedMethodDeclarations();
344 void Parser::ParseLexedMethodDeclaration(LateParsedMethodDeclaration
&LM
) {
345 // If this is a member template, introduce the template parameter scope.
346 ReenterTemplateScopeRAII
InFunctionTemplateScope(*this, LM
.Method
);
348 // Start the delayed C++ method declaration
349 Actions
.ActOnStartDelayedCXXMethodDeclaration(getCurScope(), LM
.Method
);
351 // Introduce the parameters into scope and parse their default
353 InFunctionTemplateScope
.Scopes
.Enter(Scope::FunctionPrototypeScope
|
354 Scope::FunctionDeclarationScope
|
356 for (unsigned I
= 0, N
= LM
.DefaultArgs
.size(); I
!= N
; ++I
) {
357 auto Param
= cast
<ParmVarDecl
>(LM
.DefaultArgs
[I
].Param
);
358 // Introduce the parameter into scope.
359 bool HasUnparsed
= Param
->hasUnparsedDefaultArg();
360 Actions
.ActOnDelayedCXXMethodParameter(getCurScope(), Param
);
361 std::unique_ptr
<CachedTokens
> Toks
= std::move(LM
.DefaultArgs
[I
].Toks
);
363 ParenBraceBracketBalancer
BalancerRAIIObj(*this);
365 // Mark the end of the default argument so that we know when to stop when
366 // we parse it later on.
367 Token LastDefaultArgToken
= Toks
->back();
369 DefArgEnd
.startToken();
370 DefArgEnd
.setKind(tok::eof
);
371 DefArgEnd
.setLocation(LastDefaultArgToken
.getEndLoc());
372 DefArgEnd
.setEofData(Param
);
373 Toks
->push_back(DefArgEnd
);
375 // Parse the default argument from its saved token stream.
376 Toks
->push_back(Tok
); // So that the current token doesn't get lost
377 PP
.EnterTokenStream(*Toks
, true, /*IsReinject*/ true);
379 // Consume the previously-pushed token.
383 assert(Tok
.is(tok::equal
) && "Default argument not starting with '='");
384 SourceLocation EqualLoc
= ConsumeToken();
386 // The argument isn't actually potentially evaluated unless it is
388 EnterExpressionEvaluationContext
Eval(
390 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed
, Param
);
392 ExprResult DefArgResult
;
393 if (getLangOpts().CPlusPlus11
&& Tok
.is(tok::l_brace
)) {
394 Diag(Tok
, diag::warn_cxx98_compat_generalized_initializer_lists
);
395 DefArgResult
= ParseBraceInitializer();
397 DefArgResult
= ParseAssignmentExpression();
398 DefArgResult
= Actions
.CorrectDelayedTyposInExpr(DefArgResult
, Param
);
399 if (DefArgResult
.isInvalid()) {
400 Actions
.ActOnParamDefaultArgumentError(Param
, EqualLoc
,
401 /*DefaultArg=*/nullptr);
403 if (Tok
.isNot(tok::eof
) || Tok
.getEofData() != Param
) {
404 // The last two tokens are the terminator and the saved value of
405 // Tok; the last token in the default argument is the one before
407 assert(Toks
->size() >= 3 && "expected a token in default arg");
408 Diag(Tok
.getLocation(), diag::err_default_arg_unparsed
)
409 << SourceRange(Tok
.getLocation(),
410 (*Toks
)[Toks
->size() - 3].getLocation());
412 Actions
.ActOnParamDefaultArgument(Param
, EqualLoc
,
416 // There could be leftover tokens (e.g. because of an error).
417 // Skip through until we reach the 'end of default argument' token.
418 while (Tok
.isNot(tok::eof
))
421 if (Tok
.is(tok::eof
) && Tok
.getEofData() == Param
)
423 } else if (HasUnparsed
) {
424 assert(Param
->hasInheritedDefaultArg());
425 const FunctionDecl
*Old
;
426 if (const auto *FunTmpl
= dyn_cast
<FunctionTemplateDecl
>(LM
.Method
))
428 cast
<FunctionDecl
>(FunTmpl
->getTemplatedDecl())->getPreviousDecl();
430 Old
= cast
<FunctionDecl
>(LM
.Method
)->getPreviousDecl();
432 ParmVarDecl
*OldParam
= const_cast<ParmVarDecl
*>(Old
->getParamDecl(I
));
433 assert(!OldParam
->hasUnparsedDefaultArg());
434 if (OldParam
->hasUninstantiatedDefaultArg())
435 Param
->setUninstantiatedDefaultArg(
436 OldParam
->getUninstantiatedDefaultArg());
438 Param
->setDefaultArg(OldParam
->getInit());
443 // Parse a delayed exception-specification, if there is one.
444 if (CachedTokens
*Toks
= LM
.ExceptionSpecTokens
) {
445 ParenBraceBracketBalancer
BalancerRAIIObj(*this);
447 // Add the 'stop' token.
448 Token LastExceptionSpecToken
= Toks
->back();
449 Token ExceptionSpecEnd
;
450 ExceptionSpecEnd
.startToken();
451 ExceptionSpecEnd
.setKind(tok::eof
);
452 ExceptionSpecEnd
.setLocation(LastExceptionSpecToken
.getEndLoc());
453 ExceptionSpecEnd
.setEofData(LM
.Method
);
454 Toks
->push_back(ExceptionSpecEnd
);
456 // Parse the default argument from its saved token stream.
457 Toks
->push_back(Tok
); // So that the current token doesn't get lost
458 PP
.EnterTokenStream(*Toks
, true, /*IsReinject*/true);
460 // Consume the previously-pushed token.
463 // C++11 [expr.prim.general]p3:
464 // If a declaration declares a member function or member function
465 // template of a class X, the expression this is a prvalue of type
466 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
467 // and the end of the function-definition, member-declarator, or
469 CXXMethodDecl
*Method
;
470 if (FunctionTemplateDecl
*FunTmpl
471 = dyn_cast
<FunctionTemplateDecl
>(LM
.Method
))
472 Method
= dyn_cast
<CXXMethodDecl
>(FunTmpl
->getTemplatedDecl());
474 Method
= dyn_cast
<CXXMethodDecl
>(LM
.Method
);
476 Sema::CXXThisScopeRAII
ThisScope(
477 Actions
, Method
? Method
->getParent() : nullptr,
478 Method
? Method
->getMethodQualifiers() : Qualifiers
{},
479 Method
&& getLangOpts().CPlusPlus11
);
481 // Parse the exception-specification.
482 SourceRange SpecificationRange
;
483 SmallVector
<ParsedType
, 4> DynamicExceptions
;
484 SmallVector
<SourceRange
, 4> DynamicExceptionRanges
;
485 ExprResult NoexceptExpr
;
486 CachedTokens
*ExceptionSpecTokens
;
488 ExceptionSpecificationType EST
489 = tryParseExceptionSpecification(/*Delayed=*/false, SpecificationRange
,
491 DynamicExceptionRanges
, NoexceptExpr
,
492 ExceptionSpecTokens
);
494 if (Tok
.isNot(tok::eof
) || Tok
.getEofData() != LM
.Method
)
495 Diag(Tok
.getLocation(), diag::err_except_spec_unparsed
);
497 // Attach the exception-specification to the method.
498 Actions
.actOnDelayedExceptionSpecification(LM
.Method
, EST
,
501 DynamicExceptionRanges
,
502 NoexceptExpr
.isUsable()?
503 NoexceptExpr
.get() : nullptr);
505 // There could be leftover tokens (e.g. because of an error).
506 // Skip through until we reach the original token position.
507 while (Tok
.isNot(tok::eof
))
510 // Clean up the remaining EOF token.
511 if (Tok
.is(tok::eof
) && Tok
.getEofData() == LM
.Method
)
515 LM
.ExceptionSpecTokens
= nullptr;
518 InFunctionTemplateScope
.Scopes
.Exit();
520 // Finish the delayed C++ method declaration.
521 Actions
.ActOnFinishDelayedCXXMethodDeclaration(getCurScope(), LM
.Method
);
524 /// ParseLexedMethodDefs - We finished parsing the member specification of a top
525 /// (non-nested) C++ class. Now go over the stack of lexed methods that were
526 /// collected during its parsing and parse them all.
527 void Parser::ParseLexedMethodDefs(ParsingClass
&Class
) {
528 ReenterClassScopeRAII
InClassScope(*this, Class
);
530 for (LateParsedDeclaration
*D
: Class
.LateParsedDeclarations
)
531 D
->ParseLexedMethodDefs();
534 void Parser::ParseLexedMethodDef(LexedMethod
&LM
) {
535 // If this is a member template, introduce the template parameter scope.
536 ReenterTemplateScopeRAII
InFunctionTemplateScope(*this, LM
.D
);
538 ParenBraceBracketBalancer
BalancerRAIIObj(*this);
540 assert(!LM
.Toks
.empty() && "Empty body!");
541 Token LastBodyToken
= LM
.Toks
.back();
543 BodyEnd
.startToken();
544 BodyEnd
.setKind(tok::eof
);
545 BodyEnd
.setLocation(LastBodyToken
.getEndLoc());
546 BodyEnd
.setEofData(LM
.D
);
547 LM
.Toks
.push_back(BodyEnd
);
548 // Append the current token at the end of the new token stream so that it
550 LM
.Toks
.push_back(Tok
);
551 PP
.EnterTokenStream(LM
.Toks
, true, /*IsReinject*/true);
553 // Consume the previously pushed token.
554 ConsumeAnyToken(/*ConsumeCodeCompletionTok=*/true);
555 assert(Tok
.isOneOf(tok::l_brace
, tok::colon
, tok::kw_try
)
556 && "Inline method not starting with '{', ':' or 'try'");
558 // Parse the method body. Function body parsing code is similar enough
559 // to be re-used for method bodies as well.
560 ParseScope
FnScope(this, Scope::FnScope
| Scope::DeclScope
|
561 Scope::CompoundStmtScope
);
562 Actions
.ActOnStartOfFunctionDef(getCurScope(), LM
.D
);
564 if (Tok
.is(tok::kw_try
)) {
565 ParseFunctionTryBlock(LM
.D
, FnScope
);
567 while (Tok
.isNot(tok::eof
))
570 if (Tok
.is(tok::eof
) && Tok
.getEofData() == LM
.D
)
574 if (Tok
.is(tok::colon
)) {
575 ParseConstructorInitializer(LM
.D
);
578 if (!Tok
.is(tok::l_brace
)) {
580 Actions
.ActOnFinishFunctionBody(LM
.D
, nullptr);
582 while (Tok
.isNot(tok::eof
))
585 if (Tok
.is(tok::eof
) && Tok
.getEofData() == LM
.D
)
590 Actions
.ActOnDefaultCtorInitializers(LM
.D
);
592 assert((Actions
.getDiagnostics().hasErrorOccurred() ||
593 !isa
<FunctionTemplateDecl
>(LM
.D
) ||
594 cast
<FunctionTemplateDecl
>(LM
.D
)->getTemplateParameters()->getDepth()
595 < TemplateParameterDepth
) &&
596 "TemplateParameterDepth should be greater than the depth of "
597 "current template being instantiated!");
599 ParseFunctionStatementBody(LM
.D
, FnScope
);
601 while (Tok
.isNot(tok::eof
))
604 if (Tok
.is(tok::eof
) && Tok
.getEofData() == LM
.D
)
607 if (auto *FD
= dyn_cast_or_null
<FunctionDecl
>(LM
.D
))
608 if (isa
<CXXMethodDecl
>(FD
) ||
609 FD
->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend
))
610 Actions
.ActOnFinishInlineFunctionDef(FD
);
613 /// ParseLexedMemberInitializers - We finished parsing the member specification
614 /// of a top (non-nested) C++ class. Now go over the stack of lexed data member
615 /// initializers that were collected during its parsing and parse them all.
616 void Parser::ParseLexedMemberInitializers(ParsingClass
&Class
) {
617 ReenterClassScopeRAII
InClassScope(*this, Class
);
619 if (!Class
.LateParsedDeclarations
.empty()) {
620 // C++11 [expr.prim.general]p4:
621 // Otherwise, if a member-declarator declares a non-static data member
622 // (9.2) of a class X, the expression this is a prvalue of type "pointer
623 // to X" within the optional brace-or-equal-initializer. It shall not
624 // appear elsewhere in the member-declarator.
625 // FIXME: This should be done in ParseLexedMemberInitializer, not here.
626 Sema::CXXThisScopeRAII
ThisScope(Actions
, Class
.TagOrTemplate
,
629 for (LateParsedDeclaration
*D
: Class
.LateParsedDeclarations
)
630 D
->ParseLexedMemberInitializers();
633 Actions
.ActOnFinishDelayedMemberInitializers(Class
.TagOrTemplate
);
636 void Parser::ParseLexedMemberInitializer(LateParsedMemberInitializer
&MI
) {
637 if (!MI
.Field
|| MI
.Field
->isInvalidDecl())
640 ParenBraceBracketBalancer
BalancerRAIIObj(*this);
642 // Append the current token at the end of the new token stream so that it
644 MI
.Toks
.push_back(Tok
);
645 PP
.EnterTokenStream(MI
.Toks
, true, /*IsReinject*/true);
647 // Consume the previously pushed token.
648 ConsumeAnyToken(/*ConsumeCodeCompletionTok=*/true);
650 SourceLocation EqualLoc
;
652 Actions
.ActOnStartCXXInClassMemberInitializer();
654 // The initializer isn't actually potentially evaluated unless it is
656 EnterExpressionEvaluationContext
Eval(
657 Actions
, Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed
);
659 ExprResult Init
= ParseCXXMemberInitializer(MI
.Field
, /*IsFunction=*/false,
662 Actions
.ActOnFinishCXXInClassMemberInitializer(MI
.Field
, EqualLoc
,
665 // The next token should be our artificial terminating EOF token.
666 if (Tok
.isNot(tok::eof
)) {
667 if (!Init
.isInvalid()) {
668 SourceLocation EndLoc
= PP
.getLocForEndOfToken(PrevTokLocation
);
669 if (!EndLoc
.isValid())
670 EndLoc
= Tok
.getLocation();
671 // No fixit; we can't recover as if there were a semicolon here.
672 Diag(EndLoc
, diag::err_expected_semi_decl_list
);
675 // Consume tokens until we hit the artificial EOF.
676 while (Tok
.isNot(tok::eof
))
679 // Make sure this is *our* artificial EOF token.
680 if (Tok
.getEofData() == MI
.Field
)
684 /// Wrapper class which calls ParseLexedAttribute, after setting up the
685 /// scope appropriately.
686 void Parser::ParseLexedAttributes(ParsingClass
&Class
) {
687 ReenterClassScopeRAII
InClassScope(*this, Class
);
689 for (LateParsedDeclaration
*LateD
: Class
.LateParsedDeclarations
)
690 LateD
->ParseLexedAttributes();
693 /// Parse all attributes in LAs, and attach them to Decl D.
694 void Parser::ParseLexedAttributeList(LateParsedAttrList
&LAs
, Decl
*D
,
695 bool EnterScope
, bool OnDefinition
) {
696 assert(LAs
.parseSoon() &&
697 "Attribute list should be marked for immediate parsing.");
698 for (unsigned i
= 0, ni
= LAs
.size(); i
< ni
; ++i
) {
701 ParseLexedAttribute(*LAs
[i
], EnterScope
, OnDefinition
);
707 /// Finish parsing an attribute for which parsing was delayed.
708 /// This will be called at the end of parsing a class declaration
709 /// for each LateParsedAttribute. We consume the saved tokens and
710 /// create an attribute with the arguments filled in. We add this
711 /// to the Attribute list for the decl.
712 void Parser::ParseLexedAttribute(LateParsedAttribute
&LA
,
713 bool EnterScope
, bool OnDefinition
) {
714 // Create a fake EOF so that attribute parsing won't go off the end of the
717 AttrEnd
.startToken();
718 AttrEnd
.setKind(tok::eof
);
719 AttrEnd
.setLocation(Tok
.getLocation());
720 AttrEnd
.setEofData(LA
.Toks
.data());
721 LA
.Toks
.push_back(AttrEnd
);
723 // Append the current token at the end of the new token stream so that it
725 LA
.Toks
.push_back(Tok
);
726 PP
.EnterTokenStream(LA
.Toks
, true, /*IsReinject=*/true);
727 // Consume the previously pushed token.
728 ConsumeAnyToken(/*ConsumeCodeCompletionTok=*/true);
730 ParsedAttributes
Attrs(AttrFactory
);
732 if (LA
.Decls
.size() > 0) {
733 Decl
*D
= LA
.Decls
[0];
734 NamedDecl
*ND
= dyn_cast
<NamedDecl
>(D
);
735 RecordDecl
*RD
= dyn_cast_or_null
<RecordDecl
>(D
->getDeclContext());
737 // Allow 'this' within late-parsed attributes.
738 Sema::CXXThisScopeRAII
ThisScope(Actions
, RD
, Qualifiers(),
739 ND
&& ND
->isCXXInstanceMember());
741 if (LA
.Decls
.size() == 1) {
742 // If the Decl is templatized, add template parameters to scope.
743 ReenterTemplateScopeRAII
InDeclScope(*this, D
, EnterScope
);
745 // If the Decl is on a function, add function parameters to the scope.
746 bool HasFunScope
= EnterScope
&& D
->isFunctionOrFunctionTemplate();
748 InDeclScope
.Scopes
.Enter(Scope::FnScope
| Scope::DeclScope
|
749 Scope::CompoundStmtScope
);
750 Actions
.ActOnReenterFunctionContext(Actions
.CurScope
, D
);
753 ParseGNUAttributeArgs(&LA
.AttrName
, LA
.AttrNameLoc
, Attrs
, nullptr,
754 nullptr, SourceLocation(), ParsedAttr::Form::GNU(),
758 Actions
.ActOnExitFunctionContext();
760 // If there are multiple decls, then the decl cannot be within the
762 ParseGNUAttributeArgs(&LA
.AttrName
, LA
.AttrNameLoc
, Attrs
, nullptr,
763 nullptr, SourceLocation(), ParsedAttr::Form::GNU(),
767 Diag(Tok
, diag::warn_attribute_no_decl
) << LA
.AttrName
.getName();
770 if (OnDefinition
&& !Attrs
.empty() && !Attrs
.begin()->isCXX11Attribute() &&
771 Attrs
.begin()->isKnownToGCC())
772 Diag(Tok
, diag::warn_attribute_on_function_definition
)
775 for (unsigned i
= 0, ni
= LA
.Decls
.size(); i
< ni
; ++i
)
776 Actions
.ActOnFinishDelayedAttribute(getCurScope(), LA
.Decls
[i
], Attrs
);
778 // Due to a parsing error, we either went over the cached tokens or
779 // there are still cached tokens left, so we skip the leftover tokens.
780 while (Tok
.isNot(tok::eof
))
783 if (Tok
.is(tok::eof
) && Tok
.getEofData() == AttrEnd
.getEofData())
787 void Parser::ParseLexedPragmas(ParsingClass
&Class
) {
788 ReenterClassScopeRAII
InClassScope(*this, Class
);
790 for (LateParsedDeclaration
*D
: Class
.LateParsedDeclarations
)
791 D
->ParseLexedPragmas();
794 void Parser::ParseLexedPragma(LateParsedPragma
&LP
) {
795 PP
.EnterToken(Tok
, /*IsReinject=*/true);
796 PP
.EnterTokenStream(LP
.toks(), /*DisableMacroExpansion=*/true,
797 /*IsReinject=*/true);
799 // Consume the previously pushed token.
800 ConsumeAnyToken(/*ConsumeCodeCompletionTok=*/true);
801 assert(Tok
.isAnnotation() && "Expected annotation token.");
802 switch (Tok
.getKind()) {
803 case tok::annot_attr_openmp
:
804 case tok::annot_pragma_openmp
: {
805 AccessSpecifier AS
= LP
.getAccessSpecifier();
806 ParsedAttributes
Attrs(AttrFactory
);
807 (void)ParseOpenMPDeclarativeDirectiveWithExtDecl(AS
, Attrs
);
811 llvm_unreachable("Unexpected token.");
815 /// ConsumeAndStoreUntil - Consume and store the token at the passed token
816 /// container until the token 'T' is reached (which gets
817 /// consumed/stored too, if ConsumeFinalToken).
818 /// If StopAtSemi is true, then we will stop early at a ';' character.
819 /// Returns true if token 'T1' or 'T2' was found.
820 /// NOTE: This is a specialized version of Parser::SkipUntil.
821 bool Parser::ConsumeAndStoreUntil(tok::TokenKind T1
, tok::TokenKind T2
,
823 bool StopAtSemi
, bool ConsumeFinalToken
) {
824 // We always want this function to consume at least one token if the first
825 // token isn't T and if not at EOF.
826 bool isFirstTokenConsumed
= true;
828 // If we found one of the tokens, stop and return true.
829 if (Tok
.is(T1
) || Tok
.is(T2
)) {
830 if (ConsumeFinalToken
) {
837 switch (Tok
.getKind()) {
839 case tok::annot_module_begin
:
840 case tok::annot_module_end
:
841 case tok::annot_module_include
:
842 case tok::annot_repl_input_end
:
843 // Ran out of tokens.
847 // Recursively consume properly-nested parens.
850 ConsumeAndStoreUntil(tok::r_paren
, Toks
, /*StopAtSemi=*/false);
853 // Recursively consume properly-nested square brackets.
856 ConsumeAndStoreUntil(tok::r_square
, Toks
, /*StopAtSemi=*/false);
859 // Recursively consume properly-nested braces.
862 ConsumeAndStoreUntil(tok::r_brace
, Toks
, /*StopAtSemi=*/false);
865 // Okay, we found a ']' or '}' or ')', which we think should be balanced.
866 // Since the user wasn't looking for this token (if they were, it would
867 // already be handled), this isn't balanced. If there is a LHS token at a
868 // higher level, we will assume that this matches the unbalanced token
869 // and return it. Otherwise, this is a spurious RHS token, which we skip.
871 if (ParenCount
&& !isFirstTokenConsumed
)
872 return false; // Matches something.
877 if (BracketCount
&& !isFirstTokenConsumed
)
878 return false; // Matches something.
883 if (BraceCount
&& !isFirstTokenConsumed
)
884 return false; // Matches something.
894 // consume this token.
896 ConsumeAnyToken(/*ConsumeCodeCompletionTok*/true);
899 isFirstTokenConsumed
= false;
903 /// Consume tokens and store them in the passed token container until
904 /// we've passed the try keyword and constructor initializers and have consumed
905 /// the opening brace of the function body. The opening brace will be consumed
906 /// if and only if there was no error.
908 /// \return True on error.
909 bool Parser::ConsumeAndStoreFunctionPrologue(CachedTokens
&Toks
) {
910 if (Tok
.is(tok::kw_try
)) {
915 if (Tok
.isNot(tok::colon
)) {
916 // Easy case, just a function body.
918 // Grab any remaining garbage to be diagnosed later. We stop when we reach a
919 // brace: an opening one is the function body, while a closing one probably
920 // means we've reached the end of the class.
921 ConsumeAndStoreUntil(tok::l_brace
, tok::r_brace
, Toks
,
923 /*ConsumeFinalToken=*/false);
924 if (Tok
.isNot(tok::l_brace
))
925 return Diag(Tok
.getLocation(), diag::err_expected
) << tok::l_brace
;
935 // We can't reliably skip over a mem-initializer-id, because it could be
936 // a template-id involving not-yet-declared names. Given:
938 // S ( ) : a < b < c > ( e )
940 // 'e' might be an initializer or part of a template argument, depending
941 // on whether 'b' is a template.
943 // Track whether we might be inside a template argument. We can give
944 // significantly better diagnostics if we know that we're not.
945 bool MightBeTemplateArgument
= false;
948 // Skip over the mem-initializer-id, if possible.
949 if (Tok
.is(tok::kw_decltype
)) {
951 SourceLocation OpenLoc
= ConsumeToken();
952 if (Tok
.isNot(tok::l_paren
))
953 return Diag(Tok
.getLocation(), diag::err_expected_lparen_after
)
957 if (!ConsumeAndStoreUntil(tok::r_paren
, Toks
, /*StopAtSemi=*/true)) {
958 Diag(Tok
.getLocation(), diag::err_expected
) << tok::r_paren
;
959 Diag(OpenLoc
, diag::note_matching
) << tok::l_paren
;
964 // Walk over a component of a nested-name-specifier.
965 if (Tok
.is(tok::coloncolon
)) {
969 if (Tok
.is(tok::kw_template
)) {
975 if (Tok
.is(tok::identifier
)) {
981 } while (Tok
.is(tok::coloncolon
));
983 if (Tok
.is(tok::code_completion
)) {
985 ConsumeCodeCompletionToken();
986 if (Tok
.isOneOf(tok::identifier
, tok::coloncolon
, tok::kw_decltype
)) {
987 // Could be the start of another member initializer (the ',' has not
993 if (Tok
.is(tok::comma
)) {
994 // The initialization is missing, we'll diagnose it later.
999 if (Tok
.is(tok::less
))
1000 MightBeTemplateArgument
= true;
1002 if (MightBeTemplateArgument
) {
1003 // We may be inside a template argument list. Grab up to the start of the
1004 // next parenthesized initializer or braced-init-list. This *might* be the
1005 // initializer, or it might be a subexpression in the template argument
1007 // FIXME: Count angle brackets, and clear MightBeTemplateArgument
1008 // if all angles are closed.
1009 if (!ConsumeAndStoreUntil(tok::l_paren
, tok::l_brace
, Toks
,
1010 /*StopAtSemi=*/true,
1011 /*ConsumeFinalToken=*/false)) {
1012 // We're not just missing the initializer, we're also missing the
1014 return Diag(Tok
.getLocation(), diag::err_expected
) << tok::l_brace
;
1016 } else if (Tok
.isNot(tok::l_paren
) && Tok
.isNot(tok::l_brace
)) {
1017 // We found something weird in a mem-initializer-id.
1018 if (getLangOpts().CPlusPlus11
)
1019 return Diag(Tok
.getLocation(), diag::err_expected_either
)
1020 << tok::l_paren
<< tok::l_brace
;
1022 return Diag(Tok
.getLocation(), diag::err_expected
) << tok::l_paren
;
1025 tok::TokenKind kind
= Tok
.getKind();
1026 Toks
.push_back(Tok
);
1027 bool IsLParen
= (kind
== tok::l_paren
);
1028 SourceLocation OpenLoc
= Tok
.getLocation();
1033 assert(kind
== tok::l_brace
&& "Must be left paren or brace here.");
1035 // In C++03, this has to be the start of the function body, which
1036 // means the initializer is malformed; we'll diagnose it later.
1037 if (!getLangOpts().CPlusPlus11
)
1040 const Token
&PreviousToken
= Toks
[Toks
.size() - 2];
1041 if (!MightBeTemplateArgument
&&
1042 !PreviousToken
.isOneOf(tok::identifier
, tok::greater
,
1043 tok::greatergreater
)) {
1044 // If the opening brace is not preceded by one of these tokens, we are
1045 // missing the mem-initializer-id. In order to recover better, we need
1046 // to use heuristics to determine if this '{' is most likely the
1047 // beginning of a brace-init-list or the function body.
1048 // Check the token after the corresponding '}'.
1049 TentativeParsingAction
PA(*this);
1050 if (SkipUntil(tok::r_brace
) &&
1051 !Tok
.isOneOf(tok::comma
, tok::ellipsis
, tok::l_brace
)) {
1052 // Consider there was a malformed initializer and this is the start
1053 // of the function body. We'll diagnose it later.
1061 // Grab the initializer (or the subexpression of the template argument).
1062 // FIXME: If we support lambdas here, we'll need to set StopAtSemi to false
1063 // if we might be inside the braces of a lambda-expression.
1064 tok::TokenKind CloseKind
= IsLParen
? tok::r_paren
: tok::r_brace
;
1065 if (!ConsumeAndStoreUntil(CloseKind
, Toks
, /*StopAtSemi=*/true)) {
1066 Diag(Tok
, diag::err_expected
) << CloseKind
;
1067 Diag(OpenLoc
, diag::note_matching
) << kind
;
1071 // Grab pack ellipsis, if present.
1072 if (Tok
.is(tok::ellipsis
)) {
1073 Toks
.push_back(Tok
);
1077 // If we know we just consumed a mem-initializer, we must have ',' or '{'
1079 if (Tok
.is(tok::comma
)) {
1080 Toks
.push_back(Tok
);
1082 } else if (Tok
.is(tok::l_brace
)) {
1083 // This is the function body if the ')' or '}' is immediately followed by
1084 // a '{'. That cannot happen within a template argument, apart from the
1085 // case where a template argument contains a compound literal:
1087 // S ( ) : a < b < c > ( d ) { }
1088 // // End of declaration, or still inside the template argument?
1090 // ... and the case where the template argument contains a lambda:
1092 // S ( ) : a < 0 && b < c > ( d ) + [ ] ( ) { return 0; }
1095 // FIXME: Disambiguate these cases. Note that the latter case is probably
1096 // going to be made ill-formed by core issue 1607.
1097 Toks
.push_back(Tok
);
1100 } else if (!MightBeTemplateArgument
) {
1101 return Diag(Tok
.getLocation(), diag::err_expected_either
) << tok::l_brace
1107 /// Consume and store tokens from the '?' to the ':' in a conditional
1109 bool Parser::ConsumeAndStoreConditional(CachedTokens
&Toks
) {
1111 assert(Tok
.is(tok::question
));
1112 Toks
.push_back(Tok
);
1115 while (Tok
.isNot(tok::colon
)) {
1116 if (!ConsumeAndStoreUntil(tok::question
, tok::colon
, Toks
,
1117 /*StopAtSemi=*/true,
1118 /*ConsumeFinalToken=*/false))
1121 // If we found a nested conditional, consume it.
1122 if (Tok
.is(tok::question
) && !ConsumeAndStoreConditional(Toks
))
1127 Toks
.push_back(Tok
);
1132 /// A tentative parsing action that can also revert token annotations.
1133 class Parser::UnannotatedTentativeParsingAction
: public TentativeParsingAction
{
1135 explicit UnannotatedTentativeParsingAction(Parser
&Self
,
1136 tok::TokenKind EndKind
)
1137 : TentativeParsingAction(Self
), Self(Self
), EndKind(EndKind
) {
1138 // Stash away the old token stream, so we can restore it once the
1139 // tentative parse is complete.
1140 TentativeParsingAction
Inner(Self
);
1141 Self
.ConsumeAndStoreUntil(EndKind
, Toks
, true, /*ConsumeFinalToken*/false);
1145 void RevertAnnotations() {
1148 // Put back the original tokens.
1149 Self
.SkipUntil(EndKind
, StopAtSemi
| StopBeforeMatch
);
1151 auto Buffer
= std::make_unique
<Token
[]>(Toks
.size());
1152 std::copy(Toks
.begin() + 1, Toks
.end(), Buffer
.get());
1153 Buffer
[Toks
.size() - 1] = Self
.Tok
;
1154 Self
.PP
.EnterTokenStream(std::move(Buffer
), Toks
.size(), true,
1155 /*IsReinject*/ true);
1157 Self
.Tok
= Toks
.front();
1164 tok::TokenKind EndKind
;
1167 /// ConsumeAndStoreInitializer - Consume and store the token at the passed token
1168 /// container until the end of the current initializer expression (either a
1169 /// default argument or an in-class initializer for a non-static data member).
1171 /// Returns \c true if we reached the end of something initializer-shaped,
1172 /// \c false if we bailed out.
1173 bool Parser::ConsumeAndStoreInitializer(CachedTokens
&Toks
,
1174 CachedInitKind CIK
) {
1175 // We always want this function to consume at least one token if not at EOF.
1176 bool IsFirstToken
= true;
1178 // Number of possible unclosed <s we've seen so far. These might be templates,
1179 // and might not, but if there were none of them (or we know for sure that
1180 // we're within a template), we can avoid a tentative parse.
1181 unsigned AngleCount
= 0;
1182 unsigned KnownTemplateCount
= 0;
1185 switch (Tok
.getKind()) {
1187 // If we might be in a template, perform a tentative parse to check.
1189 // Not a template argument: this is the end of the initializer.
1191 if (KnownTemplateCount
)
1194 // We hit a comma inside angle brackets. This is the hard case. The
1195 // rule we follow is:
1196 // * For a default argument, if the tokens after the comma form a
1197 // syntactically-valid parameter-declaration-clause, in which each
1198 // parameter has an initializer, then this comma ends the default
1200 // * For a default initializer, if the tokens after the comma form a
1201 // syntactically-valid init-declarator-list, then this comma ends
1202 // the default initializer.
1204 UnannotatedTentativeParsingAction
PA(*this,
1205 CIK
== CIK_DefaultInitializer
1206 ? tok::semi
: tok::r_paren
);
1207 Sema::TentativeAnalysisScope
Scope(Actions
);
1209 TPResult Result
= TPResult::Error
;
1212 case CIK_DefaultInitializer
:
1213 Result
= TryParseInitDeclaratorList();
1214 // If we parsed a complete, ambiguous init-declarator-list, this
1215 // is only syntactically-valid if it's followed by a semicolon.
1216 if (Result
== TPResult::Ambiguous
&& Tok
.isNot(tok::semi
))
1217 Result
= TPResult::False
;
1220 case CIK_DefaultArgument
:
1221 bool InvalidAsDeclaration
= false;
1222 Result
= TryParseParameterDeclarationClause(
1223 &InvalidAsDeclaration
, /*VersusTemplateArg=*/true);
1224 // If this is an expression or a declaration with a missing
1225 // 'typename', assume it's not a declaration.
1226 if (Result
== TPResult::Ambiguous
&& InvalidAsDeclaration
)
1227 Result
= TPResult::False
;
1231 // Put the token stream back and undo any annotations we performed
1232 // after the comma. They may reflect a different parse than the one
1233 // we will actually perform at the end of the class.
1234 PA
.RevertAnnotations();
1236 // If what follows could be a declaration, it is a declaration.
1237 if (Result
!= TPResult::False
&& Result
!= TPResult::Error
)
1241 // Keep going. We know we're inside a template argument list now.
1242 ++KnownTemplateCount
;
1246 case tok::annot_module_begin
:
1247 case tok::annot_module_end
:
1248 case tok::annot_module_include
:
1249 case tok::annot_repl_input_end
:
1250 // Ran out of tokens.
1254 // FIXME: A '<' can only start a template-id if it's preceded by an
1255 // identifier, an operator-function-id, or a literal-operator-id.
1260 // In 'a ? b : c', 'b' can contain an unparenthesized comma. If it does,
1261 // that is *never* the end of the initializer. Skip to the ':'.
1262 if (!ConsumeAndStoreConditional(Toks
))
1266 case tok::greatergreatergreater
:
1267 if (!getLangOpts().CPlusPlus11
)
1269 if (AngleCount
) --AngleCount
;
1270 if (KnownTemplateCount
) --KnownTemplateCount
;
1272 case tok::greatergreater
:
1273 if (!getLangOpts().CPlusPlus11
)
1275 if (AngleCount
) --AngleCount
;
1276 if (KnownTemplateCount
) --KnownTemplateCount
;
1279 if (AngleCount
) --AngleCount
;
1280 if (KnownTemplateCount
) --KnownTemplateCount
;
1283 case tok::kw_template
:
1284 // 'template' identifier '<' is known to start a template argument list,
1285 // and can be used to disambiguate the parse.
1286 // FIXME: Support all forms of 'template' unqualified-id '<'.
1287 Toks
.push_back(Tok
);
1289 if (Tok
.is(tok::identifier
)) {
1290 Toks
.push_back(Tok
);
1292 if (Tok
.is(tok::less
)) {
1294 ++KnownTemplateCount
;
1295 Toks
.push_back(Tok
);
1301 case tok::kw_operator
:
1302 // If 'operator' precedes other punctuation, that punctuation loses
1303 // its special behavior.
1304 Toks
.push_back(Tok
);
1306 switch (Tok
.getKind()) {
1308 case tok::greatergreatergreater
:
1309 case tok::greatergreater
:
1312 Toks
.push_back(Tok
);
1321 // Recursively consume properly-nested parens.
1322 Toks
.push_back(Tok
);
1324 ConsumeAndStoreUntil(tok::r_paren
, Toks
, /*StopAtSemi=*/false);
1327 // Recursively consume properly-nested square brackets.
1328 Toks
.push_back(Tok
);
1330 ConsumeAndStoreUntil(tok::r_square
, Toks
, /*StopAtSemi=*/false);
1333 // Recursively consume properly-nested braces.
1334 Toks
.push_back(Tok
);
1336 ConsumeAndStoreUntil(tok::r_brace
, Toks
, /*StopAtSemi=*/false);
1339 // Okay, we found a ']' or '}' or ')', which we think should be balanced.
1340 // Since the user wasn't looking for this token (if they were, it would
1341 // already be handled), this isn't balanced. If there is a LHS token at a
1342 // higher level, we will assume that this matches the unbalanced token
1343 // and return it. Otherwise, this is a spurious RHS token, which we
1344 // consume and pass on to downstream code to diagnose.
1346 if (CIK
== CIK_DefaultArgument
)
1347 return true; // End of the default argument.
1348 if (ParenCount
&& !IsFirstToken
)
1350 Toks
.push_back(Tok
);
1354 if (BracketCount
&& !IsFirstToken
)
1356 Toks
.push_back(Tok
);
1360 if (BraceCount
&& !IsFirstToken
)
1362 Toks
.push_back(Tok
);
1366 case tok::code_completion
:
1367 Toks
.push_back(Tok
);
1368 ConsumeCodeCompletionToken();
1371 case tok::string_literal
:
1372 case tok::wide_string_literal
:
1373 case tok::utf8_string_literal
:
1374 case tok::utf16_string_literal
:
1375 case tok::utf32_string_literal
:
1376 Toks
.push_back(Tok
);
1377 ConsumeStringToken();
1380 if (CIK
== CIK_DefaultInitializer
)
1381 return true; // End of the default initializer.
1385 Toks
.push_back(Tok
);
1389 IsFirstToken
= false;