xref: /freebsd/contrib/llvm-project/clang/lib/Parse/ParseTentative.cpp (revision 4e99f45480598189d49d45a825533a6c9e12f02c)
1 //===--- ParseTentative.cpp - Ambiguity Resolution Parsing ----------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 //  This file implements the tentative parsing portions of the Parser
10 //  interfaces, for ambiguity resolution.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "clang/Parse/Parser.h"
15 #include "clang/Parse/ParseDiagnostic.h"
16 #include "clang/Sema/ParsedTemplate.h"
17 using namespace clang;
18 
19 /// isCXXDeclarationStatement - C++-specialized function that disambiguates
20 /// between a declaration or an expression statement, when parsing function
21 /// bodies. Returns true for declaration, false for expression.
22 ///
23 ///         declaration-statement:
24 ///           block-declaration
25 ///
26 ///         block-declaration:
27 ///           simple-declaration
28 ///           asm-definition
29 ///           namespace-alias-definition
30 ///           using-declaration
31 ///           using-directive
32 /// [C++0x]   static_assert-declaration
33 ///
34 ///         asm-definition:
35 ///           'asm' '(' string-literal ')' ';'
36 ///
37 ///         namespace-alias-definition:
38 ///           'namespace' identifier = qualified-namespace-specifier ';'
39 ///
40 ///         using-declaration:
41 ///           'using' typename[opt] '::'[opt] nested-name-specifier
42 ///                 unqualified-id ';'
43 ///           'using' '::' unqualified-id ;
44 ///
45 ///         using-directive:
46 ///           'using' 'namespace' '::'[opt] nested-name-specifier[opt]
47 ///                 namespace-name ';'
48 ///
49 bool Parser::isCXXDeclarationStatement() {
50   switch (Tok.getKind()) {
51     // asm-definition
52   case tok::kw_asm:
53     // namespace-alias-definition
54   case tok::kw_namespace:
55     // using-declaration
56     // using-directive
57   case tok::kw_using:
58     // static_assert-declaration
59   case tok::kw_static_assert:
60   case tok::kw__Static_assert:
61     return true;
62     // simple-declaration
63   default:
64     return isCXXSimpleDeclaration(/*AllowForRangeDecl=*/false);
65   }
66 }
67 
68 /// isCXXSimpleDeclaration - C++-specialized function that disambiguates
69 /// between a simple-declaration or an expression-statement.
70 /// If during the disambiguation process a parsing error is encountered,
71 /// the function returns true to let the declaration parsing code handle it.
72 /// Returns false if the statement is disambiguated as expression.
73 ///
74 /// simple-declaration:
75 ///   decl-specifier-seq init-declarator-list[opt] ';'
76 ///   decl-specifier-seq ref-qualifier[opt] '[' identifier-list ']'
77 ///                      brace-or-equal-initializer ';'    [C++17]
78 ///
79 /// (if AllowForRangeDecl specified)
80 /// for ( for-range-declaration : for-range-initializer ) statement
81 ///
82 /// for-range-declaration:
83 ///    decl-specifier-seq declarator
84 ///    decl-specifier-seq ref-qualifier[opt] '[' identifier-list ']'
85 ///
86 /// In any of the above cases there can be a preceding attribute-specifier-seq,
87 /// but the caller is expected to handle that.
88 bool Parser::isCXXSimpleDeclaration(bool AllowForRangeDecl) {
89   // C++ 6.8p1:
90   // There is an ambiguity in the grammar involving expression-statements and
91   // declarations: An expression-statement with a function-style explicit type
92   // conversion (5.2.3) as its leftmost subexpression can be indistinguishable
93   // from a declaration where the first declarator starts with a '('. In those
94   // cases the statement is a declaration. [Note: To disambiguate, the whole
95   // statement might have to be examined to determine if it is an
96   // expression-statement or a declaration].
97 
98   // C++ 6.8p3:
99   // The disambiguation is purely syntactic; that is, the meaning of the names
100   // occurring in such a statement, beyond whether they are type-names or not,
101   // is not generally used in or changed by the disambiguation. Class
102   // templates are instantiated as necessary to determine if a qualified name
103   // is a type-name. Disambiguation precedes parsing, and a statement
104   // disambiguated as a declaration may be an ill-formed declaration.
105 
106   // We don't have to parse all of the decl-specifier-seq part. There's only
107   // an ambiguity if the first decl-specifier is
108   // simple-type-specifier/typename-specifier followed by a '(', which may
109   // indicate a function-style cast expression.
110   // isCXXDeclarationSpecifier will return TPResult::Ambiguous only in such
111   // a case.
112 
113   bool InvalidAsDeclaration = false;
114   TPResult TPR = isCXXDeclarationSpecifier(TPResult::False,
115                                            &InvalidAsDeclaration);
116   if (TPR != TPResult::Ambiguous)
117     return TPR != TPResult::False; // Returns true for TPResult::True or
118                                    // TPResult::Error.
119 
120   // FIXME: TryParseSimpleDeclaration doesn't look past the first initializer,
121   // and so gets some cases wrong. We can't carry on if we've already seen
122   // something which makes this statement invalid as a declaration in this case,
123   // since it can cause us to misparse valid code. Revisit this once
124   // TryParseInitDeclaratorList is fixed.
125   if (InvalidAsDeclaration)
126     return false;
127 
128   // FIXME: Add statistics about the number of ambiguous statements encountered
129   // and how they were resolved (number of declarations+number of expressions).
130 
131   // Ok, we have a simple-type-specifier/typename-specifier followed by a '(',
132   // or an identifier which doesn't resolve as anything. We need tentative
133   // parsing...
134 
135   {
136     RevertingTentativeParsingAction PA(*this);
137     TPR = TryParseSimpleDeclaration(AllowForRangeDecl);
138   }
139 
140   // In case of an error, let the declaration parsing code handle it.
141   if (TPR == TPResult::Error)
142     return true;
143 
144   // Declarations take precedence over expressions.
145   if (TPR == TPResult::Ambiguous)
146     TPR = TPResult::True;
147 
148   assert(TPR == TPResult::True || TPR == TPResult::False);
149   return TPR == TPResult::True;
150 }
151 
152 /// Try to consume a token sequence that we've already identified as
153 /// (potentially) starting a decl-specifier.
154 Parser::TPResult Parser::TryConsumeDeclarationSpecifier() {
155   switch (Tok.getKind()) {
156   case tok::kw__Atomic:
157     if (NextToken().isNot(tok::l_paren)) {
158       ConsumeToken();
159       break;
160     }
161     LLVM_FALLTHROUGH;
162   case tok::kw_typeof:
163   case tok::kw___attribute:
164   case tok::kw___underlying_type: {
165     ConsumeToken();
166     if (Tok.isNot(tok::l_paren))
167       return TPResult::Error;
168     ConsumeParen();
169     if (!SkipUntil(tok::r_paren))
170       return TPResult::Error;
171     break;
172   }
173 
174   case tok::kw_class:
175   case tok::kw_struct:
176   case tok::kw_union:
177   case tok::kw___interface:
178   case tok::kw_enum:
179     // elaborated-type-specifier:
180     //     class-key attribute-specifier-seq[opt]
181     //         nested-name-specifier[opt] identifier
182     //     class-key nested-name-specifier[opt] template[opt] simple-template-id
183     //     enum nested-name-specifier[opt] identifier
184     //
185     // FIXME: We don't support class-specifiers nor enum-specifiers here.
186     ConsumeToken();
187 
188     // Skip attributes.
189     while (Tok.isOneOf(tok::l_square, tok::kw___attribute, tok::kw___declspec,
190                        tok::kw_alignas)) {
191       if (Tok.is(tok::l_square)) {
192         ConsumeBracket();
193         if (!SkipUntil(tok::r_square))
194           return TPResult::Error;
195       } else {
196         ConsumeToken();
197         if (Tok.isNot(tok::l_paren))
198           return TPResult::Error;
199         ConsumeParen();
200         if (!SkipUntil(tok::r_paren))
201           return TPResult::Error;
202       }
203     }
204 
205     if (TryAnnotateOptionalCXXScopeToken())
206       return TPResult::Error;
207     if (Tok.is(tok::annot_cxxscope))
208       ConsumeAnnotationToken();
209     if (Tok.is(tok::identifier))
210       ConsumeToken();
211     else if (Tok.is(tok::annot_template_id))
212       ConsumeAnnotationToken();
213     else
214       return TPResult::Error;
215     break;
216 
217   case tok::annot_cxxscope:
218     ConsumeAnnotationToken();
219     LLVM_FALLTHROUGH;
220   default:
221     ConsumeAnyToken();
222 
223     if (getLangOpts().ObjC && Tok.is(tok::less))
224       return TryParseProtocolQualifiers();
225     break;
226   }
227 
228   return TPResult::Ambiguous;
229 }
230 
231 /// simple-declaration:
232 ///   decl-specifier-seq init-declarator-list[opt] ';'
233 ///
234 /// (if AllowForRangeDecl specified)
235 /// for ( for-range-declaration : for-range-initializer ) statement
236 /// for-range-declaration:
237 ///    attribute-specifier-seqopt type-specifier-seq declarator
238 ///
239 Parser::TPResult Parser::TryParseSimpleDeclaration(bool AllowForRangeDecl) {
240   if (TryConsumeDeclarationSpecifier() == TPResult::Error)
241     return TPResult::Error;
242 
243   // Two decl-specifiers in a row conclusively disambiguate this as being a
244   // simple-declaration. Don't bother calling isCXXDeclarationSpecifier in the
245   // overwhelmingly common case that the next token is a '('.
246   if (Tok.isNot(tok::l_paren)) {
247     TPResult TPR = isCXXDeclarationSpecifier();
248     if (TPR == TPResult::Ambiguous)
249       return TPResult::True;
250     if (TPR == TPResult::True || TPR == TPResult::Error)
251       return TPR;
252     assert(TPR == TPResult::False);
253   }
254 
255   TPResult TPR = TryParseInitDeclaratorList();
256   if (TPR != TPResult::Ambiguous)
257     return TPR;
258 
259   if (Tok.isNot(tok::semi) && (!AllowForRangeDecl || Tok.isNot(tok::colon)))
260     return TPResult::False;
261 
262   return TPResult::Ambiguous;
263 }
264 
265 /// Tentatively parse an init-declarator-list in order to disambiguate it from
266 /// an expression.
267 ///
268 ///       init-declarator-list:
269 ///         init-declarator
270 ///         init-declarator-list ',' init-declarator
271 ///
272 ///       init-declarator:
273 ///         declarator initializer[opt]
274 /// [GNU]   declarator simple-asm-expr[opt] attributes[opt] initializer[opt]
275 ///
276 ///       initializer:
277 ///         brace-or-equal-initializer
278 ///         '(' expression-list ')'
279 ///
280 ///       brace-or-equal-initializer:
281 ///         '=' initializer-clause
282 /// [C++11] braced-init-list
283 ///
284 ///       initializer-clause:
285 ///         assignment-expression
286 ///         braced-init-list
287 ///
288 ///       braced-init-list:
289 ///         '{' initializer-list ','[opt] '}'
290 ///         '{' '}'
291 ///
292 Parser::TPResult Parser::TryParseInitDeclaratorList() {
293   while (1) {
294     // declarator
295     TPResult TPR = TryParseDeclarator(false/*mayBeAbstract*/);
296     if (TPR != TPResult::Ambiguous)
297       return TPR;
298 
299     // [GNU] simple-asm-expr[opt] attributes[opt]
300     if (Tok.isOneOf(tok::kw_asm, tok::kw___attribute))
301       return TPResult::True;
302 
303     // initializer[opt]
304     if (Tok.is(tok::l_paren)) {
305       // Parse through the parens.
306       ConsumeParen();
307       if (!SkipUntil(tok::r_paren, StopAtSemi))
308         return TPResult::Error;
309     } else if (Tok.is(tok::l_brace)) {
310       // A left-brace here is sufficient to disambiguate the parse; an
311       // expression can never be followed directly by a braced-init-list.
312       return TPResult::True;
313     } else if (Tok.is(tok::equal) || isTokIdentifier_in()) {
314       // MSVC and g++ won't examine the rest of declarators if '=' is
315       // encountered; they just conclude that we have a declaration.
316       // EDG parses the initializer completely, which is the proper behavior
317       // for this case.
318       //
319       // At present, Clang follows MSVC and g++, since the parser does not have
320       // the ability to parse an expression fully without recording the
321       // results of that parse.
322       // FIXME: Handle this case correctly.
323       //
324       // Also allow 'in' after an Objective-C declaration as in:
325       // for (int (^b)(void) in array). Ideally this should be done in the
326       // context of parsing for-init-statement of a foreach statement only. But,
327       // in any other context 'in' is invalid after a declaration and parser
328       // issues the error regardless of outcome of this decision.
329       // FIXME: Change if above assumption does not hold.
330       return TPResult::True;
331     }
332 
333     if (!TryConsumeToken(tok::comma))
334       break;
335   }
336 
337   return TPResult::Ambiguous;
338 }
339 
340 struct Parser::ConditionDeclarationOrInitStatementState {
341   Parser &P;
342   bool CanBeExpression = true;
343   bool CanBeCondition = true;
344   bool CanBeInitStatement;
345   bool CanBeForRangeDecl;
346 
347   ConditionDeclarationOrInitStatementState(Parser &P, bool CanBeInitStatement,
348                                            bool CanBeForRangeDecl)
349       : P(P), CanBeInitStatement(CanBeInitStatement),
350         CanBeForRangeDecl(CanBeForRangeDecl) {}
351 
352   bool resolved() {
353     return CanBeExpression + CanBeCondition + CanBeInitStatement +
354                CanBeForRangeDecl < 2;
355   }
356 
357   void markNotExpression() {
358     CanBeExpression = false;
359 
360     if (!resolved()) {
361       // FIXME: Unify the parsing codepaths for condition variables and
362       // simple-declarations so that we don't need to eagerly figure out which
363       // kind we have here. (Just parse init-declarators until we reach a
364       // semicolon or right paren.)
365       RevertingTentativeParsingAction PA(P);
366       if (CanBeForRangeDecl) {
367         // Skip until we hit a ')', ';', or a ':' with no matching '?'.
368         // The final case is a for range declaration, the rest are not.
369         while (true) {
370           unsigned QuestionColonDepth = 0;
371           P.SkipUntil({tok::r_paren, tok::semi, tok::question, tok::colon},
372                       StopBeforeMatch);
373           if (P.Tok.is(tok::question))
374             ++QuestionColonDepth;
375           else if (P.Tok.is(tok::colon)) {
376             if (QuestionColonDepth)
377               --QuestionColonDepth;
378             else {
379               CanBeCondition = CanBeInitStatement = false;
380               return;
381             }
382           } else {
383             CanBeForRangeDecl = false;
384             break;
385           }
386           P.ConsumeToken();
387         }
388       } else {
389         // Just skip until we hit a ')' or ';'.
390         P.SkipUntil(tok::r_paren, tok::semi, StopBeforeMatch);
391       }
392       if (P.Tok.isNot(tok::r_paren))
393         CanBeCondition = CanBeForRangeDecl = false;
394       if (P.Tok.isNot(tok::semi))
395         CanBeInitStatement = false;
396     }
397   }
398 
399   bool markNotCondition() {
400     CanBeCondition = false;
401     return resolved();
402   }
403 
404   bool markNotForRangeDecl() {
405     CanBeForRangeDecl = false;
406     return resolved();
407   }
408 
409   bool update(TPResult IsDecl) {
410     switch (IsDecl) {
411     case TPResult::True:
412       markNotExpression();
413       assert(resolved() && "can't continue after tentative parsing bails out");
414       break;
415     case TPResult::False:
416       CanBeCondition = CanBeInitStatement = CanBeForRangeDecl = false;
417       break;
418     case TPResult::Ambiguous:
419       break;
420     case TPResult::Error:
421       CanBeExpression = CanBeCondition = CanBeInitStatement =
422           CanBeForRangeDecl = false;
423       break;
424     }
425     return resolved();
426   }
427 
428   ConditionOrInitStatement result() const {
429     assert(CanBeExpression + CanBeCondition + CanBeInitStatement +
430                    CanBeForRangeDecl < 2 &&
431            "result called but not yet resolved");
432     if (CanBeExpression)
433       return ConditionOrInitStatement::Expression;
434     if (CanBeCondition)
435       return ConditionOrInitStatement::ConditionDecl;
436     if (CanBeInitStatement)
437       return ConditionOrInitStatement::InitStmtDecl;
438     if (CanBeForRangeDecl)
439       return ConditionOrInitStatement::ForRangeDecl;
440     return ConditionOrInitStatement::Error;
441   }
442 };
443 
444 /// Disambiguates between a declaration in a condition, a
445 /// simple-declaration in an init-statement, and an expression for
446 /// a condition of a if/switch statement.
447 ///
448 ///       condition:
449 ///         expression
450 ///         type-specifier-seq declarator '=' assignment-expression
451 /// [C++11] type-specifier-seq declarator '=' initializer-clause
452 /// [C++11] type-specifier-seq declarator braced-init-list
453 /// [GNU]   type-specifier-seq declarator simple-asm-expr[opt] attributes[opt]
454 ///             '=' assignment-expression
455 ///       simple-declaration:
456 ///         decl-specifier-seq init-declarator-list[opt] ';'
457 ///
458 /// Note that, unlike isCXXSimpleDeclaration, we must disambiguate all the way
459 /// to the ';' to disambiguate cases like 'int(x))' (an expression) from
460 /// 'int(x);' (a simple-declaration in an init-statement).
461 Parser::ConditionOrInitStatement
462 Parser::isCXXConditionDeclarationOrInitStatement(bool CanBeInitStatement,
463                                                  bool CanBeForRangeDecl) {
464   ConditionDeclarationOrInitStatementState State(*this, CanBeInitStatement,
465                                                  CanBeForRangeDecl);
466 
467   if (State.update(isCXXDeclarationSpecifier()))
468     return State.result();
469 
470   // It might be a declaration; we need tentative parsing.
471   RevertingTentativeParsingAction PA(*this);
472 
473   // FIXME: A tag definition unambiguously tells us this is an init-statement.
474   if (State.update(TryConsumeDeclarationSpecifier()))
475     return State.result();
476   assert(Tok.is(tok::l_paren) && "Expected '('");
477 
478   while (true) {
479     // Consume a declarator.
480     if (State.update(TryParseDeclarator(false/*mayBeAbstract*/)))
481       return State.result();
482 
483     // Attributes, asm label, or an initializer imply this is not an expression.
484     // FIXME: Disambiguate properly after an = instead of assuming that it's a
485     // valid declaration.
486     if (Tok.isOneOf(tok::equal, tok::kw_asm, tok::kw___attribute) ||
487         (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace))) {
488       State.markNotExpression();
489       return State.result();
490     }
491 
492     // A colon here identifies a for-range declaration.
493     if (State.CanBeForRangeDecl && Tok.is(tok::colon))
494       return ConditionOrInitStatement::ForRangeDecl;
495 
496     // At this point, it can't be a condition any more, because a condition
497     // must have a brace-or-equal-initializer.
498     if (State.markNotCondition())
499       return State.result();
500 
501     // Likewise, it can't be a for-range declaration any more.
502     if (State.markNotForRangeDecl())
503       return State.result();
504 
505     // A parenthesized initializer could be part of an expression or a
506     // simple-declaration.
507     if (Tok.is(tok::l_paren)) {
508       ConsumeParen();
509       SkipUntil(tok::r_paren, StopAtSemi);
510     }
511 
512     if (!TryConsumeToken(tok::comma))
513       break;
514   }
515 
516   // We reached the end. If it can now be some kind of decl, then it is.
517   if (State.CanBeCondition && Tok.is(tok::r_paren))
518     return ConditionOrInitStatement::ConditionDecl;
519   else if (State.CanBeInitStatement && Tok.is(tok::semi))
520     return ConditionOrInitStatement::InitStmtDecl;
521   else
522     return ConditionOrInitStatement::Expression;
523 }
524 
525   /// Determine whether the next set of tokens contains a type-id.
526   ///
527   /// The context parameter states what context we're parsing right
528   /// now, which affects how this routine copes with the token
529   /// following the type-id. If the context is TypeIdInParens, we have
530   /// already parsed the '(' and we will cease lookahead when we hit
531   /// the corresponding ')'. If the context is
532   /// TypeIdAsTemplateArgument, we've already parsed the '<' or ','
533   /// before this template argument, and will cease lookahead when we
534   /// hit a '>', '>>' (in C++0x), or ','; or, in C++0x, an ellipsis immediately
535   /// preceding such. Returns true for a type-id and false for an expression.
536   /// If during the disambiguation process a parsing error is encountered,
537   /// the function returns true to let the declaration parsing code handle it.
538   ///
539   /// type-id:
540   ///   type-specifier-seq abstract-declarator[opt]
541   ///
542 bool Parser::isCXXTypeId(TentativeCXXTypeIdContext Context, bool &isAmbiguous) {
543 
544   isAmbiguous = false;
545 
546   // C++ 8.2p2:
547   // The ambiguity arising from the similarity between a function-style cast and
548   // a type-id can occur in different contexts. The ambiguity appears as a
549   // choice between a function-style cast expression and a declaration of a
550   // type. The resolution is that any construct that could possibly be a type-id
551   // in its syntactic context shall be considered a type-id.
552 
553   TPResult TPR = isCXXDeclarationSpecifier();
554   if (TPR != TPResult::Ambiguous)
555     return TPR != TPResult::False; // Returns true for TPResult::True or
556                                      // TPResult::Error.
557 
558   // FIXME: Add statistics about the number of ambiguous statements encountered
559   // and how they were resolved (number of declarations+number of expressions).
560 
561   // Ok, we have a simple-type-specifier/typename-specifier followed by a '('.
562   // We need tentative parsing...
563 
564   RevertingTentativeParsingAction PA(*this);
565 
566   // type-specifier-seq
567   TryConsumeDeclarationSpecifier();
568   assert(Tok.is(tok::l_paren) && "Expected '('");
569 
570   // declarator
571   TPR = TryParseDeclarator(true/*mayBeAbstract*/, false/*mayHaveIdentifier*/);
572 
573   // In case of an error, let the declaration parsing code handle it.
574   if (TPR == TPResult::Error)
575     TPR = TPResult::True;
576 
577   if (TPR == TPResult::Ambiguous) {
578     // We are supposed to be inside parens, so if after the abstract declarator
579     // we encounter a ')' this is a type-id, otherwise it's an expression.
580     if (Context == TypeIdInParens && Tok.is(tok::r_paren)) {
581       TPR = TPResult::True;
582       isAmbiguous = true;
583 
584     // We are supposed to be inside a template argument, so if after
585     // the abstract declarator we encounter a '>', '>>' (in C++0x), or
586     // ','; or, in C++0x, an ellipsis immediately preceding such, this
587     // is a type-id. Otherwise, it's an expression.
588     } else if (Context == TypeIdAsTemplateArgument &&
589                (Tok.isOneOf(tok::greater, tok::comma) ||
590                 (getLangOpts().CPlusPlus11 &&
591                  (Tok.isOneOf(tok::greatergreater,
592                               tok::greatergreatergreater) ||
593                   (Tok.is(tok::ellipsis) &&
594                    NextToken().isOneOf(tok::greater, tok::greatergreater,
595                                        tok::greatergreatergreater,
596                                        tok::comma)))))) {
597       TPR = TPResult::True;
598       isAmbiguous = true;
599 
600     } else
601       TPR = TPResult::False;
602   }
603 
604   assert(TPR == TPResult::True || TPR == TPResult::False);
605   return TPR == TPResult::True;
606 }
607 
608 /// Returns true if this is a C++11 attribute-specifier. Per
609 /// C++11 [dcl.attr.grammar]p6, two consecutive left square bracket tokens
610 /// always introduce an attribute. In Objective-C++11, this rule does not
611 /// apply if either '[' begins a message-send.
612 ///
613 /// If Disambiguate is true, we try harder to determine whether a '[[' starts
614 /// an attribute-specifier, and return CAK_InvalidAttributeSpecifier if not.
615 ///
616 /// If OuterMightBeMessageSend is true, we assume the outer '[' is either an
617 /// Obj-C message send or the start of an attribute. Otherwise, we assume it
618 /// is not an Obj-C message send.
619 ///
620 /// C++11 [dcl.attr.grammar]:
621 ///
622 ///     attribute-specifier:
623 ///         '[' '[' attribute-list ']' ']'
624 ///         alignment-specifier
625 ///
626 ///     attribute-list:
627 ///         attribute[opt]
628 ///         attribute-list ',' attribute[opt]
629 ///         attribute '...'
630 ///         attribute-list ',' attribute '...'
631 ///
632 ///     attribute:
633 ///         attribute-token attribute-argument-clause[opt]
634 ///
635 ///     attribute-token:
636 ///         identifier
637 ///         identifier '::' identifier
638 ///
639 ///     attribute-argument-clause:
640 ///         '(' balanced-token-seq ')'
641 Parser::CXX11AttributeKind
642 Parser::isCXX11AttributeSpecifier(bool Disambiguate,
643                                   bool OuterMightBeMessageSend) {
644   if (Tok.is(tok::kw_alignas))
645     return CAK_AttributeSpecifier;
646 
647   if (Tok.isNot(tok::l_square) || NextToken().isNot(tok::l_square))
648     return CAK_NotAttributeSpecifier;
649 
650   // No tentative parsing if we don't need to look for ']]' or a lambda.
651   if (!Disambiguate && !getLangOpts().ObjC)
652     return CAK_AttributeSpecifier;
653 
654   // '[[using ns: ...]]' is an attribute.
655   if (GetLookAheadToken(2).is(tok::kw_using))
656     return CAK_AttributeSpecifier;
657 
658   RevertingTentativeParsingAction PA(*this);
659 
660   // Opening brackets were checked for above.
661   ConsumeBracket();
662 
663   if (!getLangOpts().ObjC) {
664     ConsumeBracket();
665 
666     bool IsAttribute = SkipUntil(tok::r_square);
667     IsAttribute &= Tok.is(tok::r_square);
668 
669     return IsAttribute ? CAK_AttributeSpecifier : CAK_InvalidAttributeSpecifier;
670   }
671 
672   // In Obj-C++11, we need to distinguish four situations:
673   //  1a) int x[[attr]];                     C++11 attribute.
674   //  1b) [[attr]];                          C++11 statement attribute.
675   //   2) int x[[obj](){ return 1; }()];     Lambda in array size/index.
676   //  3a) int x[[obj get]];                  Message send in array size/index.
677   //  3b) [[Class alloc] init];              Message send in message send.
678   //   4) [[obj]{ return self; }() doStuff]; Lambda in message send.
679   // (1) is an attribute, (2) is ill-formed, and (3) and (4) are accepted.
680 
681   // Check to see if this is a lambda-expression.
682   // FIXME: If this disambiguation is too slow, fold the tentative lambda parse
683   // into the tentative attribute parse below.
684   {
685     RevertingTentativeParsingAction LambdaTPA(*this);
686     LambdaIntroducer Intro;
687     LambdaIntroducerTentativeParse Tentative;
688     if (ParseLambdaIntroducer(Intro, &Tentative)) {
689       // We hit a hard error after deciding this was not an attribute.
690       // FIXME: Don't parse and annotate expressions when disambiguating
691       // against an attribute.
692       return CAK_NotAttributeSpecifier;
693     }
694 
695     switch (Tentative) {
696     case LambdaIntroducerTentativeParse::MessageSend:
697       // Case 3: The inner construct is definitely a message send, so the
698       // outer construct is definitely not an attribute.
699       return CAK_NotAttributeSpecifier;
700 
701     case LambdaIntroducerTentativeParse::Success:
702     case LambdaIntroducerTentativeParse::Incomplete:
703       // This is a lambda-introducer or attribute-specifier.
704       if (Tok.is(tok::r_square))
705         // Case 1: C++11 attribute.
706         return CAK_AttributeSpecifier;
707 
708       if (OuterMightBeMessageSend)
709         // Case 4: Lambda in message send.
710         return CAK_NotAttributeSpecifier;
711 
712       // Case 2: Lambda in array size / index.
713       return CAK_InvalidAttributeSpecifier;
714 
715     case LambdaIntroducerTentativeParse::Invalid:
716       // No idea what this is; we couldn't parse it as a lambda-introducer.
717       // Might still be an attribute-specifier or a message send.
718       break;
719     }
720   }
721 
722   ConsumeBracket();
723 
724   // If we don't have a lambda-introducer, then we have an attribute or a
725   // message-send.
726   bool IsAttribute = true;
727   while (Tok.isNot(tok::r_square)) {
728     if (Tok.is(tok::comma)) {
729       // Case 1: Stray commas can only occur in attributes.
730       return CAK_AttributeSpecifier;
731     }
732 
733     // Parse the attribute-token, if present.
734     // C++11 [dcl.attr.grammar]:
735     //   If a keyword or an alternative token that satisfies the syntactic
736     //   requirements of an identifier is contained in an attribute-token,
737     //   it is considered an identifier.
738     SourceLocation Loc;
739     if (!TryParseCXX11AttributeIdentifier(Loc)) {
740       IsAttribute = false;
741       break;
742     }
743     if (Tok.is(tok::coloncolon)) {
744       ConsumeToken();
745       if (!TryParseCXX11AttributeIdentifier(Loc)) {
746         IsAttribute = false;
747         break;
748       }
749     }
750 
751     // Parse the attribute-argument-clause, if present.
752     if (Tok.is(tok::l_paren)) {
753       ConsumeParen();
754       if (!SkipUntil(tok::r_paren)) {
755         IsAttribute = false;
756         break;
757       }
758     }
759 
760     TryConsumeToken(tok::ellipsis);
761 
762     if (!TryConsumeToken(tok::comma))
763       break;
764   }
765 
766   // An attribute must end ']]'.
767   if (IsAttribute) {
768     if (Tok.is(tok::r_square)) {
769       ConsumeBracket();
770       IsAttribute = Tok.is(tok::r_square);
771     } else {
772       IsAttribute = false;
773     }
774   }
775 
776   if (IsAttribute)
777     // Case 1: C++11 statement attribute.
778     return CAK_AttributeSpecifier;
779 
780   // Case 3: Message send.
781   return CAK_NotAttributeSpecifier;
782 }
783 
784 Parser::TPResult Parser::TryParsePtrOperatorSeq() {
785   while (true) {
786     if (TryAnnotateOptionalCXXScopeToken(true))
787       return TPResult::Error;
788 
789     if (Tok.isOneOf(tok::star, tok::amp, tok::caret, tok::ampamp) ||
790         (Tok.is(tok::annot_cxxscope) && NextToken().is(tok::star))) {
791       // ptr-operator
792       ConsumeAnyToken();
793       while (Tok.isOneOf(tok::kw_const, tok::kw_volatile, tok::kw_restrict,
794                          tok::kw__Nonnull, tok::kw__Nullable,
795                          tok::kw__Null_unspecified))
796         ConsumeToken();
797     } else {
798       return TPResult::True;
799     }
800   }
801 }
802 
803 ///         operator-function-id:
804 ///           'operator' operator
805 ///
806 ///         operator: one of
807 ///           new  delete  new[]  delete[]  +  -  *  /  %  ^  [...]
808 ///
809 ///         conversion-function-id:
810 ///           'operator' conversion-type-id
811 ///
812 ///         conversion-type-id:
813 ///           type-specifier-seq conversion-declarator[opt]
814 ///
815 ///         conversion-declarator:
816 ///           ptr-operator conversion-declarator[opt]
817 ///
818 ///         literal-operator-id:
819 ///           'operator' string-literal identifier
820 ///           'operator' user-defined-string-literal
821 Parser::TPResult Parser::TryParseOperatorId() {
822   assert(Tok.is(tok::kw_operator));
823   ConsumeToken();
824 
825   // Maybe this is an operator-function-id.
826   switch (Tok.getKind()) {
827   case tok::kw_new: case tok::kw_delete:
828     ConsumeToken();
829     if (Tok.is(tok::l_square) && NextToken().is(tok::r_square)) {
830       ConsumeBracket();
831       ConsumeBracket();
832     }
833     return TPResult::True;
834 
835 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemOnly) \
836   case tok::Token:
837 #define OVERLOADED_OPERATOR_MULTI(Name, Spelling, Unary, Binary, MemOnly)
838 #include "clang/Basic/OperatorKinds.def"
839     ConsumeToken();
840     return TPResult::True;
841 
842   case tok::l_square:
843     if (NextToken().is(tok::r_square)) {
844       ConsumeBracket();
845       ConsumeBracket();
846       return TPResult::True;
847     }
848     break;
849 
850   case tok::l_paren:
851     if (NextToken().is(tok::r_paren)) {
852       ConsumeParen();
853       ConsumeParen();
854       return TPResult::True;
855     }
856     break;
857 
858   default:
859     break;
860   }
861 
862   // Maybe this is a literal-operator-id.
863   if (getLangOpts().CPlusPlus11 && isTokenStringLiteral()) {
864     bool FoundUDSuffix = false;
865     do {
866       FoundUDSuffix |= Tok.hasUDSuffix();
867       ConsumeStringToken();
868     } while (isTokenStringLiteral());
869 
870     if (!FoundUDSuffix) {
871       if (Tok.is(tok::identifier))
872         ConsumeToken();
873       else
874         return TPResult::Error;
875     }
876     return TPResult::True;
877   }
878 
879   // Maybe this is a conversion-function-id.
880   bool AnyDeclSpecifiers = false;
881   while (true) {
882     TPResult TPR = isCXXDeclarationSpecifier();
883     if (TPR == TPResult::Error)
884       return TPR;
885     if (TPR == TPResult::False) {
886       if (!AnyDeclSpecifiers)
887         return TPResult::Error;
888       break;
889     }
890     if (TryConsumeDeclarationSpecifier() == TPResult::Error)
891       return TPResult::Error;
892     AnyDeclSpecifiers = true;
893   }
894   return TryParsePtrOperatorSeq();
895 }
896 
897 ///         declarator:
898 ///           direct-declarator
899 ///           ptr-operator declarator
900 ///
901 ///         direct-declarator:
902 ///           declarator-id
903 ///           direct-declarator '(' parameter-declaration-clause ')'
904 ///                 cv-qualifier-seq[opt] exception-specification[opt]
905 ///           direct-declarator '[' constant-expression[opt] ']'
906 ///           '(' declarator ')'
907 /// [GNU]     '(' attributes declarator ')'
908 ///
909 ///         abstract-declarator:
910 ///           ptr-operator abstract-declarator[opt]
911 ///           direct-abstract-declarator
912 ///
913 ///         direct-abstract-declarator:
914 ///           direct-abstract-declarator[opt]
915 ///                 '(' parameter-declaration-clause ')' cv-qualifier-seq[opt]
916 ///                 exception-specification[opt]
917 ///           direct-abstract-declarator[opt] '[' constant-expression[opt] ']'
918 ///           '(' abstract-declarator ')'
919 /// [C++0x]   ...
920 ///
921 ///         ptr-operator:
922 ///           '*' cv-qualifier-seq[opt]
923 ///           '&'
924 /// [C++0x]   '&&'                                                        [TODO]
925 ///           '::'[opt] nested-name-specifier '*' cv-qualifier-seq[opt]
926 ///
927 ///         cv-qualifier-seq:
928 ///           cv-qualifier cv-qualifier-seq[opt]
929 ///
930 ///         cv-qualifier:
931 ///           'const'
932 ///           'volatile'
933 ///
934 ///         declarator-id:
935 ///           '...'[opt] id-expression
936 ///
937 ///         id-expression:
938 ///           unqualified-id
939 ///           qualified-id                                                [TODO]
940 ///
941 ///         unqualified-id:
942 ///           identifier
943 ///           operator-function-id
944 ///           conversion-function-id
945 ///           literal-operator-id
946 ///           '~' class-name                                              [TODO]
947 ///           '~' decltype-specifier                                      [TODO]
948 ///           template-id                                                 [TODO]
949 ///
950 Parser::TPResult Parser::TryParseDeclarator(bool mayBeAbstract,
951                                             bool mayHaveIdentifier,
952                                             bool mayHaveDirectInit) {
953   // declarator:
954   //   direct-declarator
955   //   ptr-operator declarator
956   if (TryParsePtrOperatorSeq() == TPResult::Error)
957     return TPResult::Error;
958 
959   // direct-declarator:
960   // direct-abstract-declarator:
961   if (Tok.is(tok::ellipsis))
962     ConsumeToken();
963 
964   if ((Tok.isOneOf(tok::identifier, tok::kw_operator) ||
965        (Tok.is(tok::annot_cxxscope) && (NextToken().is(tok::identifier) ||
966                                         NextToken().is(tok::kw_operator)))) &&
967       mayHaveIdentifier) {
968     // declarator-id
969     if (Tok.is(tok::annot_cxxscope))
970       ConsumeAnnotationToken();
971     else if (Tok.is(tok::identifier))
972       TentativelyDeclaredIdentifiers.push_back(Tok.getIdentifierInfo());
973     if (Tok.is(tok::kw_operator)) {
974       if (TryParseOperatorId() == TPResult::Error)
975         return TPResult::Error;
976     } else
977       ConsumeToken();
978   } else if (Tok.is(tok::l_paren)) {
979     ConsumeParen();
980     if (mayBeAbstract &&
981         (Tok.is(tok::r_paren) ||       // 'int()' is a function.
982          // 'int(...)' is a function.
983          (Tok.is(tok::ellipsis) && NextToken().is(tok::r_paren)) ||
984          isDeclarationSpecifier())) {   // 'int(int)' is a function.
985       // '(' parameter-declaration-clause ')' cv-qualifier-seq[opt]
986       //        exception-specification[opt]
987       TPResult TPR = TryParseFunctionDeclarator();
988       if (TPR != TPResult::Ambiguous)
989         return TPR;
990     } else {
991       // '(' declarator ')'
992       // '(' attributes declarator ')'
993       // '(' abstract-declarator ')'
994       if (Tok.isOneOf(tok::kw___attribute, tok::kw___declspec, tok::kw___cdecl,
995                       tok::kw___stdcall, tok::kw___fastcall, tok::kw___thiscall,
996                       tok::kw___regcall, tok::kw___vectorcall))
997         return TPResult::True; // attributes indicate declaration
998       TPResult TPR = TryParseDeclarator(mayBeAbstract, mayHaveIdentifier);
999       if (TPR != TPResult::Ambiguous)
1000         return TPR;
1001       if (Tok.isNot(tok::r_paren))
1002         return TPResult::False;
1003       ConsumeParen();
1004     }
1005   } else if (!mayBeAbstract) {
1006     return TPResult::False;
1007   }
1008 
1009   if (mayHaveDirectInit)
1010     return TPResult::Ambiguous;
1011 
1012   while (1) {
1013     TPResult TPR(TPResult::Ambiguous);
1014 
1015     if (Tok.is(tok::l_paren)) {
1016       // Check whether we have a function declarator or a possible ctor-style
1017       // initializer that follows the declarator. Note that ctor-style
1018       // initializers are not possible in contexts where abstract declarators
1019       // are allowed.
1020       if (!mayBeAbstract && !isCXXFunctionDeclarator())
1021         break;
1022 
1023       // direct-declarator '(' parameter-declaration-clause ')'
1024       //        cv-qualifier-seq[opt] exception-specification[opt]
1025       ConsumeParen();
1026       TPR = TryParseFunctionDeclarator();
1027     } else if (Tok.is(tok::l_square)) {
1028       // direct-declarator '[' constant-expression[opt] ']'
1029       // direct-abstract-declarator[opt] '[' constant-expression[opt] ']'
1030       TPR = TryParseBracketDeclarator();
1031     } else if (Tok.is(tok::kw_requires)) {
1032       // declarator requires-clause
1033       // A requires clause indicates a function declaration.
1034       TPR = TPResult::True;
1035     } else {
1036       break;
1037     }
1038 
1039     if (TPR != TPResult::Ambiguous)
1040       return TPR;
1041   }
1042 
1043   return TPResult::Ambiguous;
1044 }
1045 
1046 Parser::TPResult
1047 Parser::isExpressionOrTypeSpecifierSimple(tok::TokenKind Kind) {
1048   switch (Kind) {
1049   // Obviously starts an expression.
1050   case tok::numeric_constant:
1051   case tok::char_constant:
1052   case tok::wide_char_constant:
1053   case tok::utf8_char_constant:
1054   case tok::utf16_char_constant:
1055   case tok::utf32_char_constant:
1056   case tok::string_literal:
1057   case tok::wide_string_literal:
1058   case tok::utf8_string_literal:
1059   case tok::utf16_string_literal:
1060   case tok::utf32_string_literal:
1061   case tok::l_square:
1062   case tok::l_paren:
1063   case tok::amp:
1064   case tok::ampamp:
1065   case tok::star:
1066   case tok::plus:
1067   case tok::plusplus:
1068   case tok::minus:
1069   case tok::minusminus:
1070   case tok::tilde:
1071   case tok::exclaim:
1072   case tok::kw_sizeof:
1073   case tok::kw___func__:
1074   case tok::kw_const_cast:
1075   case tok::kw_delete:
1076   case tok::kw_dynamic_cast:
1077   case tok::kw_false:
1078   case tok::kw_new:
1079   case tok::kw_operator:
1080   case tok::kw_reinterpret_cast:
1081   case tok::kw_static_cast:
1082   case tok::kw_this:
1083   case tok::kw_throw:
1084   case tok::kw_true:
1085   case tok::kw_typeid:
1086   case tok::kw_alignof:
1087   case tok::kw_noexcept:
1088   case tok::kw_nullptr:
1089   case tok::kw__Alignof:
1090   case tok::kw___null:
1091   case tok::kw___alignof:
1092   case tok::kw___builtin_choose_expr:
1093   case tok::kw___builtin_offsetof:
1094   case tok::kw___builtin_va_arg:
1095   case tok::kw___imag:
1096   case tok::kw___real:
1097   case tok::kw___FUNCTION__:
1098   case tok::kw___FUNCDNAME__:
1099   case tok::kw___FUNCSIG__:
1100   case tok::kw_L__FUNCTION__:
1101   case tok::kw_L__FUNCSIG__:
1102   case tok::kw___PRETTY_FUNCTION__:
1103   case tok::kw___uuidof:
1104 #define TYPE_TRAIT(N,Spelling,K) \
1105   case tok::kw_##Spelling:
1106 #include "clang/Basic/TokenKinds.def"
1107     return TPResult::True;
1108 
1109   // Obviously starts a type-specifier-seq:
1110   case tok::kw_char:
1111   case tok::kw_const:
1112   case tok::kw_double:
1113   case tok::kw__Float16:
1114   case tok::kw___float128:
1115   case tok::kw_enum:
1116   case tok::kw_half:
1117   case tok::kw_float:
1118   case tok::kw_int:
1119   case tok::kw_long:
1120   case tok::kw___int64:
1121   case tok::kw___int128:
1122   case tok::kw_restrict:
1123   case tok::kw_short:
1124   case tok::kw_signed:
1125   case tok::kw_struct:
1126   case tok::kw_union:
1127   case tok::kw_unsigned:
1128   case tok::kw_void:
1129   case tok::kw_volatile:
1130   case tok::kw__Bool:
1131   case tok::kw__Complex:
1132   case tok::kw_class:
1133   case tok::kw_typename:
1134   case tok::kw_wchar_t:
1135   case tok::kw_char8_t:
1136   case tok::kw_char16_t:
1137   case tok::kw_char32_t:
1138   case tok::kw__Decimal32:
1139   case tok::kw__Decimal64:
1140   case tok::kw__Decimal128:
1141   case tok::kw___interface:
1142   case tok::kw___thread:
1143   case tok::kw_thread_local:
1144   case tok::kw__Thread_local:
1145   case tok::kw_typeof:
1146   case tok::kw___underlying_type:
1147   case tok::kw___cdecl:
1148   case tok::kw___stdcall:
1149   case tok::kw___fastcall:
1150   case tok::kw___thiscall:
1151   case tok::kw___regcall:
1152   case tok::kw___vectorcall:
1153   case tok::kw___unaligned:
1154   case tok::kw___vector:
1155   case tok::kw___pixel:
1156   case tok::kw___bool:
1157   case tok::kw__Atomic:
1158 #define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t:
1159 #include "clang/Basic/OpenCLImageTypes.def"
1160   case tok::kw___unknown_anytype:
1161     return TPResult::False;
1162 
1163   default:
1164     break;
1165   }
1166 
1167   return TPResult::Ambiguous;
1168 }
1169 
1170 bool Parser::isTentativelyDeclared(IdentifierInfo *II) {
1171   return std::find(TentativelyDeclaredIdentifiers.begin(),
1172                    TentativelyDeclaredIdentifiers.end(), II)
1173       != TentativelyDeclaredIdentifiers.end();
1174 }
1175 
1176 namespace {
1177 class TentativeParseCCC final : public CorrectionCandidateCallback {
1178 public:
1179   TentativeParseCCC(const Token &Next) {
1180     WantRemainingKeywords = false;
1181     WantTypeSpecifiers = Next.isOneOf(tok::l_paren, tok::r_paren, tok::greater,
1182                                       tok::l_brace, tok::identifier);
1183   }
1184 
1185   bool ValidateCandidate(const TypoCorrection &Candidate) override {
1186     // Reject any candidate that only resolves to instance members since they
1187     // aren't viable as standalone identifiers instead of member references.
1188     if (Candidate.isResolved() && !Candidate.isKeyword() &&
1189         llvm::all_of(Candidate,
1190                      [](NamedDecl *ND) { return ND->isCXXInstanceMember(); }))
1191       return false;
1192 
1193     return CorrectionCandidateCallback::ValidateCandidate(Candidate);
1194   }
1195 
1196   std::unique_ptr<CorrectionCandidateCallback> clone() override {
1197     return std::make_unique<TentativeParseCCC>(*this);
1198   }
1199 };
1200 }
1201 /// isCXXDeclarationSpecifier - Returns TPResult::True if it is a declaration
1202 /// specifier, TPResult::False if it is not, TPResult::Ambiguous if it could
1203 /// be either a decl-specifier or a function-style cast, and TPResult::Error
1204 /// if a parsing error was found and reported.
1205 ///
1206 /// If InvalidAsDeclSpec is not null, some cases that would be ill-formed as
1207 /// declaration specifiers but possibly valid as some other kind of construct
1208 /// return TPResult::Ambiguous instead of TPResult::False. When this happens,
1209 /// the intent is to keep trying to disambiguate, on the basis that we might
1210 /// find a better reason to treat this construct as a declaration later on.
1211 /// When this happens and the name could possibly be valid in some other
1212 /// syntactic context, *InvalidAsDeclSpec is set to 'true'. The current cases
1213 /// that trigger this are:
1214 ///
1215 ///   * When parsing X::Y (with no 'typename') where X is dependent
1216 ///   * When parsing X<Y> where X is undeclared
1217 ///
1218 ///         decl-specifier:
1219 ///           storage-class-specifier
1220 ///           type-specifier
1221 ///           function-specifier
1222 ///           'friend'
1223 ///           'typedef'
1224 /// [C++11]   'constexpr'
1225 /// [C++20]   'consteval'
1226 /// [GNU]     attributes declaration-specifiers[opt]
1227 ///
1228 ///         storage-class-specifier:
1229 ///           'register'
1230 ///           'static'
1231 ///           'extern'
1232 ///           'mutable'
1233 ///           'auto'
1234 /// [GNU]     '__thread'
1235 /// [C++11]   'thread_local'
1236 /// [C11]     '_Thread_local'
1237 ///
1238 ///         function-specifier:
1239 ///           'inline'
1240 ///           'virtual'
1241 ///           'explicit'
1242 ///
1243 ///         typedef-name:
1244 ///           identifier
1245 ///
1246 ///         type-specifier:
1247 ///           simple-type-specifier
1248 ///           class-specifier
1249 ///           enum-specifier
1250 ///           elaborated-type-specifier
1251 ///           typename-specifier
1252 ///           cv-qualifier
1253 ///
1254 ///         simple-type-specifier:
1255 ///           '::'[opt] nested-name-specifier[opt] type-name
1256 ///           '::'[opt] nested-name-specifier 'template'
1257 ///                 simple-template-id                              [TODO]
1258 ///           'char'
1259 ///           'wchar_t'
1260 ///           'bool'
1261 ///           'short'
1262 ///           'int'
1263 ///           'long'
1264 ///           'signed'
1265 ///           'unsigned'
1266 ///           'float'
1267 ///           'double'
1268 ///           'void'
1269 /// [GNU]     typeof-specifier
1270 /// [GNU]     '_Complex'
1271 /// [C++11]   'auto'
1272 /// [GNU]     '__auto_type'
1273 /// [C++11]   'decltype' ( expression )
1274 /// [C++1y]   'decltype' ( 'auto' )
1275 ///
1276 ///         type-name:
1277 ///           class-name
1278 ///           enum-name
1279 ///           typedef-name
1280 ///
1281 ///         elaborated-type-specifier:
1282 ///           class-key '::'[opt] nested-name-specifier[opt] identifier
1283 ///           class-key '::'[opt] nested-name-specifier[opt] 'template'[opt]
1284 ///               simple-template-id
1285 ///           'enum' '::'[opt] nested-name-specifier[opt] identifier
1286 ///
1287 ///         enum-name:
1288 ///           identifier
1289 ///
1290 ///         enum-specifier:
1291 ///           'enum' identifier[opt] '{' enumerator-list[opt] '}'
1292 ///           'enum' identifier[opt] '{' enumerator-list ',' '}'
1293 ///
1294 ///         class-specifier:
1295 ///           class-head '{' member-specification[opt] '}'
1296 ///
1297 ///         class-head:
1298 ///           class-key identifier[opt] base-clause[opt]
1299 ///           class-key nested-name-specifier identifier base-clause[opt]
1300 ///           class-key nested-name-specifier[opt] simple-template-id
1301 ///               base-clause[opt]
1302 ///
1303 ///         class-key:
1304 ///           'class'
1305 ///           'struct'
1306 ///           'union'
1307 ///
1308 ///         cv-qualifier:
1309 ///           'const'
1310 ///           'volatile'
1311 /// [GNU]     restrict
1312 ///
1313 Parser::TPResult
1314 Parser::isCXXDeclarationSpecifier(Parser::TPResult BracedCastResult,
1315                                   bool *InvalidAsDeclSpec) {
1316   auto IsPlaceholderSpecifier = [&] (TemplateIdAnnotation *TemplateId,
1317                                      int Lookahead) {
1318     // We have a placeholder-constraint (we check for 'auto' or 'decltype' to
1319     // distinguish 'C<int>;' from 'C<int> auto c = 1;')
1320     return TemplateId->Kind == TNK_Concept_template &&
1321         GetLookAheadToken(Lookahead + 1).isOneOf(tok::kw_auto, tok::kw_decltype,
1322             // If we have an identifier here, the user probably forgot the
1323             // 'auto' in the placeholder constraint, e.g. 'C<int> x = 2;'
1324             // This will be diagnosed nicely later, so disambiguate as a
1325             // declaration.
1326             tok::identifier);
1327   };
1328   switch (Tok.getKind()) {
1329   case tok::identifier: {
1330     // Check for need to substitute AltiVec __vector keyword
1331     // for "vector" identifier.
1332     if (TryAltiVecVectorToken())
1333       return TPResult::True;
1334 
1335     const Token &Next = NextToken();
1336     // In 'foo bar', 'foo' is always a type name outside of Objective-C.
1337     if (!getLangOpts().ObjC && Next.is(tok::identifier))
1338       return TPResult::True;
1339 
1340     if (Next.isNot(tok::coloncolon) && Next.isNot(tok::less)) {
1341       // Determine whether this is a valid expression. If not, we will hit
1342       // a parse error one way or another. In that case, tell the caller that
1343       // this is ambiguous. Typo-correct to type and expression keywords and
1344       // to types and identifiers, in order to try to recover from errors.
1345       TentativeParseCCC CCC(Next);
1346       switch (TryAnnotateName(&CCC)) {
1347       case ANK_Error:
1348         return TPResult::Error;
1349       case ANK_TentativeDecl:
1350         return TPResult::False;
1351       case ANK_TemplateName:
1352         // In C++17, this could be a type template for class template argument
1353         // deduction. Try to form a type annotation for it. If we're in a
1354         // template template argument, we'll undo this when checking the
1355         // validity of the argument.
1356         if (getLangOpts().CPlusPlus17) {
1357           if (TryAnnotateTypeOrScopeToken())
1358             return TPResult::Error;
1359           if (Tok.isNot(tok::identifier))
1360             break;
1361         }
1362 
1363         // A bare type template-name which can't be a template template
1364         // argument is an error, and was probably intended to be a type.
1365         return GreaterThanIsOperator ? TPResult::True : TPResult::False;
1366       case ANK_Unresolved:
1367         return InvalidAsDeclSpec ? TPResult::Ambiguous : TPResult::False;
1368       case ANK_Success:
1369         break;
1370       }
1371       assert(Tok.isNot(tok::identifier) &&
1372              "TryAnnotateName succeeded without producing an annotation");
1373     } else {
1374       // This might possibly be a type with a dependent scope specifier and
1375       // a missing 'typename' keyword. Don't use TryAnnotateName in this case,
1376       // since it will annotate as a primary expression, and we want to use the
1377       // "missing 'typename'" logic.
1378       if (TryAnnotateTypeOrScopeToken())
1379         return TPResult::Error;
1380       // If annotation failed, assume it's a non-type.
1381       // FIXME: If this happens due to an undeclared identifier, treat it as
1382       // ambiguous.
1383       if (Tok.is(tok::identifier))
1384         return TPResult::False;
1385     }
1386 
1387     // We annotated this token as something. Recurse to handle whatever we got.
1388     return isCXXDeclarationSpecifier(BracedCastResult, InvalidAsDeclSpec);
1389   }
1390 
1391   case tok::kw_typename:  // typename T::type
1392     // Annotate typenames and C++ scope specifiers.  If we get one, just
1393     // recurse to handle whatever we get.
1394     if (TryAnnotateTypeOrScopeToken())
1395       return TPResult::Error;
1396     return isCXXDeclarationSpecifier(BracedCastResult, InvalidAsDeclSpec);
1397 
1398   case tok::coloncolon: {    // ::foo::bar
1399     const Token &Next = NextToken();
1400     if (Next.isOneOf(tok::kw_new,       // ::new
1401                      tok::kw_delete))   // ::delete
1402       return TPResult::False;
1403     LLVM_FALLTHROUGH;
1404   }
1405   case tok::kw___super:
1406   case tok::kw_decltype:
1407     // Annotate typenames and C++ scope specifiers.  If we get one, just
1408     // recurse to handle whatever we get.
1409     if (TryAnnotateTypeOrScopeToken())
1410       return TPResult::Error;
1411     return isCXXDeclarationSpecifier(BracedCastResult, InvalidAsDeclSpec);
1412 
1413     // decl-specifier:
1414     //   storage-class-specifier
1415     //   type-specifier
1416     //   function-specifier
1417     //   'friend'
1418     //   'typedef'
1419     //   'constexpr'
1420   case tok::kw_friend:
1421   case tok::kw_typedef:
1422   case tok::kw_constexpr:
1423   case tok::kw_consteval:
1424   case tok::kw_constinit:
1425     // storage-class-specifier
1426   case tok::kw_register:
1427   case tok::kw_static:
1428   case tok::kw_extern:
1429   case tok::kw_mutable:
1430   case tok::kw_auto:
1431   case tok::kw___thread:
1432   case tok::kw_thread_local:
1433   case tok::kw__Thread_local:
1434     // function-specifier
1435   case tok::kw_inline:
1436   case tok::kw_virtual:
1437   case tok::kw_explicit:
1438 
1439     // Modules
1440   case tok::kw___module_private__:
1441 
1442     // Debugger support
1443   case tok::kw___unknown_anytype:
1444 
1445     // type-specifier:
1446     //   simple-type-specifier
1447     //   class-specifier
1448     //   enum-specifier
1449     //   elaborated-type-specifier
1450     //   typename-specifier
1451     //   cv-qualifier
1452 
1453     // class-specifier
1454     // elaborated-type-specifier
1455   case tok::kw_class:
1456   case tok::kw_struct:
1457   case tok::kw_union:
1458   case tok::kw___interface:
1459     // enum-specifier
1460   case tok::kw_enum:
1461     // cv-qualifier
1462   case tok::kw_const:
1463   case tok::kw_volatile:
1464     return TPResult::True;
1465 
1466     // OpenCL address space qualifiers
1467   case tok::kw_private:
1468     if (!getLangOpts().OpenCL)
1469       return TPResult::False;
1470     LLVM_FALLTHROUGH;
1471   case tok::kw___private:
1472   case tok::kw___local:
1473   case tok::kw___global:
1474   case tok::kw___constant:
1475   case tok::kw___generic:
1476     // OpenCL access qualifiers
1477   case tok::kw___read_only:
1478   case tok::kw___write_only:
1479   case tok::kw___read_write:
1480     // OpenCL pipe
1481   case tok::kw_pipe:
1482 
1483     // GNU
1484   case tok::kw_restrict:
1485   case tok::kw__Complex:
1486   case tok::kw___attribute:
1487   case tok::kw___auto_type:
1488     return TPResult::True;
1489 
1490     // Microsoft
1491   case tok::kw___declspec:
1492   case tok::kw___cdecl:
1493   case tok::kw___stdcall:
1494   case tok::kw___fastcall:
1495   case tok::kw___thiscall:
1496   case tok::kw___regcall:
1497   case tok::kw___vectorcall:
1498   case tok::kw___w64:
1499   case tok::kw___sptr:
1500   case tok::kw___uptr:
1501   case tok::kw___ptr64:
1502   case tok::kw___ptr32:
1503   case tok::kw___forceinline:
1504   case tok::kw___unaligned:
1505   case tok::kw__Nonnull:
1506   case tok::kw__Nullable:
1507   case tok::kw__Null_unspecified:
1508   case tok::kw___kindof:
1509     return TPResult::True;
1510 
1511     // Borland
1512   case tok::kw___pascal:
1513     return TPResult::True;
1514 
1515     // AltiVec
1516   case tok::kw___vector:
1517     return TPResult::True;
1518 
1519   case tok::annot_template_id: {
1520     TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
1521     // If lookup for the template-name found nothing, don't assume we have a
1522     // definitive disambiguation result yet.
1523     if (TemplateId->Kind == TNK_Undeclared_template && InvalidAsDeclSpec) {
1524       // 'template-id(' can be a valid expression but not a valid decl spec if
1525       // the template-name is not declared, but we don't consider this to be a
1526       // definitive disambiguation. In any other context, it's an error either
1527       // way.
1528       *InvalidAsDeclSpec = NextToken().is(tok::l_paren);
1529       return TPResult::Ambiguous;
1530     }
1531     if (IsPlaceholderSpecifier(TemplateId, /*Lookahead=*/0))
1532       return TPResult::True;
1533     if (TemplateId->Kind != TNK_Type_template)
1534       return TPResult::False;
1535     CXXScopeSpec SS;
1536     AnnotateTemplateIdTokenAsType(SS);
1537     assert(Tok.is(tok::annot_typename));
1538     goto case_typename;
1539   }
1540 
1541   case tok::annot_cxxscope: // foo::bar or ::foo::bar, but already parsed
1542     // We've already annotated a scope; try to annotate a type.
1543     if (TryAnnotateTypeOrScopeToken())
1544       return TPResult::Error;
1545     if (!Tok.is(tok::annot_typename)) {
1546       if (Tok.is(tok::annot_cxxscope) &&
1547           NextToken().is(tok::annot_template_id)) {
1548         TemplateIdAnnotation *TemplateId =
1549             takeTemplateIdAnnotation(NextToken());
1550         if (IsPlaceholderSpecifier(TemplateId, /*Lookahead=*/1))
1551           return TPResult::True;
1552       }
1553       // If the next token is an identifier or a type qualifier, then this
1554       // can't possibly be a valid expression either.
1555       if (Tok.is(tok::annot_cxxscope) && NextToken().is(tok::identifier)) {
1556         CXXScopeSpec SS;
1557         Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(),
1558                                                      Tok.getAnnotationRange(),
1559                                                      SS);
1560         if (SS.getScopeRep() && SS.getScopeRep()->isDependent()) {
1561           RevertingTentativeParsingAction PA(*this);
1562           ConsumeAnnotationToken();
1563           ConsumeToken();
1564           bool isIdentifier = Tok.is(tok::identifier);
1565           TPResult TPR = TPResult::False;
1566           if (!isIdentifier)
1567             TPR = isCXXDeclarationSpecifier(BracedCastResult,
1568                                             InvalidAsDeclSpec);
1569 
1570           if (isIdentifier ||
1571               TPR == TPResult::True || TPR == TPResult::Error)
1572             return TPResult::Error;
1573 
1574           if (InvalidAsDeclSpec) {
1575             // We can't tell whether this is a missing 'typename' or a valid
1576             // expression.
1577             *InvalidAsDeclSpec = true;
1578             return TPResult::Ambiguous;
1579           } else {
1580             // In MS mode, if InvalidAsDeclSpec is not provided, and the tokens
1581             // are or the form *) or &) *> or &> &&>, this can't be an expression.
1582             // The typename must be missing.
1583             if (getLangOpts().MSVCCompat) {
1584               if (((Tok.is(tok::amp) || Tok.is(tok::star)) &&
1585                    (NextToken().is(tok::r_paren) ||
1586                     NextToken().is(tok::greater))) ||
1587                   (Tok.is(tok::ampamp) && NextToken().is(tok::greater)))
1588                 return TPResult::True;
1589             }
1590           }
1591         } else {
1592           // Try to resolve the name. If it doesn't exist, assume it was
1593           // intended to name a type and keep disambiguating.
1594           switch (TryAnnotateName()) {
1595           case ANK_Error:
1596             return TPResult::Error;
1597           case ANK_TentativeDecl:
1598             return TPResult::False;
1599           case ANK_TemplateName:
1600             // In C++17, this could be a type template for class template
1601             // argument deduction.
1602             if (getLangOpts().CPlusPlus17) {
1603               if (TryAnnotateTypeOrScopeToken())
1604                 return TPResult::Error;
1605               if (Tok.isNot(tok::identifier))
1606                 break;
1607             }
1608 
1609             // A bare type template-name which can't be a template template
1610             // argument is an error, and was probably intended to be a type.
1611             // In C++17, this could be class template argument deduction.
1612             return (getLangOpts().CPlusPlus17 || GreaterThanIsOperator)
1613                        ? TPResult::True
1614                        : TPResult::False;
1615           case ANK_Unresolved:
1616             return InvalidAsDeclSpec ? TPResult::Ambiguous : TPResult::False;
1617           case ANK_Success:
1618             break;
1619           }
1620 
1621           // Annotated it, check again.
1622           assert(Tok.isNot(tok::annot_cxxscope) ||
1623                  NextToken().isNot(tok::identifier));
1624           return isCXXDeclarationSpecifier(BracedCastResult, InvalidAsDeclSpec);
1625         }
1626       }
1627       return TPResult::False;
1628     }
1629     // If that succeeded, fallthrough into the generic simple-type-id case.
1630     LLVM_FALLTHROUGH;
1631 
1632     // The ambiguity resides in a simple-type-specifier/typename-specifier
1633     // followed by a '('. The '(' could either be the start of:
1634     //
1635     //   direct-declarator:
1636     //     '(' declarator ')'
1637     //
1638     //   direct-abstract-declarator:
1639     //     '(' parameter-declaration-clause ')' cv-qualifier-seq[opt]
1640     //              exception-specification[opt]
1641     //     '(' abstract-declarator ')'
1642     //
1643     // or part of a function-style cast expression:
1644     //
1645     //     simple-type-specifier '(' expression-list[opt] ')'
1646     //
1647 
1648     // simple-type-specifier:
1649 
1650   case tok::annot_typename:
1651   case_typename:
1652     // In Objective-C, we might have a protocol-qualified type.
1653     if (getLangOpts().ObjC && NextToken().is(tok::less)) {
1654       // Tentatively parse the protocol qualifiers.
1655       RevertingTentativeParsingAction PA(*this);
1656       ConsumeAnyToken(); // The type token
1657 
1658       TPResult TPR = TryParseProtocolQualifiers();
1659       bool isFollowedByParen = Tok.is(tok::l_paren);
1660       bool isFollowedByBrace = Tok.is(tok::l_brace);
1661 
1662       if (TPR == TPResult::Error)
1663         return TPResult::Error;
1664 
1665       if (isFollowedByParen)
1666         return TPResult::Ambiguous;
1667 
1668       if (getLangOpts().CPlusPlus11 && isFollowedByBrace)
1669         return BracedCastResult;
1670 
1671       return TPResult::True;
1672     }
1673     LLVM_FALLTHROUGH;
1674 
1675   case tok::kw_char:
1676   case tok::kw_wchar_t:
1677   case tok::kw_char8_t:
1678   case tok::kw_char16_t:
1679   case tok::kw_char32_t:
1680   case tok::kw_bool:
1681   case tok::kw_short:
1682   case tok::kw_int:
1683   case tok::kw_long:
1684   case tok::kw___int64:
1685   case tok::kw___int128:
1686   case tok::kw_signed:
1687   case tok::kw_unsigned:
1688   case tok::kw_half:
1689   case tok::kw_float:
1690   case tok::kw_double:
1691   case tok::kw__Float16:
1692   case tok::kw___float128:
1693   case tok::kw_void:
1694   case tok::annot_decltype:
1695 #define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t:
1696 #include "clang/Basic/OpenCLImageTypes.def"
1697     if (NextToken().is(tok::l_paren))
1698       return TPResult::Ambiguous;
1699 
1700     // This is a function-style cast in all cases we disambiguate other than
1701     // one:
1702     //   struct S {
1703     //     enum E : int { a = 4 }; // enum
1704     //     enum E : int { 4 };     // bit-field
1705     //   };
1706     if (getLangOpts().CPlusPlus11 && NextToken().is(tok::l_brace))
1707       return BracedCastResult;
1708 
1709     if (isStartOfObjCClassMessageMissingOpenBracket())
1710       return TPResult::False;
1711 
1712     return TPResult::True;
1713 
1714   // GNU typeof support.
1715   case tok::kw_typeof: {
1716     if (NextToken().isNot(tok::l_paren))
1717       return TPResult::True;
1718 
1719     RevertingTentativeParsingAction PA(*this);
1720 
1721     TPResult TPR = TryParseTypeofSpecifier();
1722     bool isFollowedByParen = Tok.is(tok::l_paren);
1723     bool isFollowedByBrace = Tok.is(tok::l_brace);
1724 
1725     if (TPR == TPResult::Error)
1726       return TPResult::Error;
1727 
1728     if (isFollowedByParen)
1729       return TPResult::Ambiguous;
1730 
1731     if (getLangOpts().CPlusPlus11 && isFollowedByBrace)
1732       return BracedCastResult;
1733 
1734     return TPResult::True;
1735   }
1736 
1737   // C++0x type traits support
1738   case tok::kw___underlying_type:
1739     return TPResult::True;
1740 
1741   // C11 _Atomic
1742   case tok::kw__Atomic:
1743     return TPResult::True;
1744 
1745   default:
1746     return TPResult::False;
1747   }
1748 }
1749 
1750 bool Parser::isCXXDeclarationSpecifierAType() {
1751   switch (Tok.getKind()) {
1752     // typename-specifier
1753   case tok::annot_decltype:
1754   case tok::annot_template_id:
1755   case tok::annot_typename:
1756   case tok::kw_typeof:
1757   case tok::kw___underlying_type:
1758     return true;
1759 
1760     // elaborated-type-specifier
1761   case tok::kw_class:
1762   case tok::kw_struct:
1763   case tok::kw_union:
1764   case tok::kw___interface:
1765   case tok::kw_enum:
1766     return true;
1767 
1768     // simple-type-specifier
1769   case tok::kw_char:
1770   case tok::kw_wchar_t:
1771   case tok::kw_char8_t:
1772   case tok::kw_char16_t:
1773   case tok::kw_char32_t:
1774   case tok::kw_bool:
1775   case tok::kw_short:
1776   case tok::kw_int:
1777   case tok::kw_long:
1778   case tok::kw___int64:
1779   case tok::kw___int128:
1780   case tok::kw_signed:
1781   case tok::kw_unsigned:
1782   case tok::kw_half:
1783   case tok::kw_float:
1784   case tok::kw_double:
1785   case tok::kw__Float16:
1786   case tok::kw___float128:
1787   case tok::kw_void:
1788   case tok::kw___unknown_anytype:
1789   case tok::kw___auto_type:
1790 #define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t:
1791 #include "clang/Basic/OpenCLImageTypes.def"
1792     return true;
1793 
1794   case tok::kw_auto:
1795     return getLangOpts().CPlusPlus11;
1796 
1797   case tok::kw__Atomic:
1798     // "_Atomic foo"
1799     return NextToken().is(tok::l_paren);
1800 
1801   default:
1802     return false;
1803   }
1804 }
1805 
1806 /// [GNU] typeof-specifier:
1807 ///         'typeof' '(' expressions ')'
1808 ///         'typeof' '(' type-name ')'
1809 ///
1810 Parser::TPResult Parser::TryParseTypeofSpecifier() {
1811   assert(Tok.is(tok::kw_typeof) && "Expected 'typeof'!");
1812   ConsumeToken();
1813 
1814   assert(Tok.is(tok::l_paren) && "Expected '('");
1815   // Parse through the parens after 'typeof'.
1816   ConsumeParen();
1817   if (!SkipUntil(tok::r_paren, StopAtSemi))
1818     return TPResult::Error;
1819 
1820   return TPResult::Ambiguous;
1821 }
1822 
1823 /// [ObjC] protocol-qualifiers:
1824 ////         '<' identifier-list '>'
1825 Parser::TPResult Parser::TryParseProtocolQualifiers() {
1826   assert(Tok.is(tok::less) && "Expected '<' for qualifier list");
1827   ConsumeToken();
1828   do {
1829     if (Tok.isNot(tok::identifier))
1830       return TPResult::Error;
1831     ConsumeToken();
1832 
1833     if (Tok.is(tok::comma)) {
1834       ConsumeToken();
1835       continue;
1836     }
1837 
1838     if (Tok.is(tok::greater)) {
1839       ConsumeToken();
1840       return TPResult::Ambiguous;
1841     }
1842   } while (false);
1843 
1844   return TPResult::Error;
1845 }
1846 
1847 /// isCXXFunctionDeclarator - Disambiguates between a function declarator or
1848 /// a constructor-style initializer, when parsing declaration statements.
1849 /// Returns true for function declarator and false for constructor-style
1850 /// initializer.
1851 /// If during the disambiguation process a parsing error is encountered,
1852 /// the function returns true to let the declaration parsing code handle it.
1853 ///
1854 /// '(' parameter-declaration-clause ')' cv-qualifier-seq[opt]
1855 ///         exception-specification[opt]
1856 ///
1857 bool Parser::isCXXFunctionDeclarator(bool *IsAmbiguous) {
1858 
1859   // C++ 8.2p1:
1860   // The ambiguity arising from the similarity between a function-style cast and
1861   // a declaration mentioned in 6.8 can also occur in the context of a
1862   // declaration. In that context, the choice is between a function declaration
1863   // with a redundant set of parentheses around a parameter name and an object
1864   // declaration with a function-style cast as the initializer. Just as for the
1865   // ambiguities mentioned in 6.8, the resolution is to consider any construct
1866   // that could possibly be a declaration a declaration.
1867 
1868   RevertingTentativeParsingAction PA(*this);
1869 
1870   ConsumeParen();
1871   bool InvalidAsDeclaration = false;
1872   TPResult TPR = TryParseParameterDeclarationClause(&InvalidAsDeclaration);
1873   if (TPR == TPResult::Ambiguous) {
1874     if (Tok.isNot(tok::r_paren))
1875       TPR = TPResult::False;
1876     else {
1877       const Token &Next = NextToken();
1878       if (Next.isOneOf(tok::amp, tok::ampamp, tok::kw_const, tok::kw_volatile,
1879                        tok::kw_throw, tok::kw_noexcept, tok::l_square,
1880                        tok::l_brace, tok::kw_try, tok::equal, tok::arrow) ||
1881           isCXX11VirtSpecifier(Next))
1882         // The next token cannot appear after a constructor-style initializer,
1883         // and can appear next in a function definition. This must be a function
1884         // declarator.
1885         TPR = TPResult::True;
1886       else if (InvalidAsDeclaration)
1887         // Use the absence of 'typename' as a tie-breaker.
1888         TPR = TPResult::False;
1889     }
1890   }
1891 
1892   if (IsAmbiguous && TPR == TPResult::Ambiguous)
1893     *IsAmbiguous = true;
1894 
1895   // In case of an error, let the declaration parsing code handle it.
1896   return TPR != TPResult::False;
1897 }
1898 
1899 /// parameter-declaration-clause:
1900 ///   parameter-declaration-list[opt] '...'[opt]
1901 ///   parameter-declaration-list ',' '...'
1902 ///
1903 /// parameter-declaration-list:
1904 ///   parameter-declaration
1905 ///   parameter-declaration-list ',' parameter-declaration
1906 ///
1907 /// parameter-declaration:
1908 ///   attribute-specifier-seq[opt] decl-specifier-seq declarator attributes[opt]
1909 ///   attribute-specifier-seq[opt] decl-specifier-seq declarator attributes[opt]
1910 ///     '=' assignment-expression
1911 ///   attribute-specifier-seq[opt] decl-specifier-seq abstract-declarator[opt]
1912 ///     attributes[opt]
1913 ///   attribute-specifier-seq[opt] decl-specifier-seq abstract-declarator[opt]
1914 ///     attributes[opt] '=' assignment-expression
1915 ///
1916 Parser::TPResult
1917 Parser::TryParseParameterDeclarationClause(bool *InvalidAsDeclaration,
1918                                            bool VersusTemplateArgument) {
1919 
1920   if (Tok.is(tok::r_paren))
1921     return TPResult::Ambiguous;
1922 
1923   //   parameter-declaration-list[opt] '...'[opt]
1924   //   parameter-declaration-list ',' '...'
1925   //
1926   // parameter-declaration-list:
1927   //   parameter-declaration
1928   //   parameter-declaration-list ',' parameter-declaration
1929   //
1930   while (1) {
1931     // '...'[opt]
1932     if (Tok.is(tok::ellipsis)) {
1933       ConsumeToken();
1934       if (Tok.is(tok::r_paren))
1935         return TPResult::True; // '...)' is a sign of a function declarator.
1936       else
1937         return TPResult::False;
1938     }
1939 
1940     // An attribute-specifier-seq here is a sign of a function declarator.
1941     if (isCXX11AttributeSpecifier(/*Disambiguate*/false,
1942                                   /*OuterMightBeMessageSend*/true))
1943       return TPResult::True;
1944 
1945     ParsedAttributes attrs(AttrFactory);
1946     MaybeParseMicrosoftAttributes(attrs);
1947 
1948     // decl-specifier-seq
1949     // A parameter-declaration's initializer must be preceded by an '=', so
1950     // decl-specifier-seq '{' is not a parameter in C++11.
1951     TPResult TPR = isCXXDeclarationSpecifier(TPResult::False,
1952                                              InvalidAsDeclaration);
1953     // A declaration-specifier (not followed by '(' or '{') means this can't be
1954     // an expression, but it could still be a template argument.
1955     if (TPR != TPResult::Ambiguous &&
1956         !(VersusTemplateArgument && TPR == TPResult::True))
1957       return TPR;
1958 
1959     bool SeenType = false;
1960     do {
1961       SeenType |= isCXXDeclarationSpecifierAType();
1962       if (TryConsumeDeclarationSpecifier() == TPResult::Error)
1963         return TPResult::Error;
1964 
1965       // If we see a parameter name, this can't be a template argument.
1966       if (SeenType && Tok.is(tok::identifier))
1967         return TPResult::True;
1968 
1969       TPR = isCXXDeclarationSpecifier(TPResult::False,
1970                                       InvalidAsDeclaration);
1971       if (TPR == TPResult::Error)
1972         return TPR;
1973 
1974       // Two declaration-specifiers means this can't be an expression.
1975       if (TPR == TPResult::True && !VersusTemplateArgument)
1976         return TPR;
1977     } while (TPR != TPResult::False);
1978 
1979     // declarator
1980     // abstract-declarator[opt]
1981     TPR = TryParseDeclarator(true/*mayBeAbstract*/);
1982     if (TPR != TPResult::Ambiguous)
1983       return TPR;
1984 
1985     // [GNU] attributes[opt]
1986     if (Tok.is(tok::kw___attribute))
1987       return TPResult::True;
1988 
1989     // If we're disambiguating a template argument in a default argument in
1990     // a class definition versus a parameter declaration, an '=' here
1991     // disambiguates the parse one way or the other.
1992     // If this is a parameter, it must have a default argument because
1993     //   (a) the previous parameter did, and
1994     //   (b) this must be the first declaration of the function, so we can't
1995     //       inherit any default arguments from elsewhere.
1996     // If we see an ')', then we've reached the end of a
1997     // parameter-declaration-clause, and the last param is missing its default
1998     // argument.
1999     if (VersusTemplateArgument)
2000       return Tok.isOneOf(tok::equal, tok::r_paren) ? TPResult::True
2001                                                    : TPResult::False;
2002 
2003     if (Tok.is(tok::equal)) {
2004       // '=' assignment-expression
2005       // Parse through assignment-expression.
2006       // FIXME: assignment-expression may contain an unparenthesized comma.
2007       if (!SkipUntil(tok::comma, tok::r_paren, StopAtSemi | StopBeforeMatch))
2008         return TPResult::Error;
2009     }
2010 
2011     if (Tok.is(tok::ellipsis)) {
2012       ConsumeToken();
2013       if (Tok.is(tok::r_paren))
2014         return TPResult::True; // '...)' is a sign of a function declarator.
2015       else
2016         return TPResult::False;
2017     }
2018 
2019     if (!TryConsumeToken(tok::comma))
2020       break;
2021   }
2022 
2023   return TPResult::Ambiguous;
2024 }
2025 
2026 /// TryParseFunctionDeclarator - We parsed a '(' and we want to try to continue
2027 /// parsing as a function declarator.
2028 /// If TryParseFunctionDeclarator fully parsed the function declarator, it will
2029 /// return TPResult::Ambiguous, otherwise it will return either False() or
2030 /// Error().
2031 ///
2032 /// '(' parameter-declaration-clause ')' cv-qualifier-seq[opt]
2033 ///         exception-specification[opt]
2034 ///
2035 /// exception-specification:
2036 ///   'throw' '(' type-id-list[opt] ')'
2037 ///
2038 Parser::TPResult Parser::TryParseFunctionDeclarator() {
2039   // The '(' is already parsed.
2040 
2041   TPResult TPR = TryParseParameterDeclarationClause();
2042   if (TPR == TPResult::Ambiguous && Tok.isNot(tok::r_paren))
2043     TPR = TPResult::False;
2044 
2045   if (TPR == TPResult::False || TPR == TPResult::Error)
2046     return TPR;
2047 
2048   // Parse through the parens.
2049   if (!SkipUntil(tok::r_paren, StopAtSemi))
2050     return TPResult::Error;
2051 
2052   // cv-qualifier-seq
2053   while (Tok.isOneOf(tok::kw_const, tok::kw_volatile, tok::kw___unaligned,
2054                      tok::kw_restrict))
2055     ConsumeToken();
2056 
2057   // ref-qualifier[opt]
2058   if (Tok.isOneOf(tok::amp, tok::ampamp))
2059     ConsumeToken();
2060 
2061   // exception-specification
2062   if (Tok.is(tok::kw_throw)) {
2063     ConsumeToken();
2064     if (Tok.isNot(tok::l_paren))
2065       return TPResult::Error;
2066 
2067     // Parse through the parens after 'throw'.
2068     ConsumeParen();
2069     if (!SkipUntil(tok::r_paren, StopAtSemi))
2070       return TPResult::Error;
2071   }
2072   if (Tok.is(tok::kw_noexcept)) {
2073     ConsumeToken();
2074     // Possibly an expression as well.
2075     if (Tok.is(tok::l_paren)) {
2076       // Find the matching rparen.
2077       ConsumeParen();
2078       if (!SkipUntil(tok::r_paren, StopAtSemi))
2079         return TPResult::Error;
2080     }
2081   }
2082 
2083   return TPResult::Ambiguous;
2084 }
2085 
2086 /// '[' constant-expression[opt] ']'
2087 ///
2088 Parser::TPResult Parser::TryParseBracketDeclarator() {
2089   ConsumeBracket();
2090 
2091   // A constant-expression cannot begin with a '{', but the
2092   // expr-or-braced-init-list of a postfix-expression can.
2093   if (Tok.is(tok::l_brace))
2094     return TPResult::False;
2095 
2096   if (!SkipUntil(tok::r_square, tok::comma, StopAtSemi | StopBeforeMatch))
2097     return TPResult::Error;
2098 
2099   // If we hit a comma before the ']', this is not a constant-expression,
2100   // but might still be the expr-or-braced-init-list of a postfix-expression.
2101   if (Tok.isNot(tok::r_square))
2102     return TPResult::False;
2103 
2104   ConsumeBracket();
2105   return TPResult::Ambiguous;
2106 }
2107 
2108 /// Determine whether we might be looking at the '<' template-argument-list '>'
2109 /// of a template-id or simple-template-id, rather than a less-than comparison.
2110 /// This will often fail and produce an ambiguity, but should never be wrong
2111 /// if it returns True or False.
2112 Parser::TPResult Parser::isTemplateArgumentList(unsigned TokensToSkip) {
2113   if (!TokensToSkip) {
2114     if (Tok.isNot(tok::less))
2115       return TPResult::False;
2116     if (NextToken().is(tok::greater))
2117       return TPResult::True;
2118   }
2119 
2120   RevertingTentativeParsingAction PA(*this);
2121 
2122   while (TokensToSkip) {
2123     ConsumeAnyToken();
2124     --TokensToSkip;
2125   }
2126 
2127   if (!TryConsumeToken(tok::less))
2128     return TPResult::False;
2129 
2130   // We can't do much to tell an expression apart from a template-argument,
2131   // but one good distinguishing factor is that a "decl-specifier" not
2132   // followed by '(' or '{' can't appear in an expression.
2133   bool InvalidAsTemplateArgumentList = false;
2134   if (isCXXDeclarationSpecifier(TPResult::False,
2135                                        &InvalidAsTemplateArgumentList) ==
2136              TPResult::True)
2137     return TPResult::True;
2138   if (InvalidAsTemplateArgumentList)
2139     return TPResult::False;
2140 
2141   // FIXME: In many contexts, X<thing1, Type> can only be a
2142   // template-argument-list. But that's not true in general:
2143   //
2144   // using b = int;
2145   // void f() {
2146   //   int a = A<B, b, c = C>D; // OK, declares b, not a template-id.
2147   //
2148   // X<Y<0, int> // ', int>' might be end of X's template argument list
2149   //
2150   // We might be able to disambiguate a few more cases if we're careful.
2151 
2152   // A template-argument-list must be terminated by a '>'.
2153   if (SkipUntil({tok::greater, tok::greatergreater, tok::greatergreatergreater},
2154                 StopAtSemi | StopBeforeMatch))
2155     return TPResult::Ambiguous;
2156   return TPResult::False;
2157 }
2158 
2159 /// Determine whether we might be looking at the '(' of a C++20 explicit(bool)
2160 /// in an earlier language mode.
2161 Parser::TPResult Parser::isExplicitBool() {
2162   assert(Tok.is(tok::l_paren) && "expected to be looking at a '(' token");
2163 
2164   RevertingTentativeParsingAction PA(*this);
2165   ConsumeParen();
2166 
2167   // We can only have 'explicit' on a constructor, conversion function, or
2168   // deduction guide. The declarator of a deduction guide cannot be
2169   // parenthesized, so we know this isn't a deduction guide. So the only
2170   // thing we need to check for is some number of parens followed by either
2171   // the current class name or 'operator'.
2172   while (Tok.is(tok::l_paren))
2173     ConsumeParen();
2174 
2175   if (TryAnnotateOptionalCXXScopeToken())
2176     return TPResult::Error;
2177 
2178   // Class-scope constructor and conversion function names can't really be
2179   // qualified, but we get better diagnostics if we assume they can be.
2180   CXXScopeSpec SS;
2181   if (Tok.is(tok::annot_cxxscope)) {
2182     Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(),
2183                                                  Tok.getAnnotationRange(),
2184                                                  SS);
2185     ConsumeAnnotationToken();
2186   }
2187 
2188   // 'explicit(operator' might be explicit(bool) or the declaration of a
2189   // conversion function, but it's probably a conversion function.
2190   if (Tok.is(tok::kw_operator))
2191     return TPResult::Ambiguous;
2192 
2193   // If this can't be a constructor name, it can only be explicit(bool).
2194   if (Tok.isNot(tok::identifier) && Tok.isNot(tok::annot_template_id))
2195     return TPResult::True;
2196   if (!Actions.isCurrentClassName(Tok.is(tok::identifier)
2197                                       ? *Tok.getIdentifierInfo()
2198                                       : *takeTemplateIdAnnotation(Tok)->Name,
2199                                   getCurScope(), &SS))
2200     return TPResult::True;
2201   // Formally, we must have a right-paren after the constructor name to match
2202   // the grammar for a constructor. But clang permits a parenthesized
2203   // constructor declarator, so also allow a constructor declarator to follow
2204   // with no ')' token after the constructor name.
2205   if (!NextToken().is(tok::r_paren) &&
2206       !isConstructorDeclarator(/*Unqualified=*/SS.isEmpty(),
2207                                /*DeductionGuide=*/false))
2208     return TPResult::True;
2209 
2210   // Might be explicit(bool) or a parenthesized constructor name.
2211   return TPResult::Ambiguous;
2212 }
2213