xref: /openbsd/gnu/llvm/clang/lib/Parse/ParseDecl.cpp (revision 12c85518)
1 //===--- ParseDecl.cpp - Declaration Parsing --------------------*- C++ -*-===//
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 Declaration portions of the Parser interfaces.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "clang/AST/ASTContext.h"
14 #include "clang/AST/DeclTemplate.h"
15 #include "clang/AST/PrettyDeclStackTrace.h"
16 #include "clang/Basic/AddressSpaces.h"
17 #include "clang/Basic/AttributeCommonInfo.h"
18 #include "clang/Basic/Attributes.h"
19 #include "clang/Basic/CharInfo.h"
20 #include "clang/Basic/TargetInfo.h"
21 #include "clang/Parse/ParseDiagnostic.h"
22 #include "clang/Parse/Parser.h"
23 #include "clang/Parse/RAIIObjectsForParser.h"
24 #include "clang/Sema/Lookup.h"
25 #include "clang/Sema/ParsedTemplate.h"
26 #include "clang/Sema/Scope.h"
27 #include "clang/Sema/SemaDiagnostic.h"
28 #include "llvm/ADT/SmallSet.h"
29 #include "llvm/ADT/SmallString.h"
30 #include "llvm/ADT/StringSwitch.h"
31 #include <optional>
32 
33 using namespace clang;
34 
35 //===----------------------------------------------------------------------===//
36 // C99 6.7: Declarations.
37 //===----------------------------------------------------------------------===//
38 
39 /// ParseTypeName
40 ///       type-name: [C99 6.7.6]
41 ///         specifier-qualifier-list abstract-declarator[opt]
42 ///
43 /// Called type-id in C++.
ParseTypeName(SourceRange * Range,DeclaratorContext Context,AccessSpecifier AS,Decl ** OwnedType,ParsedAttributes * Attrs)44 TypeResult Parser::ParseTypeName(SourceRange *Range, DeclaratorContext Context,
45                                  AccessSpecifier AS, Decl **OwnedType,
46                                  ParsedAttributes *Attrs) {
47   DeclSpecContext DSC = getDeclSpecContextFromDeclaratorContext(Context);
48   if (DSC == DeclSpecContext::DSC_normal)
49     DSC = DeclSpecContext::DSC_type_specifier;
50 
51   // Parse the common declaration-specifiers piece.
52   DeclSpec DS(AttrFactory);
53   if (Attrs)
54     DS.addAttributes(*Attrs);
55   ParseSpecifierQualifierList(DS, AS, DSC);
56   if (OwnedType)
57     *OwnedType = DS.isTypeSpecOwned() ? DS.getRepAsDecl() : nullptr;
58 
59   // Parse the abstract-declarator, if present.
60   Declarator DeclaratorInfo(DS, ParsedAttributesView::none(), Context);
61   ParseDeclarator(DeclaratorInfo);
62   if (Range)
63     *Range = DeclaratorInfo.getSourceRange();
64 
65   if (DeclaratorInfo.isInvalidType())
66     return true;
67 
68   return Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
69 }
70 
71 /// Normalizes an attribute name by dropping prefixed and suffixed __.
normalizeAttrName(StringRef Name)72 static StringRef normalizeAttrName(StringRef Name) {
73   if (Name.size() >= 4 && Name.startswith("__") && Name.endswith("__"))
74     return Name.drop_front(2).drop_back(2);
75   return Name;
76 }
77 
78 /// isAttributeLateParsed - Return true if the attribute has arguments that
79 /// require late parsing.
isAttributeLateParsed(const IdentifierInfo & II)80 static bool isAttributeLateParsed(const IdentifierInfo &II) {
81 #define CLANG_ATTR_LATE_PARSED_LIST
82     return llvm::StringSwitch<bool>(normalizeAttrName(II.getName()))
83 #include "clang/Parse/AttrParserStringSwitches.inc"
84         .Default(false);
85 #undef CLANG_ATTR_LATE_PARSED_LIST
86 }
87 
88 /// Check if the a start and end source location expand to the same macro.
FindLocsWithCommonFileID(Preprocessor & PP,SourceLocation StartLoc,SourceLocation EndLoc)89 static bool FindLocsWithCommonFileID(Preprocessor &PP, SourceLocation StartLoc,
90                                      SourceLocation EndLoc) {
91   if (!StartLoc.isMacroID() || !EndLoc.isMacroID())
92     return false;
93 
94   SourceManager &SM = PP.getSourceManager();
95   if (SM.getFileID(StartLoc) != SM.getFileID(EndLoc))
96     return false;
97 
98   bool AttrStartIsInMacro =
99       Lexer::isAtStartOfMacroExpansion(StartLoc, SM, PP.getLangOpts());
100   bool AttrEndIsInMacro =
101       Lexer::isAtEndOfMacroExpansion(EndLoc, SM, PP.getLangOpts());
102   return AttrStartIsInMacro && AttrEndIsInMacro;
103 }
104 
ParseAttributes(unsigned WhichAttrKinds,ParsedAttributes & Attrs,LateParsedAttrList * LateAttrs)105 void Parser::ParseAttributes(unsigned WhichAttrKinds, ParsedAttributes &Attrs,
106                              LateParsedAttrList *LateAttrs) {
107   bool MoreToParse;
108   do {
109     // Assume there's nothing left to parse, but if any attributes are in fact
110     // parsed, loop to ensure all specified attribute combinations are parsed.
111     MoreToParse = false;
112     if (WhichAttrKinds & PAKM_CXX11)
113       MoreToParse |= MaybeParseCXX11Attributes(Attrs);
114     if (WhichAttrKinds & PAKM_GNU)
115       MoreToParse |= MaybeParseGNUAttributes(Attrs, LateAttrs);
116     if (WhichAttrKinds & PAKM_Declspec)
117       MoreToParse |= MaybeParseMicrosoftDeclSpecs(Attrs);
118   } while (MoreToParse);
119 }
120 
121 /// ParseGNUAttributes - Parse a non-empty attributes list.
122 ///
123 /// [GNU] attributes:
124 ///         attribute
125 ///         attributes attribute
126 ///
127 /// [GNU]  attribute:
128 ///          '__attribute__' '(' '(' attribute-list ')' ')'
129 ///
130 /// [GNU]  attribute-list:
131 ///          attrib
132 ///          attribute_list ',' attrib
133 ///
134 /// [GNU]  attrib:
135 ///          empty
136 ///          attrib-name
137 ///          attrib-name '(' identifier ')'
138 ///          attrib-name '(' identifier ',' nonempty-expr-list ')'
139 ///          attrib-name '(' argument-expression-list [C99 6.5.2] ')'
140 ///
141 /// [GNU]  attrib-name:
142 ///          identifier
143 ///          typespec
144 ///          typequal
145 ///          storageclass
146 ///
147 /// Whether an attribute takes an 'identifier' is determined by the
148 /// attrib-name. GCC's behavior here is not worth imitating:
149 ///
150 ///  * In C mode, if the attribute argument list starts with an identifier
151 ///    followed by a ',' or an ')', and the identifier doesn't resolve to
152 ///    a type, it is parsed as an identifier. If the attribute actually
153 ///    wanted an expression, it's out of luck (but it turns out that no
154 ///    attributes work that way, because C constant expressions are very
155 ///    limited).
156 ///  * In C++ mode, if the attribute argument list starts with an identifier,
157 ///    and the attribute *wants* an identifier, it is parsed as an identifier.
158 ///    At block scope, any additional tokens between the identifier and the
159 ///    ',' or ')' are ignored, otherwise they produce a parse error.
160 ///
161 /// We follow the C++ model, but don't allow junk after the identifier.
ParseGNUAttributes(ParsedAttributes & Attrs,LateParsedAttrList * LateAttrs,Declarator * D)162 void Parser::ParseGNUAttributes(ParsedAttributes &Attrs,
163                                 LateParsedAttrList *LateAttrs, Declarator *D) {
164   assert(Tok.is(tok::kw___attribute) && "Not a GNU attribute list!");
165 
166   SourceLocation StartLoc = Tok.getLocation();
167   SourceLocation EndLoc = StartLoc;
168 
169   while (Tok.is(tok::kw___attribute)) {
170     SourceLocation AttrTokLoc = ConsumeToken();
171     unsigned OldNumAttrs = Attrs.size();
172     unsigned OldNumLateAttrs = LateAttrs ? LateAttrs->size() : 0;
173 
174     if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after,
175                          "attribute")) {
176       SkipUntil(tok::r_paren, StopAtSemi); // skip until ) or ;
177       return;
178     }
179     if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after, "(")) {
180       SkipUntil(tok::r_paren, StopAtSemi); // skip until ) or ;
181       return;
182     }
183     // Parse the attribute-list. e.g. __attribute__(( weak, alias("__f") ))
184     do {
185       // Eat preceeding commas to allow __attribute__((,,,foo))
186       while (TryConsumeToken(tok::comma))
187         ;
188 
189       // Expect an identifier or declaration specifier (const, int, etc.)
190       if (Tok.isAnnotation())
191         break;
192       if (Tok.is(tok::code_completion)) {
193         cutOffParsing();
194         Actions.CodeCompleteAttribute(AttributeCommonInfo::Syntax::AS_GNU);
195         break;
196       }
197       IdentifierInfo *AttrName = Tok.getIdentifierInfo();
198       if (!AttrName)
199         break;
200 
201       SourceLocation AttrNameLoc = ConsumeToken();
202 
203       if (Tok.isNot(tok::l_paren)) {
204         Attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0,
205                      ParsedAttr::AS_GNU);
206         continue;
207       }
208 
209       // Handle "parameterized" attributes
210       if (!LateAttrs || !isAttributeLateParsed(*AttrName)) {
211         ParseGNUAttributeArgs(AttrName, AttrNameLoc, Attrs, &EndLoc, nullptr,
212                               SourceLocation(), ParsedAttr::AS_GNU, D);
213         continue;
214       }
215 
216       // Handle attributes with arguments that require late parsing.
217       LateParsedAttribute *LA =
218           new LateParsedAttribute(this, *AttrName, AttrNameLoc);
219       LateAttrs->push_back(LA);
220 
221       // Attributes in a class are parsed at the end of the class, along
222       // with other late-parsed declarations.
223       if (!ClassStack.empty() && !LateAttrs->parseSoon())
224         getCurrentClass().LateParsedDeclarations.push_back(LA);
225 
226       // Be sure ConsumeAndStoreUntil doesn't see the start l_paren, since it
227       // recursively consumes balanced parens.
228       LA->Toks.push_back(Tok);
229       ConsumeParen();
230       // Consume everything up to and including the matching right parens.
231       ConsumeAndStoreUntil(tok::r_paren, LA->Toks, /*StopAtSemi=*/true);
232 
233       Token Eof;
234       Eof.startToken();
235       Eof.setLocation(Tok.getLocation());
236       LA->Toks.push_back(Eof);
237     } while (Tok.is(tok::comma));
238 
239     if (ExpectAndConsume(tok::r_paren))
240       SkipUntil(tok::r_paren, StopAtSemi);
241     SourceLocation Loc = Tok.getLocation();
242     if (ExpectAndConsume(tok::r_paren))
243       SkipUntil(tok::r_paren, StopAtSemi);
244     EndLoc = Loc;
245 
246     // If this was declared in a macro, attach the macro IdentifierInfo to the
247     // parsed attribute.
248     auto &SM = PP.getSourceManager();
249     if (!SM.isWrittenInBuiltinFile(SM.getSpellingLoc(AttrTokLoc)) &&
250         FindLocsWithCommonFileID(PP, AttrTokLoc, Loc)) {
251       CharSourceRange ExpansionRange = SM.getExpansionRange(AttrTokLoc);
252       StringRef FoundName =
253           Lexer::getSourceText(ExpansionRange, SM, PP.getLangOpts());
254       IdentifierInfo *MacroII = PP.getIdentifierInfo(FoundName);
255 
256       for (unsigned i = OldNumAttrs; i < Attrs.size(); ++i)
257         Attrs[i].setMacroIdentifier(MacroII, ExpansionRange.getBegin());
258 
259       if (LateAttrs) {
260         for (unsigned i = OldNumLateAttrs; i < LateAttrs->size(); ++i)
261           (*LateAttrs)[i]->MacroII = MacroII;
262       }
263     }
264   }
265 
266   Attrs.Range = SourceRange(StartLoc, EndLoc);
267 }
268 
269 /// Determine whether the given attribute has an identifier argument.
attributeHasIdentifierArg(const IdentifierInfo & II)270 static bool attributeHasIdentifierArg(const IdentifierInfo &II) {
271 #define CLANG_ATTR_IDENTIFIER_ARG_LIST
272   return llvm::StringSwitch<bool>(normalizeAttrName(II.getName()))
273 #include "clang/Parse/AttrParserStringSwitches.inc"
274            .Default(false);
275 #undef CLANG_ATTR_IDENTIFIER_ARG_LIST
276 }
277 
278 /// Determine whether the given attribute has a variadic identifier argument.
attributeHasVariadicIdentifierArg(const IdentifierInfo & II)279 static bool attributeHasVariadicIdentifierArg(const IdentifierInfo &II) {
280 #define CLANG_ATTR_VARIADIC_IDENTIFIER_ARG_LIST
281   return llvm::StringSwitch<bool>(normalizeAttrName(II.getName()))
282 #include "clang/Parse/AttrParserStringSwitches.inc"
283            .Default(false);
284 #undef CLANG_ATTR_VARIADIC_IDENTIFIER_ARG_LIST
285 }
286 
287 /// Determine whether the given attribute treats kw_this as an identifier.
attributeTreatsKeywordThisAsIdentifier(const IdentifierInfo & II)288 static bool attributeTreatsKeywordThisAsIdentifier(const IdentifierInfo &II) {
289 #define CLANG_ATTR_THIS_ISA_IDENTIFIER_ARG_LIST
290   return llvm::StringSwitch<bool>(normalizeAttrName(II.getName()))
291 #include "clang/Parse/AttrParserStringSwitches.inc"
292            .Default(false);
293 #undef CLANG_ATTR_THIS_ISA_IDENTIFIER_ARG_LIST
294 }
295 
296 /// Determine if an attribute accepts parameter packs.
attributeAcceptsExprPack(const IdentifierInfo & II)297 static bool attributeAcceptsExprPack(const IdentifierInfo &II) {
298 #define CLANG_ATTR_ACCEPTS_EXPR_PACK
299   return llvm::StringSwitch<bool>(normalizeAttrName(II.getName()))
300 #include "clang/Parse/AttrParserStringSwitches.inc"
301       .Default(false);
302 #undef CLANG_ATTR_ACCEPTS_EXPR_PACK
303 }
304 
305 /// Determine whether the given attribute parses a type argument.
attributeIsTypeArgAttr(const IdentifierInfo & II)306 static bool attributeIsTypeArgAttr(const IdentifierInfo &II) {
307 #define CLANG_ATTR_TYPE_ARG_LIST
308   return llvm::StringSwitch<bool>(normalizeAttrName(II.getName()))
309 #include "clang/Parse/AttrParserStringSwitches.inc"
310            .Default(false);
311 #undef CLANG_ATTR_TYPE_ARG_LIST
312 }
313 
314 /// Determine whether the given attribute requires parsing its arguments
315 /// in an unevaluated context or not.
attributeParsedArgsUnevaluated(const IdentifierInfo & II)316 static bool attributeParsedArgsUnevaluated(const IdentifierInfo &II) {
317 #define CLANG_ATTR_ARG_CONTEXT_LIST
318   return llvm::StringSwitch<bool>(normalizeAttrName(II.getName()))
319 #include "clang/Parse/AttrParserStringSwitches.inc"
320            .Default(false);
321 #undef CLANG_ATTR_ARG_CONTEXT_LIST
322 }
323 
ParseIdentifierLoc()324 IdentifierLoc *Parser::ParseIdentifierLoc() {
325   assert(Tok.is(tok::identifier) && "expected an identifier");
326   IdentifierLoc *IL = IdentifierLoc::create(Actions.Context,
327                                             Tok.getLocation(),
328                                             Tok.getIdentifierInfo());
329   ConsumeToken();
330   return IL;
331 }
332 
ParseAttributeWithTypeArg(IdentifierInfo & AttrName,SourceLocation AttrNameLoc,ParsedAttributes & Attrs,IdentifierInfo * ScopeName,SourceLocation ScopeLoc,ParsedAttr::Syntax Syntax)333 void Parser::ParseAttributeWithTypeArg(IdentifierInfo &AttrName,
334                                        SourceLocation AttrNameLoc,
335                                        ParsedAttributes &Attrs,
336                                        IdentifierInfo *ScopeName,
337                                        SourceLocation ScopeLoc,
338                                        ParsedAttr::Syntax Syntax) {
339   BalancedDelimiterTracker Parens(*this, tok::l_paren);
340   Parens.consumeOpen();
341 
342   TypeResult T;
343   if (Tok.isNot(tok::r_paren))
344     T = ParseTypeName();
345 
346   if (Parens.consumeClose())
347     return;
348 
349   if (T.isInvalid())
350     return;
351 
352   if (T.isUsable())
353     Attrs.addNewTypeAttr(&AttrName,
354                          SourceRange(AttrNameLoc, Parens.getCloseLocation()),
355                          ScopeName, ScopeLoc, T.get(), Syntax);
356   else
357     Attrs.addNew(&AttrName, SourceRange(AttrNameLoc, Parens.getCloseLocation()),
358                  ScopeName, ScopeLoc, nullptr, 0, Syntax);
359 }
360 
ParseAttributeArgsCommon(IdentifierInfo * AttrName,SourceLocation AttrNameLoc,ParsedAttributes & Attrs,SourceLocation * EndLoc,IdentifierInfo * ScopeName,SourceLocation ScopeLoc,ParsedAttr::Syntax Syntax)361 unsigned Parser::ParseAttributeArgsCommon(
362     IdentifierInfo *AttrName, SourceLocation AttrNameLoc,
363     ParsedAttributes &Attrs, SourceLocation *EndLoc, IdentifierInfo *ScopeName,
364     SourceLocation ScopeLoc, ParsedAttr::Syntax Syntax) {
365   // Ignore the left paren location for now.
366   ConsumeParen();
367 
368   bool ChangeKWThisToIdent = attributeTreatsKeywordThisAsIdentifier(*AttrName);
369   bool AttributeIsTypeArgAttr = attributeIsTypeArgAttr(*AttrName);
370   bool AttributeHasVariadicIdentifierArg =
371       attributeHasVariadicIdentifierArg(*AttrName);
372 
373   // Interpret "kw_this" as an identifier if the attributed requests it.
374   if (ChangeKWThisToIdent && Tok.is(tok::kw_this))
375     Tok.setKind(tok::identifier);
376 
377   ArgsVector ArgExprs;
378   if (Tok.is(tok::identifier)) {
379     // If this attribute wants an 'identifier' argument, make it so.
380     bool IsIdentifierArg = AttributeHasVariadicIdentifierArg ||
381                            attributeHasIdentifierArg(*AttrName);
382     ParsedAttr::Kind AttrKind =
383         ParsedAttr::getParsedKind(AttrName, ScopeName, Syntax);
384 
385     // If we don't know how to parse this attribute, but this is the only
386     // token in this argument, assume it's meant to be an identifier.
387     if (AttrKind == ParsedAttr::UnknownAttribute ||
388         AttrKind == ParsedAttr::IgnoredAttribute) {
389       const Token &Next = NextToken();
390       IsIdentifierArg = Next.isOneOf(tok::r_paren, tok::comma);
391     }
392 
393     if (IsIdentifierArg)
394       ArgExprs.push_back(ParseIdentifierLoc());
395   }
396 
397   ParsedType TheParsedType;
398   if (!ArgExprs.empty() ? Tok.is(tok::comma) : Tok.isNot(tok::r_paren)) {
399     // Eat the comma.
400     if (!ArgExprs.empty())
401       ConsumeToken();
402 
403     if (AttributeIsTypeArgAttr) {
404       // FIXME: Multiple type arguments are not implemented.
405       TypeResult T = ParseTypeName();
406       if (T.isInvalid()) {
407         SkipUntil(tok::r_paren, StopAtSemi);
408         return 0;
409       }
410       if (T.isUsable())
411         TheParsedType = T.get();
412     } else if (AttributeHasVariadicIdentifierArg) {
413       // Parse variadic identifier arg. This can either consume identifiers or
414       // expressions. Variadic identifier args do not support parameter packs
415       // because those are typically used for attributes with enumeration
416       // arguments, and those enumerations are not something the user could
417       // express via a pack.
418       do {
419         // Interpret "kw_this" as an identifier if the attributed requests it.
420         if (ChangeKWThisToIdent && Tok.is(tok::kw_this))
421           Tok.setKind(tok::identifier);
422 
423         ExprResult ArgExpr;
424         if (Tok.is(tok::identifier)) {
425           ArgExprs.push_back(ParseIdentifierLoc());
426         } else {
427           bool Uneval = attributeParsedArgsUnevaluated(*AttrName);
428           EnterExpressionEvaluationContext Unevaluated(
429               Actions,
430               Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
431                      : Sema::ExpressionEvaluationContext::ConstantEvaluated);
432 
433           ExprResult ArgExpr(
434               Actions.CorrectDelayedTyposInExpr(ParseAssignmentExpression()));
435 
436           if (ArgExpr.isInvalid()) {
437             SkipUntil(tok::r_paren, StopAtSemi);
438             return 0;
439           }
440           ArgExprs.push_back(ArgExpr.get());
441         }
442         // Eat the comma, move to the next argument
443       } while (TryConsumeToken(tok::comma));
444     } else {
445       // General case. Parse all available expressions.
446       bool Uneval = attributeParsedArgsUnevaluated(*AttrName);
447       EnterExpressionEvaluationContext Unevaluated(
448           Actions, Uneval
449                        ? Sema::ExpressionEvaluationContext::Unevaluated
450                        : Sema::ExpressionEvaluationContext::ConstantEvaluated);
451 
452       ExprVector ParsedExprs;
453       if (ParseExpressionList(ParsedExprs, llvm::function_ref<void()>(),
454                               /*FailImmediatelyOnInvalidExpr=*/true,
455                               /*EarlyTypoCorrection=*/true)) {
456         SkipUntil(tok::r_paren, StopAtSemi);
457         return 0;
458       }
459 
460       // Pack expansion must currently be explicitly supported by an attribute.
461       for (size_t I = 0; I < ParsedExprs.size(); ++I) {
462         if (!isa<PackExpansionExpr>(ParsedExprs[I]))
463           continue;
464 
465         if (!attributeAcceptsExprPack(*AttrName)) {
466           Diag(Tok.getLocation(),
467                diag::err_attribute_argument_parm_pack_not_supported)
468               << AttrName;
469           SkipUntil(tok::r_paren, StopAtSemi);
470           return 0;
471         }
472       }
473 
474       ArgExprs.insert(ArgExprs.end(), ParsedExprs.begin(), ParsedExprs.end());
475     }
476   }
477 
478   SourceLocation RParen = Tok.getLocation();
479   if (!ExpectAndConsume(tok::r_paren)) {
480     SourceLocation AttrLoc = ScopeLoc.isValid() ? ScopeLoc : AttrNameLoc;
481 
482     if (AttributeIsTypeArgAttr && !TheParsedType.get().isNull()) {
483       Attrs.addNewTypeAttr(AttrName, SourceRange(AttrNameLoc, RParen),
484                            ScopeName, ScopeLoc, TheParsedType, Syntax);
485     } else {
486       Attrs.addNew(AttrName, SourceRange(AttrLoc, RParen), ScopeName, ScopeLoc,
487                    ArgExprs.data(), ArgExprs.size(), Syntax);
488     }
489   }
490 
491   if (EndLoc)
492     *EndLoc = RParen;
493 
494   return static_cast<unsigned>(ArgExprs.size() + !TheParsedType.get().isNull());
495 }
496 
497 /// Parse the arguments to a parameterized GNU attribute or
498 /// a C++11 attribute in "gnu" namespace.
ParseGNUAttributeArgs(IdentifierInfo * AttrName,SourceLocation AttrNameLoc,ParsedAttributes & Attrs,SourceLocation * EndLoc,IdentifierInfo * ScopeName,SourceLocation ScopeLoc,ParsedAttr::Syntax Syntax,Declarator * D)499 void Parser::ParseGNUAttributeArgs(
500     IdentifierInfo *AttrName, SourceLocation AttrNameLoc,
501     ParsedAttributes &Attrs, SourceLocation *EndLoc, IdentifierInfo *ScopeName,
502     SourceLocation ScopeLoc, ParsedAttr::Syntax Syntax, Declarator *D) {
503 
504   assert(Tok.is(tok::l_paren) && "Attribute arg list not starting with '('");
505 
506   ParsedAttr::Kind AttrKind =
507       ParsedAttr::getParsedKind(AttrName, ScopeName, Syntax);
508 
509   if (AttrKind == ParsedAttr::AT_Availability) {
510     ParseAvailabilityAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc, ScopeName,
511                                ScopeLoc, Syntax);
512     return;
513   } else if (AttrKind == ParsedAttr::AT_ExternalSourceSymbol) {
514     ParseExternalSourceSymbolAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc,
515                                        ScopeName, ScopeLoc, Syntax);
516     return;
517   } else if (AttrKind == ParsedAttr::AT_ObjCBridgeRelated) {
518     ParseObjCBridgeRelatedAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc,
519                                     ScopeName, ScopeLoc, Syntax);
520     return;
521   } else if (AttrKind == ParsedAttr::AT_SwiftNewType) {
522     ParseSwiftNewTypeAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc, ScopeName,
523                                ScopeLoc, Syntax);
524     return;
525   } else if (AttrKind == ParsedAttr::AT_TypeTagForDatatype) {
526     ParseTypeTagForDatatypeAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc,
527                                      ScopeName, ScopeLoc, Syntax);
528     return;
529   } else if (attributeIsTypeArgAttr(*AttrName)) {
530     ParseAttributeWithTypeArg(*AttrName, AttrNameLoc, Attrs, ScopeName,
531                               ScopeLoc, Syntax);
532     return;
533   }
534 
535   // These may refer to the function arguments, but need to be parsed early to
536   // participate in determining whether it's a redeclaration.
537   std::optional<ParseScope> PrototypeScope;
538   if (normalizeAttrName(AttrName->getName()) == "enable_if" &&
539       D && D->isFunctionDeclarator()) {
540     DeclaratorChunk::FunctionTypeInfo FTI = D->getFunctionTypeInfo();
541     PrototypeScope.emplace(this, Scope::FunctionPrototypeScope |
542                                      Scope::FunctionDeclarationScope |
543                                      Scope::DeclScope);
544     for (unsigned i = 0; i != FTI.NumParams; ++i) {
545       ParmVarDecl *Param = cast<ParmVarDecl>(FTI.Params[i].Param);
546       Actions.ActOnReenterCXXMethodParameter(getCurScope(), Param);
547     }
548   }
549 
550   ParseAttributeArgsCommon(AttrName, AttrNameLoc, Attrs, EndLoc, ScopeName,
551                            ScopeLoc, Syntax);
552 }
553 
ParseClangAttributeArgs(IdentifierInfo * AttrName,SourceLocation AttrNameLoc,ParsedAttributes & Attrs,SourceLocation * EndLoc,IdentifierInfo * ScopeName,SourceLocation ScopeLoc,ParsedAttr::Syntax Syntax)554 unsigned Parser::ParseClangAttributeArgs(
555     IdentifierInfo *AttrName, SourceLocation AttrNameLoc,
556     ParsedAttributes &Attrs, SourceLocation *EndLoc, IdentifierInfo *ScopeName,
557     SourceLocation ScopeLoc, ParsedAttr::Syntax Syntax) {
558   assert(Tok.is(tok::l_paren) && "Attribute arg list not starting with '('");
559 
560   ParsedAttr::Kind AttrKind =
561       ParsedAttr::getParsedKind(AttrName, ScopeName, Syntax);
562 
563   switch (AttrKind) {
564   default:
565     return ParseAttributeArgsCommon(AttrName, AttrNameLoc, Attrs, EndLoc,
566                                     ScopeName, ScopeLoc, Syntax);
567   case ParsedAttr::AT_ExternalSourceSymbol:
568     ParseExternalSourceSymbolAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc,
569                                        ScopeName, ScopeLoc, Syntax);
570     break;
571   case ParsedAttr::AT_Availability:
572     ParseAvailabilityAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc, ScopeName,
573                                ScopeLoc, Syntax);
574     break;
575   case ParsedAttr::AT_ObjCBridgeRelated:
576     ParseObjCBridgeRelatedAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc,
577                                     ScopeName, ScopeLoc, Syntax);
578     break;
579   case ParsedAttr::AT_SwiftNewType:
580     ParseSwiftNewTypeAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc, ScopeName,
581                                ScopeLoc, Syntax);
582     break;
583   case ParsedAttr::AT_TypeTagForDatatype:
584     ParseTypeTagForDatatypeAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc,
585                                      ScopeName, ScopeLoc, Syntax);
586     break;
587   }
588   return !Attrs.empty() ? Attrs.begin()->getNumArgs() : 0;
589 }
590 
ParseMicrosoftDeclSpecArgs(IdentifierInfo * AttrName,SourceLocation AttrNameLoc,ParsedAttributes & Attrs)591 bool Parser::ParseMicrosoftDeclSpecArgs(IdentifierInfo *AttrName,
592                                         SourceLocation AttrNameLoc,
593                                         ParsedAttributes &Attrs) {
594   unsigned ExistingAttrs = Attrs.size();
595 
596   // If the attribute isn't known, we will not attempt to parse any
597   // arguments.
598   if (!hasAttribute(AttributeCommonInfo::Syntax::AS_Declspec, nullptr, AttrName,
599                     getTargetInfo(), getLangOpts())) {
600     // Eat the left paren, then skip to the ending right paren.
601     ConsumeParen();
602     SkipUntil(tok::r_paren);
603     return false;
604   }
605 
606   SourceLocation OpenParenLoc = Tok.getLocation();
607 
608   if (AttrName->getName() == "property") {
609     // The property declspec is more complex in that it can take one or two
610     // assignment expressions as a parameter, but the lhs of the assignment
611     // must be named get or put.
612 
613     BalancedDelimiterTracker T(*this, tok::l_paren);
614     T.expectAndConsume(diag::err_expected_lparen_after,
615                        AttrName->getNameStart(), tok::r_paren);
616 
617     enum AccessorKind {
618       AK_Invalid = -1,
619       AK_Put = 0,
620       AK_Get = 1 // indices into AccessorNames
621     };
622     IdentifierInfo *AccessorNames[] = {nullptr, nullptr};
623     bool HasInvalidAccessor = false;
624 
625     // Parse the accessor specifications.
626     while (true) {
627       // Stop if this doesn't look like an accessor spec.
628       if (!Tok.is(tok::identifier)) {
629         // If the user wrote a completely empty list, use a special diagnostic.
630         if (Tok.is(tok::r_paren) && !HasInvalidAccessor &&
631             AccessorNames[AK_Put] == nullptr &&
632             AccessorNames[AK_Get] == nullptr) {
633           Diag(AttrNameLoc, diag::err_ms_property_no_getter_or_putter);
634           break;
635         }
636 
637         Diag(Tok.getLocation(), diag::err_ms_property_unknown_accessor);
638         break;
639       }
640 
641       AccessorKind Kind;
642       SourceLocation KindLoc = Tok.getLocation();
643       StringRef KindStr = Tok.getIdentifierInfo()->getName();
644       if (KindStr == "get") {
645         Kind = AK_Get;
646       } else if (KindStr == "put") {
647         Kind = AK_Put;
648 
649         // Recover from the common mistake of using 'set' instead of 'put'.
650       } else if (KindStr == "set") {
651         Diag(KindLoc, diag::err_ms_property_has_set_accessor)
652             << FixItHint::CreateReplacement(KindLoc, "put");
653         Kind = AK_Put;
654 
655         // Handle the mistake of forgetting the accessor kind by skipping
656         // this accessor.
657       } else if (NextToken().is(tok::comma) || NextToken().is(tok::r_paren)) {
658         Diag(KindLoc, diag::err_ms_property_missing_accessor_kind);
659         ConsumeToken();
660         HasInvalidAccessor = true;
661         goto next_property_accessor;
662 
663         // Otherwise, complain about the unknown accessor kind.
664       } else {
665         Diag(KindLoc, diag::err_ms_property_unknown_accessor);
666         HasInvalidAccessor = true;
667         Kind = AK_Invalid;
668 
669         // Try to keep parsing unless it doesn't look like an accessor spec.
670         if (!NextToken().is(tok::equal))
671           break;
672       }
673 
674       // Consume the identifier.
675       ConsumeToken();
676 
677       // Consume the '='.
678       if (!TryConsumeToken(tok::equal)) {
679         Diag(Tok.getLocation(), diag::err_ms_property_expected_equal)
680             << KindStr;
681         break;
682       }
683 
684       // Expect the method name.
685       if (!Tok.is(tok::identifier)) {
686         Diag(Tok.getLocation(), diag::err_ms_property_expected_accessor_name);
687         break;
688       }
689 
690       if (Kind == AK_Invalid) {
691         // Just drop invalid accessors.
692       } else if (AccessorNames[Kind] != nullptr) {
693         // Complain about the repeated accessor, ignore it, and keep parsing.
694         Diag(KindLoc, diag::err_ms_property_duplicate_accessor) << KindStr;
695       } else {
696         AccessorNames[Kind] = Tok.getIdentifierInfo();
697       }
698       ConsumeToken();
699 
700     next_property_accessor:
701       // Keep processing accessors until we run out.
702       if (TryConsumeToken(tok::comma))
703         continue;
704 
705       // If we run into the ')', stop without consuming it.
706       if (Tok.is(tok::r_paren))
707         break;
708 
709       Diag(Tok.getLocation(), diag::err_ms_property_expected_comma_or_rparen);
710       break;
711     }
712 
713     // Only add the property attribute if it was well-formed.
714     if (!HasInvalidAccessor)
715       Attrs.addNewPropertyAttr(AttrName, AttrNameLoc, nullptr, SourceLocation(),
716                                AccessorNames[AK_Get], AccessorNames[AK_Put],
717                                ParsedAttr::AS_Declspec);
718     T.skipToEnd();
719     return !HasInvalidAccessor;
720   }
721 
722   unsigned NumArgs =
723       ParseAttributeArgsCommon(AttrName, AttrNameLoc, Attrs, nullptr, nullptr,
724                                SourceLocation(), ParsedAttr::AS_Declspec);
725 
726   // If this attribute's args were parsed, and it was expected to have
727   // arguments but none were provided, emit a diagnostic.
728   if (ExistingAttrs < Attrs.size() && Attrs.back().getMaxArgs() && !NumArgs) {
729     Diag(OpenParenLoc, diag::err_attribute_requires_arguments) << AttrName;
730     return false;
731   }
732   return true;
733 }
734 
735 /// [MS] decl-specifier:
736 ///             __declspec ( extended-decl-modifier-seq )
737 ///
738 /// [MS] extended-decl-modifier-seq:
739 ///             extended-decl-modifier[opt]
740 ///             extended-decl-modifier extended-decl-modifier-seq
ParseMicrosoftDeclSpecs(ParsedAttributes & Attrs)741 void Parser::ParseMicrosoftDeclSpecs(ParsedAttributes &Attrs) {
742   assert(getLangOpts().DeclSpecKeyword && "__declspec keyword is not enabled");
743   assert(Tok.is(tok::kw___declspec) && "Not a declspec!");
744 
745   SourceLocation StartLoc = Tok.getLocation();
746   SourceLocation EndLoc = StartLoc;
747 
748   while (Tok.is(tok::kw___declspec)) {
749     ConsumeToken();
750     BalancedDelimiterTracker T(*this, tok::l_paren);
751     if (T.expectAndConsume(diag::err_expected_lparen_after, "__declspec",
752                            tok::r_paren))
753       return;
754 
755     // An empty declspec is perfectly legal and should not warn.  Additionally,
756     // you can specify multiple attributes per declspec.
757     while (Tok.isNot(tok::r_paren)) {
758       // Attribute not present.
759       if (TryConsumeToken(tok::comma))
760         continue;
761 
762       if (Tok.is(tok::code_completion)) {
763         cutOffParsing();
764         Actions.CodeCompleteAttribute(AttributeCommonInfo::AS_Declspec);
765         return;
766       }
767 
768       // We expect either a well-known identifier or a generic string.  Anything
769       // else is a malformed declspec.
770       bool IsString = Tok.getKind() == tok::string_literal;
771       if (!IsString && Tok.getKind() != tok::identifier &&
772           Tok.getKind() != tok::kw_restrict) {
773         Diag(Tok, diag::err_ms_declspec_type);
774         T.skipToEnd();
775         return;
776       }
777 
778       IdentifierInfo *AttrName;
779       SourceLocation AttrNameLoc;
780       if (IsString) {
781         SmallString<8> StrBuffer;
782         bool Invalid = false;
783         StringRef Str = PP.getSpelling(Tok, StrBuffer, &Invalid);
784         if (Invalid) {
785           T.skipToEnd();
786           return;
787         }
788         AttrName = PP.getIdentifierInfo(Str);
789         AttrNameLoc = ConsumeStringToken();
790       } else {
791         AttrName = Tok.getIdentifierInfo();
792         AttrNameLoc = ConsumeToken();
793       }
794 
795       bool AttrHandled = false;
796 
797       // Parse attribute arguments.
798       if (Tok.is(tok::l_paren))
799         AttrHandled = ParseMicrosoftDeclSpecArgs(AttrName, AttrNameLoc, Attrs);
800       else if (AttrName->getName() == "property")
801         // The property attribute must have an argument list.
802         Diag(Tok.getLocation(), diag::err_expected_lparen_after)
803             << AttrName->getName();
804 
805       if (!AttrHandled)
806         Attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0,
807                      ParsedAttr::AS_Declspec);
808     }
809     T.consumeClose();
810     EndLoc = T.getCloseLocation();
811   }
812 
813   Attrs.Range = SourceRange(StartLoc, EndLoc);
814 }
815 
ParseMicrosoftTypeAttributes(ParsedAttributes & attrs)816 void Parser::ParseMicrosoftTypeAttributes(ParsedAttributes &attrs) {
817   // Treat these like attributes
818   while (true) {
819     switch (Tok.getKind()) {
820     case tok::kw___fastcall:
821     case tok::kw___stdcall:
822     case tok::kw___thiscall:
823     case tok::kw___regcall:
824     case tok::kw___cdecl:
825     case tok::kw___vectorcall:
826     case tok::kw___ptr64:
827     case tok::kw___w64:
828     case tok::kw___ptr32:
829     case tok::kw___sptr:
830     case tok::kw___uptr: {
831       IdentifierInfo *AttrName = Tok.getIdentifierInfo();
832       SourceLocation AttrNameLoc = ConsumeToken();
833       attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0,
834                    ParsedAttr::AS_Keyword);
835       break;
836     }
837     default:
838       return;
839     }
840   }
841 }
842 
DiagnoseAndSkipExtendedMicrosoftTypeAttributes()843 void Parser::DiagnoseAndSkipExtendedMicrosoftTypeAttributes() {
844   SourceLocation StartLoc = Tok.getLocation();
845   SourceLocation EndLoc = SkipExtendedMicrosoftTypeAttributes();
846 
847   if (EndLoc.isValid()) {
848     SourceRange Range(StartLoc, EndLoc);
849     Diag(StartLoc, diag::warn_microsoft_qualifiers_ignored) << Range;
850   }
851 }
852 
SkipExtendedMicrosoftTypeAttributes()853 SourceLocation Parser::SkipExtendedMicrosoftTypeAttributes() {
854   SourceLocation EndLoc;
855 
856   while (true) {
857     switch (Tok.getKind()) {
858     case tok::kw_const:
859     case tok::kw_volatile:
860     case tok::kw___fastcall:
861     case tok::kw___stdcall:
862     case tok::kw___thiscall:
863     case tok::kw___cdecl:
864     case tok::kw___vectorcall:
865     case tok::kw___ptr32:
866     case tok::kw___ptr64:
867     case tok::kw___w64:
868     case tok::kw___unaligned:
869     case tok::kw___sptr:
870     case tok::kw___uptr:
871       EndLoc = ConsumeToken();
872       break;
873     default:
874       return EndLoc;
875     }
876   }
877 }
878 
ParseBorlandTypeAttributes(ParsedAttributes & attrs)879 void Parser::ParseBorlandTypeAttributes(ParsedAttributes &attrs) {
880   // Treat these like attributes
881   while (Tok.is(tok::kw___pascal)) {
882     IdentifierInfo *AttrName = Tok.getIdentifierInfo();
883     SourceLocation AttrNameLoc = ConsumeToken();
884     attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0,
885                  ParsedAttr::AS_Keyword);
886   }
887 }
888 
ParseOpenCLKernelAttributes(ParsedAttributes & attrs)889 void Parser::ParseOpenCLKernelAttributes(ParsedAttributes &attrs) {
890   // Treat these like attributes
891   while (Tok.is(tok::kw___kernel)) {
892     IdentifierInfo *AttrName = Tok.getIdentifierInfo();
893     SourceLocation AttrNameLoc = ConsumeToken();
894     attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0,
895                  ParsedAttr::AS_Keyword);
896   }
897 }
898 
ParseCUDAFunctionAttributes(ParsedAttributes & attrs)899 void Parser::ParseCUDAFunctionAttributes(ParsedAttributes &attrs) {
900   while (Tok.is(tok::kw___noinline__)) {
901     IdentifierInfo *AttrName = Tok.getIdentifierInfo();
902     SourceLocation AttrNameLoc = ConsumeToken();
903     attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0,
904                  ParsedAttr::AS_Keyword);
905   }
906 }
907 
ParseOpenCLQualifiers(ParsedAttributes & Attrs)908 void Parser::ParseOpenCLQualifiers(ParsedAttributes &Attrs) {
909   IdentifierInfo *AttrName = Tok.getIdentifierInfo();
910   SourceLocation AttrNameLoc = Tok.getLocation();
911   Attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0,
912                ParsedAttr::AS_Keyword);
913 }
914 
isHLSLQualifier(const Token & Tok) const915 bool Parser::isHLSLQualifier(const Token &Tok) const {
916   return Tok.is(tok::kw_groupshared);
917 }
918 
ParseHLSLQualifiers(ParsedAttributes & Attrs)919 void Parser::ParseHLSLQualifiers(ParsedAttributes &Attrs) {
920   IdentifierInfo *AttrName = Tok.getIdentifierInfo();
921   SourceLocation AttrNameLoc = ConsumeToken();
922   Attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0,
923                ParsedAttr::AS_Keyword);
924 }
925 
ParseNullabilityTypeSpecifiers(ParsedAttributes & attrs)926 void Parser::ParseNullabilityTypeSpecifiers(ParsedAttributes &attrs) {
927   // Treat these like attributes, even though they're type specifiers.
928   while (true) {
929     switch (Tok.getKind()) {
930     case tok::kw__Nonnull:
931     case tok::kw__Nullable:
932     case tok::kw__Nullable_result:
933     case tok::kw__Null_unspecified: {
934       IdentifierInfo *AttrName = Tok.getIdentifierInfo();
935       SourceLocation AttrNameLoc = ConsumeToken();
936       if (!getLangOpts().ObjC)
937         Diag(AttrNameLoc, diag::ext_nullability)
938           << AttrName;
939       attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0,
940                    ParsedAttr::AS_Keyword);
941       break;
942     }
943     default:
944       return;
945     }
946   }
947 }
948 
VersionNumberSeparator(const char Separator)949 static bool VersionNumberSeparator(const char Separator) {
950   return (Separator == '.' || Separator == '_');
951 }
952 
953 /// Parse a version number.
954 ///
955 /// version:
956 ///   simple-integer
957 ///   simple-integer '.' simple-integer
958 ///   simple-integer '_' simple-integer
959 ///   simple-integer '.' simple-integer '.' simple-integer
960 ///   simple-integer '_' simple-integer '_' simple-integer
ParseVersionTuple(SourceRange & Range)961 VersionTuple Parser::ParseVersionTuple(SourceRange &Range) {
962   Range = SourceRange(Tok.getLocation(), Tok.getEndLoc());
963 
964   if (!Tok.is(tok::numeric_constant)) {
965     Diag(Tok, diag::err_expected_version);
966     SkipUntil(tok::comma, tok::r_paren,
967               StopAtSemi | StopBeforeMatch | StopAtCodeCompletion);
968     return VersionTuple();
969   }
970 
971   // Parse the major (and possibly minor and subminor) versions, which
972   // are stored in the numeric constant. We utilize a quirk of the
973   // lexer, which is that it handles something like 1.2.3 as a single
974   // numeric constant, rather than two separate tokens.
975   SmallString<512> Buffer;
976   Buffer.resize(Tok.getLength()+1);
977   const char *ThisTokBegin = &Buffer[0];
978 
979   // Get the spelling of the token, which eliminates trigraphs, etc.
980   bool Invalid = false;
981   unsigned ActualLength = PP.getSpelling(Tok, ThisTokBegin, &Invalid);
982   if (Invalid)
983     return VersionTuple();
984 
985   // Parse the major version.
986   unsigned AfterMajor = 0;
987   unsigned Major = 0;
988   while (AfterMajor < ActualLength && isDigit(ThisTokBegin[AfterMajor])) {
989     Major = Major * 10 + ThisTokBegin[AfterMajor] - '0';
990     ++AfterMajor;
991   }
992 
993   if (AfterMajor == 0) {
994     Diag(Tok, diag::err_expected_version);
995     SkipUntil(tok::comma, tok::r_paren,
996               StopAtSemi | StopBeforeMatch | StopAtCodeCompletion);
997     return VersionTuple();
998   }
999 
1000   if (AfterMajor == ActualLength) {
1001     ConsumeToken();
1002 
1003     // We only had a single version component.
1004     if (Major == 0) {
1005       Diag(Tok, diag::err_zero_version);
1006       return VersionTuple();
1007     }
1008 
1009     return VersionTuple(Major);
1010   }
1011 
1012   const char AfterMajorSeparator = ThisTokBegin[AfterMajor];
1013   if (!VersionNumberSeparator(AfterMajorSeparator)
1014       || (AfterMajor + 1 == ActualLength)) {
1015     Diag(Tok, diag::err_expected_version);
1016     SkipUntil(tok::comma, tok::r_paren,
1017               StopAtSemi | StopBeforeMatch | StopAtCodeCompletion);
1018     return VersionTuple();
1019   }
1020 
1021   // Parse the minor version.
1022   unsigned AfterMinor = AfterMajor + 1;
1023   unsigned Minor = 0;
1024   while (AfterMinor < ActualLength && isDigit(ThisTokBegin[AfterMinor])) {
1025     Minor = Minor * 10 + ThisTokBegin[AfterMinor] - '0';
1026     ++AfterMinor;
1027   }
1028 
1029   if (AfterMinor == ActualLength) {
1030     ConsumeToken();
1031 
1032     // We had major.minor.
1033     if (Major == 0 && Minor == 0) {
1034       Diag(Tok, diag::err_zero_version);
1035       return VersionTuple();
1036     }
1037 
1038     return VersionTuple(Major, Minor);
1039   }
1040 
1041   const char AfterMinorSeparator = ThisTokBegin[AfterMinor];
1042   // If what follows is not a '.' or '_', we have a problem.
1043   if (!VersionNumberSeparator(AfterMinorSeparator)) {
1044     Diag(Tok, diag::err_expected_version);
1045     SkipUntil(tok::comma, tok::r_paren,
1046               StopAtSemi | StopBeforeMatch | StopAtCodeCompletion);
1047     return VersionTuple();
1048   }
1049 
1050   // Warn if separators, be it '.' or '_', do not match.
1051   if (AfterMajorSeparator != AfterMinorSeparator)
1052     Diag(Tok, diag::warn_expected_consistent_version_separator);
1053 
1054   // Parse the subminor version.
1055   unsigned AfterSubminor = AfterMinor + 1;
1056   unsigned Subminor = 0;
1057   while (AfterSubminor < ActualLength && isDigit(ThisTokBegin[AfterSubminor])) {
1058     Subminor = Subminor * 10 + ThisTokBegin[AfterSubminor] - '0';
1059     ++AfterSubminor;
1060   }
1061 
1062   if (AfterSubminor != ActualLength) {
1063     Diag(Tok, diag::err_expected_version);
1064     SkipUntil(tok::comma, tok::r_paren,
1065               StopAtSemi | StopBeforeMatch | StopAtCodeCompletion);
1066     return VersionTuple();
1067   }
1068   ConsumeToken();
1069   return VersionTuple(Major, Minor, Subminor);
1070 }
1071 
1072 /// Parse the contents of the "availability" attribute.
1073 ///
1074 /// availability-attribute:
1075 ///   'availability' '(' platform ',' opt-strict version-arg-list,
1076 ///                      opt-replacement, opt-message')'
1077 ///
1078 /// platform:
1079 ///   identifier
1080 ///
1081 /// opt-strict:
1082 ///   'strict' ','
1083 ///
1084 /// version-arg-list:
1085 ///   version-arg
1086 ///   version-arg ',' version-arg-list
1087 ///
1088 /// version-arg:
1089 ///   'introduced' '=' version
1090 ///   'deprecated' '=' version
1091 ///   'obsoleted' = version
1092 ///   'unavailable'
1093 /// opt-replacement:
1094 ///   'replacement' '=' <string>
1095 /// opt-message:
1096 ///   'message' '=' <string>
ParseAvailabilityAttribute(IdentifierInfo & Availability,SourceLocation AvailabilityLoc,ParsedAttributes & attrs,SourceLocation * endLoc,IdentifierInfo * ScopeName,SourceLocation ScopeLoc,ParsedAttr::Syntax Syntax)1097 void Parser::ParseAvailabilityAttribute(IdentifierInfo &Availability,
1098                                         SourceLocation AvailabilityLoc,
1099                                         ParsedAttributes &attrs,
1100                                         SourceLocation *endLoc,
1101                                         IdentifierInfo *ScopeName,
1102                                         SourceLocation ScopeLoc,
1103                                         ParsedAttr::Syntax Syntax) {
1104   enum { Introduced, Deprecated, Obsoleted, Unknown };
1105   AvailabilityChange Changes[Unknown];
1106   ExprResult MessageExpr, ReplacementExpr;
1107 
1108   // Opening '('.
1109   BalancedDelimiterTracker T(*this, tok::l_paren);
1110   if (T.consumeOpen()) {
1111     Diag(Tok, diag::err_expected) << tok::l_paren;
1112     return;
1113   }
1114 
1115   // Parse the platform name.
1116   if (Tok.isNot(tok::identifier)) {
1117     Diag(Tok, diag::err_availability_expected_platform);
1118     SkipUntil(tok::r_paren, StopAtSemi);
1119     return;
1120   }
1121   IdentifierLoc *Platform = ParseIdentifierLoc();
1122   if (const IdentifierInfo *const Ident = Platform->Ident) {
1123     // Canonicalize platform name from "macosx" to "macos".
1124     if (Ident->getName() == "macosx")
1125       Platform->Ident = PP.getIdentifierInfo("macos");
1126     // Canonicalize platform name from "macosx_app_extension" to
1127     // "macos_app_extension".
1128     else if (Ident->getName() == "macosx_app_extension")
1129       Platform->Ident = PP.getIdentifierInfo("macos_app_extension");
1130     else
1131       Platform->Ident = PP.getIdentifierInfo(
1132           AvailabilityAttr::canonicalizePlatformName(Ident->getName()));
1133   }
1134 
1135   // Parse the ',' following the platform name.
1136   if (ExpectAndConsume(tok::comma)) {
1137     SkipUntil(tok::r_paren, StopAtSemi);
1138     return;
1139   }
1140 
1141   // If we haven't grabbed the pointers for the identifiers
1142   // "introduced", "deprecated", and "obsoleted", do so now.
1143   if (!Ident_introduced) {
1144     Ident_introduced = PP.getIdentifierInfo("introduced");
1145     Ident_deprecated = PP.getIdentifierInfo("deprecated");
1146     Ident_obsoleted = PP.getIdentifierInfo("obsoleted");
1147     Ident_unavailable = PP.getIdentifierInfo("unavailable");
1148     Ident_message = PP.getIdentifierInfo("message");
1149     Ident_strict = PP.getIdentifierInfo("strict");
1150     Ident_replacement = PP.getIdentifierInfo("replacement");
1151   }
1152 
1153   // Parse the optional "strict", the optional "replacement" and the set of
1154   // introductions/deprecations/removals.
1155   SourceLocation UnavailableLoc, StrictLoc;
1156   do {
1157     if (Tok.isNot(tok::identifier)) {
1158       Diag(Tok, diag::err_availability_expected_change);
1159       SkipUntil(tok::r_paren, StopAtSemi);
1160       return;
1161     }
1162     IdentifierInfo *Keyword = Tok.getIdentifierInfo();
1163     SourceLocation KeywordLoc = ConsumeToken();
1164 
1165     if (Keyword == Ident_strict) {
1166       if (StrictLoc.isValid()) {
1167         Diag(KeywordLoc, diag::err_availability_redundant)
1168           << Keyword << SourceRange(StrictLoc);
1169       }
1170       StrictLoc = KeywordLoc;
1171       continue;
1172     }
1173 
1174     if (Keyword == Ident_unavailable) {
1175       if (UnavailableLoc.isValid()) {
1176         Diag(KeywordLoc, diag::err_availability_redundant)
1177           << Keyword << SourceRange(UnavailableLoc);
1178       }
1179       UnavailableLoc = KeywordLoc;
1180       continue;
1181     }
1182 
1183     if (Keyword == Ident_deprecated && Platform->Ident &&
1184         Platform->Ident->isStr("swift")) {
1185       // For swift, we deprecate for all versions.
1186       if (Changes[Deprecated].KeywordLoc.isValid()) {
1187         Diag(KeywordLoc, diag::err_availability_redundant)
1188           << Keyword
1189           << SourceRange(Changes[Deprecated].KeywordLoc);
1190       }
1191 
1192       Changes[Deprecated].KeywordLoc = KeywordLoc;
1193       // Use a fake version here.
1194       Changes[Deprecated].Version = VersionTuple(1);
1195       continue;
1196     }
1197 
1198     if (Tok.isNot(tok::equal)) {
1199       Diag(Tok, diag::err_expected_after) << Keyword << tok::equal;
1200       SkipUntil(tok::r_paren, StopAtSemi);
1201       return;
1202     }
1203     ConsumeToken();
1204     if (Keyword == Ident_message || Keyword == Ident_replacement) {
1205       if (Tok.isNot(tok::string_literal)) {
1206         Diag(Tok, diag::err_expected_string_literal)
1207           << /*Source='availability attribute'*/2;
1208         SkipUntil(tok::r_paren, StopAtSemi);
1209         return;
1210       }
1211       if (Keyword == Ident_message)
1212         MessageExpr = ParseStringLiteralExpression();
1213       else
1214         ReplacementExpr = ParseStringLiteralExpression();
1215       // Also reject wide string literals.
1216       if (StringLiteral *MessageStringLiteral =
1217               cast_or_null<StringLiteral>(MessageExpr.get())) {
1218         if (!MessageStringLiteral->isOrdinary()) {
1219           Diag(MessageStringLiteral->getSourceRange().getBegin(),
1220                diag::err_expected_string_literal)
1221             << /*Source='availability attribute'*/ 2;
1222           SkipUntil(tok::r_paren, StopAtSemi);
1223           return;
1224         }
1225       }
1226       if (Keyword == Ident_message)
1227         break;
1228       else
1229         continue;
1230     }
1231 
1232     // Special handling of 'NA' only when applied to introduced or
1233     // deprecated.
1234     if ((Keyword == Ident_introduced || Keyword == Ident_deprecated) &&
1235         Tok.is(tok::identifier)) {
1236       IdentifierInfo *NA = Tok.getIdentifierInfo();
1237       if (NA->getName() == "NA") {
1238         ConsumeToken();
1239         if (Keyword == Ident_introduced)
1240           UnavailableLoc = KeywordLoc;
1241         continue;
1242       }
1243     }
1244 
1245     SourceRange VersionRange;
1246     VersionTuple Version = ParseVersionTuple(VersionRange);
1247 
1248     if (Version.empty()) {
1249       SkipUntil(tok::r_paren, StopAtSemi);
1250       return;
1251     }
1252 
1253     unsigned Index;
1254     if (Keyword == Ident_introduced)
1255       Index = Introduced;
1256     else if (Keyword == Ident_deprecated)
1257       Index = Deprecated;
1258     else if (Keyword == Ident_obsoleted)
1259       Index = Obsoleted;
1260     else
1261       Index = Unknown;
1262 
1263     if (Index < Unknown) {
1264       if (!Changes[Index].KeywordLoc.isInvalid()) {
1265         Diag(KeywordLoc, diag::err_availability_redundant)
1266           << Keyword
1267           << SourceRange(Changes[Index].KeywordLoc,
1268                          Changes[Index].VersionRange.getEnd());
1269       }
1270 
1271       Changes[Index].KeywordLoc = KeywordLoc;
1272       Changes[Index].Version = Version;
1273       Changes[Index].VersionRange = VersionRange;
1274     } else {
1275       Diag(KeywordLoc, diag::err_availability_unknown_change)
1276         << Keyword << VersionRange;
1277     }
1278 
1279   } while (TryConsumeToken(tok::comma));
1280 
1281   // Closing ')'.
1282   if (T.consumeClose())
1283     return;
1284 
1285   if (endLoc)
1286     *endLoc = T.getCloseLocation();
1287 
1288   // The 'unavailable' availability cannot be combined with any other
1289   // availability changes. Make sure that hasn't happened.
1290   if (UnavailableLoc.isValid()) {
1291     bool Complained = false;
1292     for (unsigned Index = Introduced; Index != Unknown; ++Index) {
1293       if (Changes[Index].KeywordLoc.isValid()) {
1294         if (!Complained) {
1295           Diag(UnavailableLoc, diag::warn_availability_and_unavailable)
1296             << SourceRange(Changes[Index].KeywordLoc,
1297                            Changes[Index].VersionRange.getEnd());
1298           Complained = true;
1299         }
1300 
1301         // Clear out the availability.
1302         Changes[Index] = AvailabilityChange();
1303       }
1304     }
1305   }
1306 
1307   // Record this attribute
1308   attrs.addNew(&Availability,
1309                SourceRange(AvailabilityLoc, T.getCloseLocation()),
1310                ScopeName, ScopeLoc,
1311                Platform,
1312                Changes[Introduced],
1313                Changes[Deprecated],
1314                Changes[Obsoleted],
1315                UnavailableLoc, MessageExpr.get(),
1316                Syntax, StrictLoc, ReplacementExpr.get());
1317 }
1318 
1319 /// Parse the contents of the "external_source_symbol" attribute.
1320 ///
1321 /// external-source-symbol-attribute:
1322 ///   'external_source_symbol' '(' keyword-arg-list ')'
1323 ///
1324 /// keyword-arg-list:
1325 ///   keyword-arg
1326 ///   keyword-arg ',' keyword-arg-list
1327 ///
1328 /// keyword-arg:
1329 ///   'language' '=' <string>
1330 ///   'defined_in' '=' <string>
1331 ///   'generated_declaration'
ParseExternalSourceSymbolAttribute(IdentifierInfo & ExternalSourceSymbol,SourceLocation Loc,ParsedAttributes & Attrs,SourceLocation * EndLoc,IdentifierInfo * ScopeName,SourceLocation ScopeLoc,ParsedAttr::Syntax Syntax)1332 void Parser::ParseExternalSourceSymbolAttribute(
1333     IdentifierInfo &ExternalSourceSymbol, SourceLocation Loc,
1334     ParsedAttributes &Attrs, SourceLocation *EndLoc, IdentifierInfo *ScopeName,
1335     SourceLocation ScopeLoc, ParsedAttr::Syntax Syntax) {
1336   // Opening '('.
1337   BalancedDelimiterTracker T(*this, tok::l_paren);
1338   if (T.expectAndConsume())
1339     return;
1340 
1341   // Initialize the pointers for the keyword identifiers when required.
1342   if (!Ident_language) {
1343     Ident_language = PP.getIdentifierInfo("language");
1344     Ident_defined_in = PP.getIdentifierInfo("defined_in");
1345     Ident_generated_declaration = PP.getIdentifierInfo("generated_declaration");
1346   }
1347 
1348   ExprResult Language;
1349   bool HasLanguage = false;
1350   ExprResult DefinedInExpr;
1351   bool HasDefinedIn = false;
1352   IdentifierLoc *GeneratedDeclaration = nullptr;
1353 
1354   // Parse the language/defined_in/generated_declaration keywords
1355   do {
1356     if (Tok.isNot(tok::identifier)) {
1357       Diag(Tok, diag::err_external_source_symbol_expected_keyword);
1358       SkipUntil(tok::r_paren, StopAtSemi);
1359       return;
1360     }
1361 
1362     SourceLocation KeywordLoc = Tok.getLocation();
1363     IdentifierInfo *Keyword = Tok.getIdentifierInfo();
1364     if (Keyword == Ident_generated_declaration) {
1365       if (GeneratedDeclaration) {
1366         Diag(Tok, diag::err_external_source_symbol_duplicate_clause) << Keyword;
1367         SkipUntil(tok::r_paren, StopAtSemi);
1368         return;
1369       }
1370       GeneratedDeclaration = ParseIdentifierLoc();
1371       continue;
1372     }
1373 
1374     if (Keyword != Ident_language && Keyword != Ident_defined_in) {
1375       Diag(Tok, diag::err_external_source_symbol_expected_keyword);
1376       SkipUntil(tok::r_paren, StopAtSemi);
1377       return;
1378     }
1379 
1380     ConsumeToken();
1381     if (ExpectAndConsume(tok::equal, diag::err_expected_after,
1382                          Keyword->getName())) {
1383       SkipUntil(tok::r_paren, StopAtSemi);
1384       return;
1385     }
1386 
1387     bool HadLanguage = HasLanguage, HadDefinedIn = HasDefinedIn;
1388     if (Keyword == Ident_language)
1389       HasLanguage = true;
1390     else
1391       HasDefinedIn = true;
1392 
1393     if (Tok.isNot(tok::string_literal)) {
1394       Diag(Tok, diag::err_expected_string_literal)
1395           << /*Source='external_source_symbol attribute'*/ 3
1396           << /*language | source container*/ (Keyword != Ident_language);
1397       SkipUntil(tok::comma, tok::r_paren, StopAtSemi | StopBeforeMatch);
1398       continue;
1399     }
1400     if (Keyword == Ident_language) {
1401       if (HadLanguage) {
1402         Diag(KeywordLoc, diag::err_external_source_symbol_duplicate_clause)
1403             << Keyword;
1404         ParseStringLiteralExpression();
1405         continue;
1406       }
1407       Language = ParseStringLiteralExpression();
1408     } else {
1409       assert(Keyword == Ident_defined_in && "Invalid clause keyword!");
1410       if (HadDefinedIn) {
1411         Diag(KeywordLoc, diag::err_external_source_symbol_duplicate_clause)
1412             << Keyword;
1413         ParseStringLiteralExpression();
1414         continue;
1415       }
1416       DefinedInExpr = ParseStringLiteralExpression();
1417     }
1418   } while (TryConsumeToken(tok::comma));
1419 
1420   // Closing ')'.
1421   if (T.consumeClose())
1422     return;
1423   if (EndLoc)
1424     *EndLoc = T.getCloseLocation();
1425 
1426   ArgsUnion Args[] = {Language.get(), DefinedInExpr.get(),
1427                       GeneratedDeclaration};
1428   Attrs.addNew(&ExternalSourceSymbol, SourceRange(Loc, T.getCloseLocation()),
1429                ScopeName, ScopeLoc, Args, std::size(Args), Syntax);
1430 }
1431 
1432 /// Parse the contents of the "objc_bridge_related" attribute.
1433 /// objc_bridge_related '(' related_class ',' opt-class_method ',' opt-instance_method ')'
1434 /// related_class:
1435 ///     Identifier
1436 ///
1437 /// opt-class_method:
1438 ///     Identifier: | <empty>
1439 ///
1440 /// opt-instance_method:
1441 ///     Identifier | <empty>
1442 ///
ParseObjCBridgeRelatedAttribute(IdentifierInfo & ObjCBridgeRelated,SourceLocation ObjCBridgeRelatedLoc,ParsedAttributes & Attrs,SourceLocation * EndLoc,IdentifierInfo * ScopeName,SourceLocation ScopeLoc,ParsedAttr::Syntax Syntax)1443 void Parser::ParseObjCBridgeRelatedAttribute(
1444     IdentifierInfo &ObjCBridgeRelated, SourceLocation ObjCBridgeRelatedLoc,
1445     ParsedAttributes &Attrs, SourceLocation *EndLoc, IdentifierInfo *ScopeName,
1446     SourceLocation ScopeLoc, ParsedAttr::Syntax Syntax) {
1447   // Opening '('.
1448   BalancedDelimiterTracker T(*this, tok::l_paren);
1449   if (T.consumeOpen()) {
1450     Diag(Tok, diag::err_expected) << tok::l_paren;
1451     return;
1452   }
1453 
1454   // Parse the related class name.
1455   if (Tok.isNot(tok::identifier)) {
1456     Diag(Tok, diag::err_objcbridge_related_expected_related_class);
1457     SkipUntil(tok::r_paren, StopAtSemi);
1458     return;
1459   }
1460   IdentifierLoc *RelatedClass = ParseIdentifierLoc();
1461   if (ExpectAndConsume(tok::comma)) {
1462     SkipUntil(tok::r_paren, StopAtSemi);
1463     return;
1464   }
1465 
1466   // Parse class method name.  It's non-optional in the sense that a trailing
1467   // comma is required, but it can be the empty string, and then we record a
1468   // nullptr.
1469   IdentifierLoc *ClassMethod = nullptr;
1470   if (Tok.is(tok::identifier)) {
1471     ClassMethod = ParseIdentifierLoc();
1472     if (!TryConsumeToken(tok::colon)) {
1473       Diag(Tok, diag::err_objcbridge_related_selector_name);
1474       SkipUntil(tok::r_paren, StopAtSemi);
1475       return;
1476     }
1477   }
1478   if (!TryConsumeToken(tok::comma)) {
1479     if (Tok.is(tok::colon))
1480       Diag(Tok, diag::err_objcbridge_related_selector_name);
1481     else
1482       Diag(Tok, diag::err_expected) << tok::comma;
1483     SkipUntil(tok::r_paren, StopAtSemi);
1484     return;
1485   }
1486 
1487   // Parse instance method name.  Also non-optional but empty string is
1488   // permitted.
1489   IdentifierLoc *InstanceMethod = nullptr;
1490   if (Tok.is(tok::identifier))
1491     InstanceMethod = ParseIdentifierLoc();
1492   else if (Tok.isNot(tok::r_paren)) {
1493     Diag(Tok, diag::err_expected) << tok::r_paren;
1494     SkipUntil(tok::r_paren, StopAtSemi);
1495     return;
1496   }
1497 
1498   // Closing ')'.
1499   if (T.consumeClose())
1500     return;
1501 
1502   if (EndLoc)
1503     *EndLoc = T.getCloseLocation();
1504 
1505   // Record this attribute
1506   Attrs.addNew(&ObjCBridgeRelated,
1507                SourceRange(ObjCBridgeRelatedLoc, T.getCloseLocation()),
1508                ScopeName, ScopeLoc, RelatedClass, ClassMethod, InstanceMethod,
1509                Syntax);
1510 }
1511 
ParseSwiftNewTypeAttribute(IdentifierInfo & AttrName,SourceLocation AttrNameLoc,ParsedAttributes & Attrs,SourceLocation * EndLoc,IdentifierInfo * ScopeName,SourceLocation ScopeLoc,ParsedAttr::Syntax Syntax)1512 void Parser::ParseSwiftNewTypeAttribute(
1513     IdentifierInfo &AttrName, SourceLocation AttrNameLoc,
1514     ParsedAttributes &Attrs, SourceLocation *EndLoc, IdentifierInfo *ScopeName,
1515     SourceLocation ScopeLoc, ParsedAttr::Syntax Syntax) {
1516   BalancedDelimiterTracker T(*this, tok::l_paren);
1517 
1518   // Opening '('
1519   if (T.consumeOpen()) {
1520     Diag(Tok, diag::err_expected) << tok::l_paren;
1521     return;
1522   }
1523 
1524   if (Tok.is(tok::r_paren)) {
1525     Diag(Tok.getLocation(), diag::err_argument_required_after_attribute);
1526     T.consumeClose();
1527     return;
1528   }
1529   if (Tok.isNot(tok::kw_struct) && Tok.isNot(tok::kw_enum)) {
1530     Diag(Tok, diag::warn_attribute_type_not_supported)
1531         << &AttrName << Tok.getIdentifierInfo();
1532     if (!isTokenSpecial())
1533       ConsumeToken();
1534     T.consumeClose();
1535     return;
1536   }
1537 
1538   auto *SwiftType = IdentifierLoc::create(Actions.Context, Tok.getLocation(),
1539                                           Tok.getIdentifierInfo());
1540   ConsumeToken();
1541 
1542   // Closing ')'
1543   if (T.consumeClose())
1544     return;
1545   if (EndLoc)
1546     *EndLoc = T.getCloseLocation();
1547 
1548   ArgsUnion Args[] = {SwiftType};
1549   Attrs.addNew(&AttrName, SourceRange(AttrNameLoc, T.getCloseLocation()),
1550                ScopeName, ScopeLoc, Args, std::size(Args), Syntax);
1551 }
1552 
ParseTypeTagForDatatypeAttribute(IdentifierInfo & AttrName,SourceLocation AttrNameLoc,ParsedAttributes & Attrs,SourceLocation * EndLoc,IdentifierInfo * ScopeName,SourceLocation ScopeLoc,ParsedAttr::Syntax Syntax)1553 void Parser::ParseTypeTagForDatatypeAttribute(IdentifierInfo &AttrName,
1554                                               SourceLocation AttrNameLoc,
1555                                               ParsedAttributes &Attrs,
1556                                               SourceLocation *EndLoc,
1557                                               IdentifierInfo *ScopeName,
1558                                               SourceLocation ScopeLoc,
1559                                               ParsedAttr::Syntax Syntax) {
1560   assert(Tok.is(tok::l_paren) && "Attribute arg list not starting with '('");
1561 
1562   BalancedDelimiterTracker T(*this, tok::l_paren);
1563   T.consumeOpen();
1564 
1565   if (Tok.isNot(tok::identifier)) {
1566     Diag(Tok, diag::err_expected) << tok::identifier;
1567     T.skipToEnd();
1568     return;
1569   }
1570   IdentifierLoc *ArgumentKind = ParseIdentifierLoc();
1571 
1572   if (ExpectAndConsume(tok::comma)) {
1573     T.skipToEnd();
1574     return;
1575   }
1576 
1577   SourceRange MatchingCTypeRange;
1578   TypeResult MatchingCType = ParseTypeName(&MatchingCTypeRange);
1579   if (MatchingCType.isInvalid()) {
1580     T.skipToEnd();
1581     return;
1582   }
1583 
1584   bool LayoutCompatible = false;
1585   bool MustBeNull = false;
1586   while (TryConsumeToken(tok::comma)) {
1587     if (Tok.isNot(tok::identifier)) {
1588       Diag(Tok, diag::err_expected) << tok::identifier;
1589       T.skipToEnd();
1590       return;
1591     }
1592     IdentifierInfo *Flag = Tok.getIdentifierInfo();
1593     if (Flag->isStr("layout_compatible"))
1594       LayoutCompatible = true;
1595     else if (Flag->isStr("must_be_null"))
1596       MustBeNull = true;
1597     else {
1598       Diag(Tok, diag::err_type_safety_unknown_flag) << Flag;
1599       T.skipToEnd();
1600       return;
1601     }
1602     ConsumeToken(); // consume flag
1603   }
1604 
1605   if (!T.consumeClose()) {
1606     Attrs.addNewTypeTagForDatatype(&AttrName, AttrNameLoc, ScopeName, ScopeLoc,
1607                                    ArgumentKind, MatchingCType.get(),
1608                                    LayoutCompatible, MustBeNull, Syntax);
1609   }
1610 
1611   if (EndLoc)
1612     *EndLoc = T.getCloseLocation();
1613 }
1614 
1615 /// DiagnoseProhibitedCXX11Attribute - We have found the opening square brackets
1616 /// of a C++11 attribute-specifier in a location where an attribute is not
1617 /// permitted. By C++11 [dcl.attr.grammar]p6, this is ill-formed. Diagnose this
1618 /// situation.
1619 ///
1620 /// \return \c true if we skipped an attribute-like chunk of tokens, \c false if
1621 /// this doesn't appear to actually be an attribute-specifier, and the caller
1622 /// should try to parse it.
DiagnoseProhibitedCXX11Attribute()1623 bool Parser::DiagnoseProhibitedCXX11Attribute() {
1624   assert(Tok.is(tok::l_square) && NextToken().is(tok::l_square));
1625 
1626   switch (isCXX11AttributeSpecifier(/*Disambiguate*/true)) {
1627   case CAK_NotAttributeSpecifier:
1628     // No diagnostic: we're in Obj-C++11 and this is not actually an attribute.
1629     return false;
1630 
1631   case CAK_InvalidAttributeSpecifier:
1632     Diag(Tok.getLocation(), diag::err_l_square_l_square_not_attribute);
1633     return false;
1634 
1635   case CAK_AttributeSpecifier:
1636     // Parse and discard the attributes.
1637     SourceLocation BeginLoc = ConsumeBracket();
1638     ConsumeBracket();
1639     SkipUntil(tok::r_square);
1640     assert(Tok.is(tok::r_square) && "isCXX11AttributeSpecifier lied");
1641     SourceLocation EndLoc = ConsumeBracket();
1642     Diag(BeginLoc, diag::err_attributes_not_allowed)
1643       << SourceRange(BeginLoc, EndLoc);
1644     return true;
1645   }
1646   llvm_unreachable("All cases handled above.");
1647 }
1648 
1649 /// We have found the opening square brackets of a C++11
1650 /// attribute-specifier in a location where an attribute is not permitted, but
1651 /// we know where the attributes ought to be written. Parse them anyway, and
1652 /// provide a fixit moving them to the right place.
DiagnoseMisplacedCXX11Attribute(ParsedAttributes & Attrs,SourceLocation CorrectLocation)1653 void Parser::DiagnoseMisplacedCXX11Attribute(ParsedAttributes &Attrs,
1654                                              SourceLocation CorrectLocation) {
1655   assert((Tok.is(tok::l_square) && NextToken().is(tok::l_square)) ||
1656          Tok.is(tok::kw_alignas));
1657 
1658   // Consume the attributes.
1659   SourceLocation Loc = Tok.getLocation();
1660   ParseCXX11Attributes(Attrs);
1661   CharSourceRange AttrRange(SourceRange(Loc, Attrs.Range.getEnd()), true);
1662   // FIXME: use err_attributes_misplaced
1663   Diag(Loc, diag::err_attributes_not_allowed)
1664     << FixItHint::CreateInsertionFromRange(CorrectLocation, AttrRange)
1665     << FixItHint::CreateRemoval(AttrRange);
1666 }
1667 
DiagnoseProhibitedAttributes(const SourceRange & Range,const SourceLocation CorrectLocation)1668 void Parser::DiagnoseProhibitedAttributes(
1669     const SourceRange &Range, const SourceLocation CorrectLocation) {
1670   if (CorrectLocation.isValid()) {
1671     CharSourceRange AttrRange(Range, true);
1672     Diag(CorrectLocation, diag::err_attributes_misplaced)
1673         << FixItHint::CreateInsertionFromRange(CorrectLocation, AttrRange)
1674         << FixItHint::CreateRemoval(AttrRange);
1675   } else
1676     Diag(Range.getBegin(), diag::err_attributes_not_allowed) << Range;
1677 }
1678 
ProhibitCXX11Attributes(ParsedAttributes & Attrs,unsigned DiagID,bool DiagnoseEmptyAttrs,bool WarnOnUnknownAttrs)1679 void Parser::ProhibitCXX11Attributes(ParsedAttributes &Attrs, unsigned DiagID,
1680                                      bool DiagnoseEmptyAttrs,
1681                                      bool WarnOnUnknownAttrs) {
1682 
1683   if (DiagnoseEmptyAttrs && Attrs.empty() && Attrs.Range.isValid()) {
1684     // An attribute list has been parsed, but it was empty.
1685     // This is the case for [[]].
1686     const auto &LangOpts = getLangOpts();
1687     auto &SM = PP.getSourceManager();
1688     Token FirstLSquare;
1689     Lexer::getRawToken(Attrs.Range.getBegin(), FirstLSquare, SM, LangOpts);
1690 
1691     if (FirstLSquare.is(tok::l_square)) {
1692       std::optional<Token> SecondLSquare =
1693           Lexer::findNextToken(FirstLSquare.getLocation(), SM, LangOpts);
1694 
1695       if (SecondLSquare && SecondLSquare->is(tok::l_square)) {
1696         // The attribute range starts with [[, but is empty. So this must
1697         // be [[]], which we are supposed to diagnose because
1698         // DiagnoseEmptyAttrs is true.
1699         Diag(Attrs.Range.getBegin(), DiagID) << Attrs.Range;
1700         return;
1701       }
1702     }
1703   }
1704 
1705   for (const ParsedAttr &AL : Attrs) {
1706     if (!AL.isCXX11Attribute() && !AL.isC2xAttribute())
1707       continue;
1708     if (AL.getKind() == ParsedAttr::UnknownAttribute) {
1709       if (WarnOnUnknownAttrs)
1710         Diag(AL.getLoc(), diag::warn_unknown_attribute_ignored)
1711             << AL << AL.getRange();
1712     } else {
1713       Diag(AL.getLoc(), DiagID) << AL;
1714       AL.setInvalid();
1715     }
1716   }
1717 }
1718 
DiagnoseCXX11AttributeExtension(ParsedAttributes & Attrs)1719 void Parser::DiagnoseCXX11AttributeExtension(ParsedAttributes &Attrs) {
1720   for (const ParsedAttr &PA : Attrs) {
1721     if (PA.isCXX11Attribute() || PA.isC2xAttribute())
1722       Diag(PA.getLoc(), diag::ext_cxx11_attr_placement) << PA << PA.getRange();
1723   }
1724 }
1725 
1726 // Usually, `__attribute__((attrib)) class Foo {} var` means that attribute
1727 // applies to var, not the type Foo.
1728 // As an exception to the rule, __declspec(align(...)) before the
1729 // class-key affects the type instead of the variable.
1730 // Also, Microsoft-style [attributes] seem to affect the type instead of the
1731 // variable.
1732 // This function moves attributes that should apply to the type off DS to Attrs.
stripTypeAttributesOffDeclSpec(ParsedAttributes & Attrs,DeclSpec & DS,Sema::TagUseKind TUK)1733 void Parser::stripTypeAttributesOffDeclSpec(ParsedAttributes &Attrs,
1734                                             DeclSpec &DS,
1735                                             Sema::TagUseKind TUK) {
1736   if (TUK == Sema::TUK_Reference)
1737     return;
1738 
1739   llvm::SmallVector<ParsedAttr *, 1> ToBeMoved;
1740 
1741   for (ParsedAttr &AL : DS.getAttributes()) {
1742     if ((AL.getKind() == ParsedAttr::AT_Aligned &&
1743          AL.isDeclspecAttribute()) ||
1744         AL.isMicrosoftAttribute())
1745       ToBeMoved.push_back(&AL);
1746   }
1747 
1748   for (ParsedAttr *AL : ToBeMoved) {
1749     DS.getAttributes().remove(AL);
1750     Attrs.addAtEnd(AL);
1751   }
1752 }
1753 
1754 /// ParseDeclaration - Parse a full 'declaration', which consists of
1755 /// declaration-specifiers, some number of declarators, and a semicolon.
1756 /// 'Context' should be a DeclaratorContext value.  This returns the
1757 /// location of the semicolon in DeclEnd.
1758 ///
1759 ///       declaration: [C99 6.7]
1760 ///         block-declaration ->
1761 ///           simple-declaration
1762 ///           others                   [FIXME]
1763 /// [C++]   template-declaration
1764 /// [C++]   namespace-definition
1765 /// [C++]   using-directive
1766 /// [C++]   using-declaration
1767 /// [C++11/C11] static_assert-declaration
1768 ///         others... [FIXME]
1769 ///
ParseDeclaration(DeclaratorContext Context,SourceLocation & DeclEnd,ParsedAttributes & DeclAttrs,ParsedAttributes & DeclSpecAttrs,SourceLocation * DeclSpecStart)1770 Parser::DeclGroupPtrTy Parser::ParseDeclaration(DeclaratorContext Context,
1771                                                 SourceLocation &DeclEnd,
1772                                                 ParsedAttributes &DeclAttrs,
1773                                                 ParsedAttributes &DeclSpecAttrs,
1774                                                 SourceLocation *DeclSpecStart) {
1775   ParenBraceBracketBalancer BalancerRAIIObj(*this);
1776   // Must temporarily exit the objective-c container scope for
1777   // parsing c none objective-c decls.
1778   ObjCDeclContextSwitch ObjCDC(*this);
1779 
1780   Decl *SingleDecl = nullptr;
1781   switch (Tok.getKind()) {
1782   case tok::kw_template:
1783   case tok::kw_export:
1784     ProhibitAttributes(DeclAttrs);
1785     ProhibitAttributes(DeclSpecAttrs);
1786     SingleDecl =
1787         ParseDeclarationStartingWithTemplate(Context, DeclEnd, DeclAttrs);
1788     break;
1789   case tok::kw_inline:
1790     // Could be the start of an inline namespace. Allowed as an ext in C++03.
1791     if (getLangOpts().CPlusPlus && NextToken().is(tok::kw_namespace)) {
1792       ProhibitAttributes(DeclAttrs);
1793       ProhibitAttributes(DeclSpecAttrs);
1794       SourceLocation InlineLoc = ConsumeToken();
1795       return ParseNamespace(Context, DeclEnd, InlineLoc);
1796     }
1797     return ParseSimpleDeclaration(Context, DeclEnd, DeclAttrs, DeclSpecAttrs,
1798                                   true, nullptr, DeclSpecStart);
1799 
1800   case tok::kw_cbuffer:
1801   case tok::kw_tbuffer:
1802     SingleDecl = ParseHLSLBuffer(DeclEnd);
1803     break;
1804   case tok::kw_namespace:
1805     ProhibitAttributes(DeclAttrs);
1806     ProhibitAttributes(DeclSpecAttrs);
1807     return ParseNamespace(Context, DeclEnd);
1808   case tok::kw_using: {
1809     ParsedAttributes Attrs(AttrFactory);
1810     takeAndConcatenateAttrs(DeclAttrs, DeclSpecAttrs, Attrs);
1811     return ParseUsingDirectiveOrDeclaration(Context, ParsedTemplateInfo(),
1812                                             DeclEnd, Attrs);
1813   }
1814   case tok::kw_static_assert:
1815   case tok::kw__Static_assert:
1816     ProhibitAttributes(DeclAttrs);
1817     ProhibitAttributes(DeclSpecAttrs);
1818     SingleDecl = ParseStaticAssertDeclaration(DeclEnd);
1819     break;
1820   default:
1821     return ParseSimpleDeclaration(Context, DeclEnd, DeclAttrs, DeclSpecAttrs,
1822                                   true, nullptr, DeclSpecStart);
1823   }
1824 
1825   // This routine returns a DeclGroup, if the thing we parsed only contains a
1826   // single decl, convert it now.
1827   return Actions.ConvertDeclToDeclGroup(SingleDecl);
1828 }
1829 
1830 ///       simple-declaration: [C99 6.7: declaration] [C++ 7p1: dcl.dcl]
1831 ///         declaration-specifiers init-declarator-list[opt] ';'
1832 /// [C++11] attribute-specifier-seq decl-specifier-seq[opt]
1833 ///             init-declarator-list ';'
1834 ///[C90/C++]init-declarator-list ';'                             [TODO]
1835 /// [OMP]   threadprivate-directive
1836 /// [OMP]   allocate-directive                                   [TODO]
1837 ///
1838 ///       for-range-declaration: [C++11 6.5p1: stmt.ranged]
1839 ///         attribute-specifier-seq[opt] type-specifier-seq declarator
1840 ///
1841 /// If RequireSemi is false, this does not check for a ';' at the end of the
1842 /// declaration.  If it is true, it checks for and eats it.
1843 ///
1844 /// If FRI is non-null, we might be parsing a for-range-declaration instead
1845 /// of a simple-declaration. If we find that we are, we also parse the
1846 /// for-range-initializer, and place it here.
1847 ///
1848 /// DeclSpecStart is used when decl-specifiers are parsed before parsing
1849 /// the Declaration. The SourceLocation for this Decl is set to
1850 /// DeclSpecStart if DeclSpecStart is non-null.
ParseSimpleDeclaration(DeclaratorContext Context,SourceLocation & DeclEnd,ParsedAttributes & DeclAttrs,ParsedAttributes & DeclSpecAttrs,bool RequireSemi,ForRangeInit * FRI,SourceLocation * DeclSpecStart)1851 Parser::DeclGroupPtrTy Parser::ParseSimpleDeclaration(
1852     DeclaratorContext Context, SourceLocation &DeclEnd,
1853     ParsedAttributes &DeclAttrs, ParsedAttributes &DeclSpecAttrs,
1854     bool RequireSemi, ForRangeInit *FRI, SourceLocation *DeclSpecStart) {
1855   // Need to retain these for diagnostics before we add them to the DeclSepc.
1856   ParsedAttributesView OriginalDeclSpecAttrs;
1857   OriginalDeclSpecAttrs.addAll(DeclSpecAttrs.begin(), DeclSpecAttrs.end());
1858   OriginalDeclSpecAttrs.Range = DeclSpecAttrs.Range;
1859 
1860   // Parse the common declaration-specifiers piece.
1861   ParsingDeclSpec DS(*this);
1862   DS.takeAttributesFrom(DeclSpecAttrs);
1863 
1864   DeclSpecContext DSContext = getDeclSpecContextFromDeclaratorContext(Context);
1865   ParseDeclarationSpecifiers(DS, ParsedTemplateInfo(), AS_none, DSContext);
1866 
1867   // If we had a free-standing type definition with a missing semicolon, we
1868   // may get this far before the problem becomes obvious.
1869   if (DS.hasTagDefinition() &&
1870       DiagnoseMissingSemiAfterTagDefinition(DS, AS_none, DSContext))
1871     return nullptr;
1872 
1873   // C99 6.7.2.3p6: Handle "struct-or-union identifier;", "enum { X };"
1874   // declaration-specifiers init-declarator-list[opt] ';'
1875   if (Tok.is(tok::semi)) {
1876     ProhibitAttributes(DeclAttrs);
1877     DeclEnd = Tok.getLocation();
1878     if (RequireSemi) ConsumeToken();
1879     RecordDecl *AnonRecord = nullptr;
1880     Decl *TheDecl = Actions.ParsedFreeStandingDeclSpec(
1881         getCurScope(), AS_none, DS, ParsedAttributesView::none(), AnonRecord);
1882     DS.complete(TheDecl);
1883     if (AnonRecord) {
1884       Decl* decls[] = {AnonRecord, TheDecl};
1885       return Actions.BuildDeclaratorGroup(decls);
1886     }
1887     return Actions.ConvertDeclToDeclGroup(TheDecl);
1888   }
1889 
1890   if (DeclSpecStart)
1891     DS.SetRangeStart(*DeclSpecStart);
1892 
1893   return ParseDeclGroup(DS, Context, DeclAttrs, &DeclEnd, FRI);
1894 }
1895 
1896 /// Returns true if this might be the start of a declarator, or a common typo
1897 /// for a declarator.
MightBeDeclarator(DeclaratorContext Context)1898 bool Parser::MightBeDeclarator(DeclaratorContext Context) {
1899   switch (Tok.getKind()) {
1900   case tok::annot_cxxscope:
1901   case tok::annot_template_id:
1902   case tok::caret:
1903   case tok::code_completion:
1904   case tok::coloncolon:
1905   case tok::ellipsis:
1906   case tok::kw___attribute:
1907   case tok::kw_operator:
1908   case tok::l_paren:
1909   case tok::star:
1910     return true;
1911 
1912   case tok::amp:
1913   case tok::ampamp:
1914     return getLangOpts().CPlusPlus;
1915 
1916   case tok::l_square: // Might be an attribute on an unnamed bit-field.
1917     return Context == DeclaratorContext::Member && getLangOpts().CPlusPlus11 &&
1918            NextToken().is(tok::l_square);
1919 
1920   case tok::colon: // Might be a typo for '::' or an unnamed bit-field.
1921     return Context == DeclaratorContext::Member || getLangOpts().CPlusPlus;
1922 
1923   case tok::identifier:
1924     switch (NextToken().getKind()) {
1925     case tok::code_completion:
1926     case tok::coloncolon:
1927     case tok::comma:
1928     case tok::equal:
1929     case tok::equalequal: // Might be a typo for '='.
1930     case tok::kw_alignas:
1931     case tok::kw_asm:
1932     case tok::kw___attribute:
1933     case tok::l_brace:
1934     case tok::l_paren:
1935     case tok::l_square:
1936     case tok::less:
1937     case tok::r_brace:
1938     case tok::r_paren:
1939     case tok::r_square:
1940     case tok::semi:
1941       return true;
1942 
1943     case tok::colon:
1944       // At namespace scope, 'identifier:' is probably a typo for 'identifier::'
1945       // and in block scope it's probably a label. Inside a class definition,
1946       // this is a bit-field.
1947       return Context == DeclaratorContext::Member ||
1948              (getLangOpts().CPlusPlus && Context == DeclaratorContext::File);
1949 
1950     case tok::identifier: // Possible virt-specifier.
1951       return getLangOpts().CPlusPlus11 && isCXX11VirtSpecifier(NextToken());
1952 
1953     default:
1954       return false;
1955     }
1956 
1957   default:
1958     return false;
1959   }
1960 }
1961 
1962 /// Skip until we reach something which seems like a sensible place to pick
1963 /// up parsing after a malformed declaration. This will sometimes stop sooner
1964 /// than SkipUntil(tok::r_brace) would, but will never stop later.
SkipMalformedDecl()1965 void Parser::SkipMalformedDecl() {
1966   while (true) {
1967     switch (Tok.getKind()) {
1968     case tok::l_brace:
1969       // Skip until matching }, then stop. We've probably skipped over
1970       // a malformed class or function definition or similar.
1971       ConsumeBrace();
1972       SkipUntil(tok::r_brace);
1973       if (Tok.isOneOf(tok::comma, tok::l_brace, tok::kw_try)) {
1974         // This declaration isn't over yet. Keep skipping.
1975         continue;
1976       }
1977       TryConsumeToken(tok::semi);
1978       return;
1979 
1980     case tok::l_square:
1981       ConsumeBracket();
1982       SkipUntil(tok::r_square);
1983       continue;
1984 
1985     case tok::l_paren:
1986       ConsumeParen();
1987       SkipUntil(tok::r_paren);
1988       continue;
1989 
1990     case tok::r_brace:
1991       return;
1992 
1993     case tok::semi:
1994       ConsumeToken();
1995       return;
1996 
1997     case tok::kw_inline:
1998       // 'inline namespace' at the start of a line is almost certainly
1999       // a good place to pick back up parsing, except in an Objective-C
2000       // @interface context.
2001       if (Tok.isAtStartOfLine() && NextToken().is(tok::kw_namespace) &&
2002           (!ParsingInObjCContainer || CurParsedObjCImpl))
2003         return;
2004       break;
2005 
2006     case tok::kw_namespace:
2007       // 'namespace' at the start of a line is almost certainly a good
2008       // place to pick back up parsing, except in an Objective-C
2009       // @interface context.
2010       if (Tok.isAtStartOfLine() &&
2011           (!ParsingInObjCContainer || CurParsedObjCImpl))
2012         return;
2013       break;
2014 
2015     case tok::at:
2016       // @end is very much like } in Objective-C contexts.
2017       if (NextToken().isObjCAtKeyword(tok::objc_end) &&
2018           ParsingInObjCContainer)
2019         return;
2020       break;
2021 
2022     case tok::minus:
2023     case tok::plus:
2024       // - and + probably start new method declarations in Objective-C contexts.
2025       if (Tok.isAtStartOfLine() && ParsingInObjCContainer)
2026         return;
2027       break;
2028 
2029     case tok::eof:
2030     case tok::annot_module_begin:
2031     case tok::annot_module_end:
2032     case tok::annot_module_include:
2033       return;
2034 
2035     default:
2036       break;
2037     }
2038 
2039     ConsumeAnyToken();
2040   }
2041 }
2042 
2043 /// ParseDeclGroup - Having concluded that this is either a function
2044 /// definition or a group of object declarations, actually parse the
2045 /// result.
ParseDeclGroup(ParsingDeclSpec & DS,DeclaratorContext Context,ParsedAttributes & Attrs,SourceLocation * DeclEnd,ForRangeInit * FRI)2046 Parser::DeclGroupPtrTy Parser::ParseDeclGroup(ParsingDeclSpec &DS,
2047                                               DeclaratorContext Context,
2048                                               ParsedAttributes &Attrs,
2049                                               SourceLocation *DeclEnd,
2050                                               ForRangeInit *FRI) {
2051   // Parse the first declarator.
2052   // Consume all of the attributes from `Attrs` by moving them to our own local
2053   // list. This ensures that we will not attempt to interpret them as statement
2054   // attributes higher up the callchain.
2055   ParsedAttributes LocalAttrs(AttrFactory);
2056   LocalAttrs.takeAllFrom(Attrs);
2057   ParsingDeclarator D(*this, DS, LocalAttrs, Context);
2058   ParseDeclarator(D);
2059 
2060   // Bail out if the first declarator didn't seem well-formed.
2061   if (!D.hasName() && !D.mayOmitIdentifier()) {
2062     SkipMalformedDecl();
2063     return nullptr;
2064   }
2065 
2066   if (getLangOpts().HLSL)
2067     MaybeParseHLSLSemantics(D);
2068 
2069   if (Tok.is(tok::kw_requires))
2070     ParseTrailingRequiresClause(D);
2071 
2072   // Save late-parsed attributes for now; they need to be parsed in the
2073   // appropriate function scope after the function Decl has been constructed.
2074   // These will be parsed in ParseFunctionDefinition or ParseLexedAttrList.
2075   LateParsedAttrList LateParsedAttrs(true);
2076   if (D.isFunctionDeclarator()) {
2077     MaybeParseGNUAttributes(D, &LateParsedAttrs);
2078 
2079     // The _Noreturn keyword can't appear here, unlike the GNU noreturn
2080     // attribute. If we find the keyword here, tell the user to put it
2081     // at the start instead.
2082     if (Tok.is(tok::kw__Noreturn)) {
2083       SourceLocation Loc = ConsumeToken();
2084       const char *PrevSpec;
2085       unsigned DiagID;
2086 
2087       // We can offer a fixit if it's valid to mark this function as _Noreturn
2088       // and we don't have any other declarators in this declaration.
2089       bool Fixit = !DS.setFunctionSpecNoreturn(Loc, PrevSpec, DiagID);
2090       MaybeParseGNUAttributes(D, &LateParsedAttrs);
2091       Fixit &= Tok.isOneOf(tok::semi, tok::l_brace, tok::kw_try);
2092 
2093       Diag(Loc, diag::err_c11_noreturn_misplaced)
2094           << (Fixit ? FixItHint::CreateRemoval(Loc) : FixItHint())
2095           << (Fixit ? FixItHint::CreateInsertion(D.getBeginLoc(), "_Noreturn ")
2096                     : FixItHint());
2097     }
2098 
2099     // Check to see if we have a function *definition* which must have a body.
2100     if (Tok.is(tok::equal) && NextToken().is(tok::code_completion)) {
2101       cutOffParsing();
2102       Actions.CodeCompleteAfterFunctionEquals(D);
2103       return nullptr;
2104     }
2105     // We're at the point where the parsing of function declarator is finished.
2106     //
2107     // A common error is that users accidently add a virtual specifier
2108     // (e.g. override) in an out-line method definition.
2109     // We attempt to recover by stripping all these specifiers coming after
2110     // the declarator.
2111     while (auto Specifier = isCXX11VirtSpecifier()) {
2112       Diag(Tok, diag::err_virt_specifier_outside_class)
2113           << VirtSpecifiers::getSpecifierName(Specifier)
2114           << FixItHint::CreateRemoval(Tok.getLocation());
2115       ConsumeToken();
2116     }
2117     // Look at the next token to make sure that this isn't a function
2118     // declaration.  We have to check this because __attribute__ might be the
2119     // start of a function definition in GCC-extended K&R C.
2120     if (!isDeclarationAfterDeclarator()) {
2121 
2122       // Function definitions are only allowed at file scope and in C++ classes.
2123       // The C++ inline method definition case is handled elsewhere, so we only
2124       // need to handle the file scope definition case.
2125       if (Context == DeclaratorContext::File) {
2126         if (isStartOfFunctionDefinition(D)) {
2127           if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef) {
2128             Diag(Tok, diag::err_function_declared_typedef);
2129 
2130             // Recover by treating the 'typedef' as spurious.
2131             DS.ClearStorageClassSpecs();
2132           }
2133 
2134           Decl *TheDecl = ParseFunctionDefinition(D, ParsedTemplateInfo(),
2135                                                   &LateParsedAttrs);
2136           return Actions.ConvertDeclToDeclGroup(TheDecl);
2137         }
2138 
2139         if (isDeclarationSpecifier(ImplicitTypenameContext::No)) {
2140           // If there is an invalid declaration specifier right after the
2141           // function prototype, then we must be in a missing semicolon case
2142           // where this isn't actually a body.  Just fall through into the code
2143           // that handles it as a prototype, and let the top-level code handle
2144           // the erroneous declspec where it would otherwise expect a comma or
2145           // semicolon.
2146         } else {
2147           Diag(Tok, diag::err_expected_fn_body);
2148           SkipUntil(tok::semi);
2149           return nullptr;
2150         }
2151       } else {
2152         if (Tok.is(tok::l_brace)) {
2153           Diag(Tok, diag::err_function_definition_not_allowed);
2154           SkipMalformedDecl();
2155           return nullptr;
2156         }
2157       }
2158     }
2159   }
2160 
2161   if (ParseAsmAttributesAfterDeclarator(D))
2162     return nullptr;
2163 
2164   // C++0x [stmt.iter]p1: Check if we have a for-range-declarator. If so, we
2165   // must parse and analyze the for-range-initializer before the declaration is
2166   // analyzed.
2167   //
2168   // Handle the Objective-C for-in loop variable similarly, although we
2169   // don't need to parse the container in advance.
2170   if (FRI && (Tok.is(tok::colon) || isTokIdentifier_in())) {
2171     bool IsForRangeLoop = false;
2172     if (TryConsumeToken(tok::colon, FRI->ColonLoc)) {
2173       IsForRangeLoop = true;
2174       if (getLangOpts().OpenMP)
2175         Actions.startOpenMPCXXRangeFor();
2176       if (Tok.is(tok::l_brace))
2177         FRI->RangeExpr = ParseBraceInitializer();
2178       else
2179         FRI->RangeExpr = ParseExpression();
2180     }
2181 
2182     Decl *ThisDecl = Actions.ActOnDeclarator(getCurScope(), D);
2183     if (IsForRangeLoop) {
2184       Actions.ActOnCXXForRangeDecl(ThisDecl);
2185     } else {
2186       // Obj-C for loop
2187       if (auto *VD = dyn_cast_or_null<VarDecl>(ThisDecl))
2188         VD->setObjCForDecl(true);
2189     }
2190     Actions.FinalizeDeclaration(ThisDecl);
2191     D.complete(ThisDecl);
2192     return Actions.FinalizeDeclaratorGroup(getCurScope(), DS, ThisDecl);
2193   }
2194 
2195   SmallVector<Decl *, 8> DeclsInGroup;
2196   Decl *FirstDecl = ParseDeclarationAfterDeclaratorAndAttributes(
2197       D, ParsedTemplateInfo(), FRI);
2198   if (LateParsedAttrs.size() > 0)
2199     ParseLexedAttributeList(LateParsedAttrs, FirstDecl, true, false);
2200   D.complete(FirstDecl);
2201   if (FirstDecl)
2202     DeclsInGroup.push_back(FirstDecl);
2203 
2204   bool ExpectSemi = Context != DeclaratorContext::ForInit;
2205 
2206   // If we don't have a comma, it is either the end of the list (a ';') or an
2207   // error, bail out.
2208   SourceLocation CommaLoc;
2209   while (TryConsumeToken(tok::comma, CommaLoc)) {
2210     if (Tok.isAtStartOfLine() && ExpectSemi && !MightBeDeclarator(Context)) {
2211       // This comma was followed by a line-break and something which can't be
2212       // the start of a declarator. The comma was probably a typo for a
2213       // semicolon.
2214       Diag(CommaLoc, diag::err_expected_semi_declaration)
2215         << FixItHint::CreateReplacement(CommaLoc, ";");
2216       ExpectSemi = false;
2217       break;
2218     }
2219 
2220     // Parse the next declarator.
2221     D.clear();
2222     D.setCommaLoc(CommaLoc);
2223 
2224     // Accept attributes in an init-declarator.  In the first declarator in a
2225     // declaration, these would be part of the declspec.  In subsequent
2226     // declarators, they become part of the declarator itself, so that they
2227     // don't apply to declarators after *this* one.  Examples:
2228     //    short __attribute__((common)) var;    -> declspec
2229     //    short var __attribute__((common));    -> declarator
2230     //    short x, __attribute__((common)) var;    -> declarator
2231     MaybeParseGNUAttributes(D);
2232 
2233     // MSVC parses but ignores qualifiers after the comma as an extension.
2234     if (getLangOpts().MicrosoftExt)
2235       DiagnoseAndSkipExtendedMicrosoftTypeAttributes();
2236 
2237     ParseDeclarator(D);
2238 
2239     if (getLangOpts().HLSL)
2240       MaybeParseHLSLSemantics(D);
2241 
2242     if (!D.isInvalidType()) {
2243       // C++2a [dcl.decl]p1
2244       //    init-declarator:
2245       //	      declarator initializer[opt]
2246       //        declarator requires-clause
2247       if (Tok.is(tok::kw_requires))
2248         ParseTrailingRequiresClause(D);
2249       Decl *ThisDecl = ParseDeclarationAfterDeclarator(D);
2250       D.complete(ThisDecl);
2251       if (ThisDecl)
2252         DeclsInGroup.push_back(ThisDecl);
2253     }
2254   }
2255 
2256   if (DeclEnd)
2257     *DeclEnd = Tok.getLocation();
2258 
2259   if (ExpectSemi && ExpectAndConsumeSemi(
2260                         Context == DeclaratorContext::File
2261                             ? diag::err_invalid_token_after_toplevel_declarator
2262                             : diag::err_expected_semi_declaration)) {
2263     // Okay, there was no semicolon and one was expected.  If we see a
2264     // declaration specifier, just assume it was missing and continue parsing.
2265     // Otherwise things are very confused and we skip to recover.
2266     if (!isDeclarationSpecifier(ImplicitTypenameContext::No)) {
2267       SkipUntil(tok::r_brace, StopAtSemi | StopBeforeMatch);
2268       TryConsumeToken(tok::semi);
2269     }
2270   }
2271 
2272   return Actions.FinalizeDeclaratorGroup(getCurScope(), DS, DeclsInGroup);
2273 }
2274 
2275 /// Parse an optional simple-asm-expr and attributes, and attach them to a
2276 /// declarator. Returns true on an error.
ParseAsmAttributesAfterDeclarator(Declarator & D)2277 bool Parser::ParseAsmAttributesAfterDeclarator(Declarator &D) {
2278   // If a simple-asm-expr is present, parse it.
2279   if (Tok.is(tok::kw_asm)) {
2280     SourceLocation Loc;
2281     ExprResult AsmLabel(ParseSimpleAsm(/*ForAsmLabel*/ true, &Loc));
2282     if (AsmLabel.isInvalid()) {
2283       SkipUntil(tok::semi, StopBeforeMatch);
2284       return true;
2285     }
2286 
2287     D.setAsmLabel(AsmLabel.get());
2288     D.SetRangeEnd(Loc);
2289   }
2290 
2291   MaybeParseGNUAttributes(D);
2292   return false;
2293 }
2294 
2295 /// Parse 'declaration' after parsing 'declaration-specifiers
2296 /// declarator'. This method parses the remainder of the declaration
2297 /// (including any attributes or initializer, among other things) and
2298 /// finalizes the declaration.
2299 ///
2300 ///       init-declarator: [C99 6.7]
2301 ///         declarator
2302 ///         declarator '=' initializer
2303 /// [GNU]   declarator simple-asm-expr[opt] attributes[opt]
2304 /// [GNU]   declarator simple-asm-expr[opt] attributes[opt] '=' initializer
2305 /// [C++]   declarator initializer[opt]
2306 ///
2307 /// [C++] initializer:
2308 /// [C++]   '=' initializer-clause
2309 /// [C++]   '(' expression-list ')'
2310 /// [C++0x] '=' 'default'                                                [TODO]
2311 /// [C++0x] '=' 'delete'
2312 /// [C++0x] braced-init-list
2313 ///
2314 /// According to the standard grammar, =default and =delete are function
2315 /// definitions, but that definitely doesn't fit with the parser here.
2316 ///
ParseDeclarationAfterDeclarator(Declarator & D,const ParsedTemplateInfo & TemplateInfo)2317 Decl *Parser::ParseDeclarationAfterDeclarator(
2318     Declarator &D, const ParsedTemplateInfo &TemplateInfo) {
2319   if (ParseAsmAttributesAfterDeclarator(D))
2320     return nullptr;
2321 
2322   return ParseDeclarationAfterDeclaratorAndAttributes(D, TemplateInfo);
2323 }
2324 
ParseDeclarationAfterDeclaratorAndAttributes(Declarator & D,const ParsedTemplateInfo & TemplateInfo,ForRangeInit * FRI)2325 Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(
2326     Declarator &D, const ParsedTemplateInfo &TemplateInfo, ForRangeInit *FRI) {
2327   // RAII type used to track whether we're inside an initializer.
2328   struct InitializerScopeRAII {
2329     Parser &P;
2330     Declarator &D;
2331     Decl *ThisDecl;
2332 
2333     InitializerScopeRAII(Parser &P, Declarator &D, Decl *ThisDecl)
2334         : P(P), D(D), ThisDecl(ThisDecl) {
2335       if (ThisDecl && P.getLangOpts().CPlusPlus) {
2336         Scope *S = nullptr;
2337         if (D.getCXXScopeSpec().isSet()) {
2338           P.EnterScope(0);
2339           S = P.getCurScope();
2340         }
2341         P.Actions.ActOnCXXEnterDeclInitializer(S, ThisDecl);
2342       }
2343     }
2344     ~InitializerScopeRAII() { pop(); }
2345     void pop() {
2346       if (ThisDecl && P.getLangOpts().CPlusPlus) {
2347         Scope *S = nullptr;
2348         if (D.getCXXScopeSpec().isSet())
2349           S = P.getCurScope();
2350         P.Actions.ActOnCXXExitDeclInitializer(S, ThisDecl);
2351         if (S)
2352           P.ExitScope();
2353       }
2354       ThisDecl = nullptr;
2355     }
2356   };
2357 
2358   enum class InitKind { Uninitialized, Equal, CXXDirect, CXXBraced };
2359   InitKind TheInitKind;
2360   // If a '==' or '+=' is found, suggest a fixit to '='.
2361   if (isTokenEqualOrEqualTypo())
2362     TheInitKind = InitKind::Equal;
2363   else if (Tok.is(tok::l_paren))
2364     TheInitKind = InitKind::CXXDirect;
2365   else if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace) &&
2366            (!CurParsedObjCImpl || !D.isFunctionDeclarator()))
2367     TheInitKind = InitKind::CXXBraced;
2368   else
2369     TheInitKind = InitKind::Uninitialized;
2370   if (TheInitKind != InitKind::Uninitialized)
2371     D.setHasInitializer();
2372 
2373   // Inform Sema that we just parsed this declarator.
2374   Decl *ThisDecl = nullptr;
2375   Decl *OuterDecl = nullptr;
2376   switch (TemplateInfo.Kind) {
2377   case ParsedTemplateInfo::NonTemplate:
2378     ThisDecl = Actions.ActOnDeclarator(getCurScope(), D);
2379     break;
2380 
2381   case ParsedTemplateInfo::Template:
2382   case ParsedTemplateInfo::ExplicitSpecialization: {
2383     ThisDecl = Actions.ActOnTemplateDeclarator(getCurScope(),
2384                                                *TemplateInfo.TemplateParams,
2385                                                D);
2386     if (VarTemplateDecl *VT = dyn_cast_or_null<VarTemplateDecl>(ThisDecl)) {
2387       // Re-direct this decl to refer to the templated decl so that we can
2388       // initialize it.
2389       ThisDecl = VT->getTemplatedDecl();
2390       OuterDecl = VT;
2391     }
2392     break;
2393   }
2394   case ParsedTemplateInfo::ExplicitInstantiation: {
2395     if (Tok.is(tok::semi)) {
2396       DeclResult ThisRes = Actions.ActOnExplicitInstantiation(
2397           getCurScope(), TemplateInfo.ExternLoc, TemplateInfo.TemplateLoc, D);
2398       if (ThisRes.isInvalid()) {
2399         SkipUntil(tok::semi, StopBeforeMatch);
2400         return nullptr;
2401       }
2402       ThisDecl = ThisRes.get();
2403     } else {
2404       // FIXME: This check should be for a variable template instantiation only.
2405 
2406       // Check that this is a valid instantiation
2407       if (D.getName().getKind() != UnqualifiedIdKind::IK_TemplateId) {
2408         // If the declarator-id is not a template-id, issue a diagnostic and
2409         // recover by ignoring the 'template' keyword.
2410         Diag(Tok, diag::err_template_defn_explicit_instantiation)
2411             << 2 << FixItHint::CreateRemoval(TemplateInfo.TemplateLoc);
2412         ThisDecl = Actions.ActOnDeclarator(getCurScope(), D);
2413       } else {
2414         SourceLocation LAngleLoc =
2415             PP.getLocForEndOfToken(TemplateInfo.TemplateLoc);
2416         Diag(D.getIdentifierLoc(),
2417              diag::err_explicit_instantiation_with_definition)
2418             << SourceRange(TemplateInfo.TemplateLoc)
2419             << FixItHint::CreateInsertion(LAngleLoc, "<>");
2420 
2421         // Recover as if it were an explicit specialization.
2422         TemplateParameterLists FakedParamLists;
2423         FakedParamLists.push_back(Actions.ActOnTemplateParameterList(
2424             0, SourceLocation(), TemplateInfo.TemplateLoc, LAngleLoc,
2425             std::nullopt, LAngleLoc, nullptr));
2426 
2427         ThisDecl =
2428             Actions.ActOnTemplateDeclarator(getCurScope(), FakedParamLists, D);
2429       }
2430     }
2431     break;
2432     }
2433   }
2434 
2435   switch (TheInitKind) {
2436   // Parse declarator '=' initializer.
2437   case InitKind::Equal: {
2438     SourceLocation EqualLoc = ConsumeToken();
2439 
2440     if (Tok.is(tok::kw_delete)) {
2441       if (D.isFunctionDeclarator())
2442         Diag(ConsumeToken(), diag::err_default_delete_in_multiple_declaration)
2443           << 1 /* delete */;
2444       else
2445         Diag(ConsumeToken(), diag::err_deleted_non_function);
2446     } else if (Tok.is(tok::kw_default)) {
2447       if (D.isFunctionDeclarator())
2448         Diag(ConsumeToken(), diag::err_default_delete_in_multiple_declaration)
2449           << 0 /* default */;
2450       else
2451         Diag(ConsumeToken(), diag::err_default_special_members)
2452             << getLangOpts().CPlusPlus20;
2453     } else {
2454       InitializerScopeRAII InitScope(*this, D, ThisDecl);
2455 
2456       if (Tok.is(tok::code_completion)) {
2457         cutOffParsing();
2458         Actions.CodeCompleteInitializer(getCurScope(), ThisDecl);
2459         Actions.FinalizeDeclaration(ThisDecl);
2460         return nullptr;
2461       }
2462 
2463       PreferredType.enterVariableInit(Tok.getLocation(), ThisDecl);
2464       ExprResult Init = ParseInitializer();
2465 
2466       // If this is the only decl in (possibly) range based for statement,
2467       // our best guess is that the user meant ':' instead of '='.
2468       if (Tok.is(tok::r_paren) && FRI && D.isFirstDeclarator()) {
2469         Diag(EqualLoc, diag::err_single_decl_assign_in_for_range)
2470             << FixItHint::CreateReplacement(EqualLoc, ":");
2471         // We are trying to stop parser from looking for ';' in this for
2472         // statement, therefore preventing spurious errors to be issued.
2473         FRI->ColonLoc = EqualLoc;
2474         Init = ExprError();
2475         FRI->RangeExpr = Init;
2476       }
2477 
2478       InitScope.pop();
2479 
2480       if (Init.isInvalid()) {
2481         SmallVector<tok::TokenKind, 2> StopTokens;
2482         StopTokens.push_back(tok::comma);
2483         if (D.getContext() == DeclaratorContext::ForInit ||
2484             D.getContext() == DeclaratorContext::SelectionInit)
2485           StopTokens.push_back(tok::r_paren);
2486         SkipUntil(StopTokens, StopAtSemi | StopBeforeMatch);
2487         Actions.ActOnInitializerError(ThisDecl);
2488       } else
2489         Actions.AddInitializerToDecl(ThisDecl, Init.get(),
2490                                      /*DirectInit=*/false);
2491     }
2492     break;
2493   }
2494   case InitKind::CXXDirect: {
2495     // Parse C++ direct initializer: '(' expression-list ')'
2496     BalancedDelimiterTracker T(*this, tok::l_paren);
2497     T.consumeOpen();
2498 
2499     ExprVector Exprs;
2500 
2501     InitializerScopeRAII InitScope(*this, D, ThisDecl);
2502 
2503     auto ThisVarDecl = dyn_cast_or_null<VarDecl>(ThisDecl);
2504     auto RunSignatureHelp = [&]() {
2505       QualType PreferredType = Actions.ProduceConstructorSignatureHelp(
2506           ThisVarDecl->getType()->getCanonicalTypeInternal(),
2507           ThisDecl->getLocation(), Exprs, T.getOpenLocation(),
2508           /*Braced=*/false);
2509       CalledSignatureHelp = true;
2510       return PreferredType;
2511     };
2512     auto SetPreferredType = [&] {
2513       PreferredType.enterFunctionArgument(Tok.getLocation(), RunSignatureHelp);
2514     };
2515 
2516     llvm::function_ref<void()> ExpressionStarts;
2517     if (ThisVarDecl) {
2518       // ParseExpressionList can sometimes succeed even when ThisDecl is not
2519       // VarDecl. This is an error and it is reported in a call to
2520       // Actions.ActOnInitializerError(). However, we call
2521       // ProduceConstructorSignatureHelp only on VarDecls.
2522       ExpressionStarts = SetPreferredType;
2523     }
2524     if (ParseExpressionList(Exprs, ExpressionStarts)) {
2525       if (ThisVarDecl && PP.isCodeCompletionReached() && !CalledSignatureHelp) {
2526         Actions.ProduceConstructorSignatureHelp(
2527             ThisVarDecl->getType()->getCanonicalTypeInternal(),
2528             ThisDecl->getLocation(), Exprs, T.getOpenLocation(),
2529             /*Braced=*/false);
2530         CalledSignatureHelp = true;
2531       }
2532       Actions.ActOnInitializerError(ThisDecl);
2533       SkipUntil(tok::r_paren, StopAtSemi);
2534     } else {
2535       // Match the ')'.
2536       T.consumeClose();
2537       InitScope.pop();
2538 
2539       ExprResult Initializer = Actions.ActOnParenListExpr(T.getOpenLocation(),
2540                                                           T.getCloseLocation(),
2541                                                           Exprs);
2542       Actions.AddInitializerToDecl(ThisDecl, Initializer.get(),
2543                                    /*DirectInit=*/true);
2544     }
2545     break;
2546   }
2547   case InitKind::CXXBraced: {
2548     // Parse C++0x braced-init-list.
2549     Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
2550 
2551     InitializerScopeRAII InitScope(*this, D, ThisDecl);
2552 
2553     PreferredType.enterVariableInit(Tok.getLocation(), ThisDecl);
2554     ExprResult Init(ParseBraceInitializer());
2555 
2556     InitScope.pop();
2557 
2558     if (Init.isInvalid()) {
2559       Actions.ActOnInitializerError(ThisDecl);
2560     } else
2561       Actions.AddInitializerToDecl(ThisDecl, Init.get(), /*DirectInit=*/true);
2562     break;
2563   }
2564   case InitKind::Uninitialized: {
2565     Actions.ActOnUninitializedDecl(ThisDecl);
2566     break;
2567   }
2568   }
2569 
2570   Actions.FinalizeDeclaration(ThisDecl);
2571   return OuterDecl ? OuterDecl : ThisDecl;
2572 }
2573 
2574 /// ParseSpecifierQualifierList
2575 ///        specifier-qualifier-list:
2576 ///          type-specifier specifier-qualifier-list[opt]
2577 ///          type-qualifier specifier-qualifier-list[opt]
2578 /// [GNU]    attributes     specifier-qualifier-list[opt]
2579 ///
ParseSpecifierQualifierList(DeclSpec & DS,ImplicitTypenameContext AllowImplicitTypename,AccessSpecifier AS,DeclSpecContext DSC)2580 void Parser::ParseSpecifierQualifierList(
2581     DeclSpec &DS, ImplicitTypenameContext AllowImplicitTypename,
2582     AccessSpecifier AS, DeclSpecContext DSC) {
2583   /// specifier-qualifier-list is a subset of declaration-specifiers.  Just
2584   /// parse declaration-specifiers and complain about extra stuff.
2585   /// TODO: diagnose attribute-specifiers and alignment-specifiers.
2586   ParseDeclarationSpecifiers(DS, ParsedTemplateInfo(), AS, DSC, nullptr,
2587                              AllowImplicitTypename);
2588 
2589   // Validate declspec for type-name.
2590   unsigned Specs = DS.getParsedSpecifiers();
2591   if (isTypeSpecifier(DSC) && !DS.hasTypeSpecifier()) {
2592     Diag(Tok, diag::err_expected_type);
2593     DS.SetTypeSpecError();
2594   } else if (Specs == DeclSpec::PQ_None && !DS.hasAttributes()) {
2595     Diag(Tok, diag::err_typename_requires_specqual);
2596     if (!DS.hasTypeSpecifier())
2597       DS.SetTypeSpecError();
2598   }
2599 
2600   // Issue diagnostic and remove storage class if present.
2601   if (Specs & DeclSpec::PQ_StorageClassSpecifier) {
2602     if (DS.getStorageClassSpecLoc().isValid())
2603       Diag(DS.getStorageClassSpecLoc(),diag::err_typename_invalid_storageclass);
2604     else
2605       Diag(DS.getThreadStorageClassSpecLoc(),
2606            diag::err_typename_invalid_storageclass);
2607     DS.ClearStorageClassSpecs();
2608   }
2609 
2610   // Issue diagnostic and remove function specifier if present.
2611   if (Specs & DeclSpec::PQ_FunctionSpecifier) {
2612     if (DS.isInlineSpecified())
2613       Diag(DS.getInlineSpecLoc(), diag::err_typename_invalid_functionspec);
2614     if (DS.isVirtualSpecified())
2615       Diag(DS.getVirtualSpecLoc(), diag::err_typename_invalid_functionspec);
2616     if (DS.hasExplicitSpecifier())
2617       Diag(DS.getExplicitSpecLoc(), diag::err_typename_invalid_functionspec);
2618     if (DS.isNoreturnSpecified())
2619       Diag(DS.getNoreturnSpecLoc(), diag::err_typename_invalid_functionspec);
2620     DS.ClearFunctionSpecs();
2621   }
2622 
2623   // Issue diagnostic and remove constexpr specifier if present.
2624   if (DS.hasConstexprSpecifier() && DSC != DeclSpecContext::DSC_condition) {
2625     Diag(DS.getConstexprSpecLoc(), diag::err_typename_invalid_constexpr)
2626         << static_cast<int>(DS.getConstexprSpecifier());
2627     DS.ClearConstexprSpec();
2628   }
2629 }
2630 
2631 /// isValidAfterIdentifierInDeclaratorAfterDeclSpec - Return true if the
2632 /// specified token is valid after the identifier in a declarator which
2633 /// immediately follows the declspec.  For example, these things are valid:
2634 ///
2635 ///      int x   [             4];         // direct-declarator
2636 ///      int x   (             int y);     // direct-declarator
2637 ///  int(int x   )                         // direct-declarator
2638 ///      int x   ;                         // simple-declaration
2639 ///      int x   =             17;         // init-declarator-list
2640 ///      int x   ,             y;          // init-declarator-list
2641 ///      int x   __asm__       ("foo");    // init-declarator-list
2642 ///      int x   :             4;          // struct-declarator
2643 ///      int x   {             5};         // C++'0x unified initializers
2644 ///
2645 /// This is not, because 'x' does not immediately follow the declspec (though
2646 /// ')' happens to be valid anyway).
2647 ///    int (x)
2648 ///
isValidAfterIdentifierInDeclarator(const Token & T)2649 static bool isValidAfterIdentifierInDeclarator(const Token &T) {
2650   return T.isOneOf(tok::l_square, tok::l_paren, tok::r_paren, tok::semi,
2651                    tok::comma, tok::equal, tok::kw_asm, tok::l_brace,
2652                    tok::colon);
2653 }
2654 
2655 /// ParseImplicitInt - This method is called when we have an non-typename
2656 /// identifier in a declspec (which normally terminates the decl spec) when
2657 /// the declspec has no type specifier.  In this case, the declspec is either
2658 /// malformed or is "implicit int" (in K&R and C89).
2659 ///
2660 /// This method handles diagnosing this prettily and returns false if the
2661 /// declspec is done being processed.  If it recovers and thinks there may be
2662 /// other pieces of declspec after it, it returns true.
2663 ///
ParseImplicitInt(DeclSpec & DS,CXXScopeSpec * SS,const ParsedTemplateInfo & TemplateInfo,AccessSpecifier AS,DeclSpecContext DSC,ParsedAttributes & Attrs)2664 bool Parser::ParseImplicitInt(DeclSpec &DS, CXXScopeSpec *SS,
2665                               const ParsedTemplateInfo &TemplateInfo,
2666                               AccessSpecifier AS, DeclSpecContext DSC,
2667                               ParsedAttributes &Attrs) {
2668   assert(Tok.is(tok::identifier) && "should have identifier");
2669 
2670   SourceLocation Loc = Tok.getLocation();
2671   // If we see an identifier that is not a type name, we normally would
2672   // parse it as the identifier being declared.  However, when a typename
2673   // is typo'd or the definition is not included, this will incorrectly
2674   // parse the typename as the identifier name and fall over misparsing
2675   // later parts of the diagnostic.
2676   //
2677   // As such, we try to do some look-ahead in cases where this would
2678   // otherwise be an "implicit-int" case to see if this is invalid.  For
2679   // example: "static foo_t x = 4;"  In this case, if we parsed foo_t as
2680   // an identifier with implicit int, we'd get a parse error because the
2681   // next token is obviously invalid for a type.  Parse these as a case
2682   // with an invalid type specifier.
2683   assert(!DS.hasTypeSpecifier() && "Type specifier checked above");
2684 
2685   // Since we know that this either implicit int (which is rare) or an
2686   // error, do lookahead to try to do better recovery. This never applies
2687   // within a type specifier. Outside of C++, we allow this even if the
2688   // language doesn't "officially" support implicit int -- we support
2689   // implicit int as an extension in some language modes.
2690   if (!isTypeSpecifier(DSC) && getLangOpts().isImplicitIntAllowed() &&
2691       isValidAfterIdentifierInDeclarator(NextToken())) {
2692     // If this token is valid for implicit int, e.g. "static x = 4", then
2693     // we just avoid eating the identifier, so it will be parsed as the
2694     // identifier in the declarator.
2695     return false;
2696   }
2697 
2698   // Early exit as Sema has a dedicated missing_actual_pipe_type diagnostic
2699   // for incomplete declarations such as `pipe p`.
2700   if (getLangOpts().OpenCLCPlusPlus && DS.isTypeSpecPipe())
2701     return false;
2702 
2703   if (getLangOpts().CPlusPlus &&
2704       DS.getStorageClassSpec() == DeclSpec::SCS_auto) {
2705     // Don't require a type specifier if we have the 'auto' storage class
2706     // specifier in C++98 -- we'll promote it to a type specifier.
2707     if (SS)
2708       AnnotateScopeToken(*SS, /*IsNewAnnotation*/false);
2709     return false;
2710   }
2711 
2712   if (getLangOpts().CPlusPlus && (!SS || SS->isEmpty()) &&
2713       getLangOpts().MSVCCompat) {
2714     // Lookup of an unqualified type name has failed in MSVC compatibility mode.
2715     // Give Sema a chance to recover if we are in a template with dependent base
2716     // classes.
2717     if (ParsedType T = Actions.ActOnMSVCUnknownTypeName(
2718             *Tok.getIdentifierInfo(), Tok.getLocation(),
2719             DSC == DeclSpecContext::DSC_template_type_arg)) {
2720       const char *PrevSpec;
2721       unsigned DiagID;
2722       DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec, DiagID, T,
2723                          Actions.getASTContext().getPrintingPolicy());
2724       DS.SetRangeEnd(Tok.getLocation());
2725       ConsumeToken();
2726       return false;
2727     }
2728   }
2729 
2730   // Otherwise, if we don't consume this token, we are going to emit an
2731   // error anyway.  Try to recover from various common problems.  Check
2732   // to see if this was a reference to a tag name without a tag specified.
2733   // This is a common problem in C (saying 'foo' instead of 'struct foo').
2734   //
2735   // C++ doesn't need this, and isTagName doesn't take SS.
2736   if (SS == nullptr) {
2737     const char *TagName = nullptr, *FixitTagName = nullptr;
2738     tok::TokenKind TagKind = tok::unknown;
2739 
2740     switch (Actions.isTagName(*Tok.getIdentifierInfo(), getCurScope())) {
2741       default: break;
2742       case DeclSpec::TST_enum:
2743         TagName="enum"  ; FixitTagName = "enum "  ; TagKind=tok::kw_enum ;break;
2744       case DeclSpec::TST_union:
2745         TagName="union" ; FixitTagName = "union " ;TagKind=tok::kw_union ;break;
2746       case DeclSpec::TST_struct:
2747         TagName="struct"; FixitTagName = "struct ";TagKind=tok::kw_struct;break;
2748       case DeclSpec::TST_interface:
2749         TagName="__interface"; FixitTagName = "__interface ";
2750         TagKind=tok::kw___interface;break;
2751       case DeclSpec::TST_class:
2752         TagName="class" ; FixitTagName = "class " ;TagKind=tok::kw_class ;break;
2753     }
2754 
2755     if (TagName) {
2756       IdentifierInfo *TokenName = Tok.getIdentifierInfo();
2757       LookupResult R(Actions, TokenName, SourceLocation(),
2758                      Sema::LookupOrdinaryName);
2759 
2760       Diag(Loc, diag::err_use_of_tag_name_without_tag)
2761         << TokenName << TagName << getLangOpts().CPlusPlus
2762         << FixItHint::CreateInsertion(Tok.getLocation(), FixitTagName);
2763 
2764       if (Actions.LookupParsedName(R, getCurScope(), SS)) {
2765         for (LookupResult::iterator I = R.begin(), IEnd = R.end();
2766              I != IEnd; ++I)
2767           Diag((*I)->getLocation(), diag::note_decl_hiding_tag_type)
2768             << TokenName << TagName;
2769       }
2770 
2771       // Parse this as a tag as if the missing tag were present.
2772       if (TagKind == tok::kw_enum)
2773         ParseEnumSpecifier(Loc, DS, TemplateInfo, AS,
2774                            DeclSpecContext::DSC_normal);
2775       else
2776         ParseClassSpecifier(TagKind, Loc, DS, TemplateInfo, AS,
2777                             /*EnteringContext*/ false,
2778                             DeclSpecContext::DSC_normal, Attrs);
2779       return true;
2780     }
2781   }
2782 
2783   // Determine whether this identifier could plausibly be the name of something
2784   // being declared (with a missing type).
2785   if (!isTypeSpecifier(DSC) && (!SS || DSC == DeclSpecContext::DSC_top_level ||
2786                                 DSC == DeclSpecContext::DSC_class)) {
2787     // Look ahead to the next token to try to figure out what this declaration
2788     // was supposed to be.
2789     switch (NextToken().getKind()) {
2790     case tok::l_paren: {
2791       // static x(4); // 'x' is not a type
2792       // x(int n);    // 'x' is not a type
2793       // x (*p)[];    // 'x' is a type
2794       //
2795       // Since we're in an error case, we can afford to perform a tentative
2796       // parse to determine which case we're in.
2797       TentativeParsingAction PA(*this);
2798       ConsumeToken();
2799       TPResult TPR = TryParseDeclarator(/*mayBeAbstract*/false);
2800       PA.Revert();
2801 
2802       if (TPR != TPResult::False) {
2803         // The identifier is followed by a parenthesized declarator.
2804         // It's supposed to be a type.
2805         break;
2806       }
2807 
2808       // If we're in a context where we could be declaring a constructor,
2809       // check whether this is a constructor declaration with a bogus name.
2810       if (DSC == DeclSpecContext::DSC_class ||
2811           (DSC == DeclSpecContext::DSC_top_level && SS)) {
2812         IdentifierInfo *II = Tok.getIdentifierInfo();
2813         if (Actions.isCurrentClassNameTypo(II, SS)) {
2814           Diag(Loc, diag::err_constructor_bad_name)
2815             << Tok.getIdentifierInfo() << II
2816             << FixItHint::CreateReplacement(Tok.getLocation(), II->getName());
2817           Tok.setIdentifierInfo(II);
2818         }
2819       }
2820       // Fall through.
2821       [[fallthrough]];
2822     }
2823     case tok::comma:
2824     case tok::equal:
2825     case tok::kw_asm:
2826     case tok::l_brace:
2827     case tok::l_square:
2828     case tok::semi:
2829       // This looks like a variable or function declaration. The type is
2830       // probably missing. We're done parsing decl-specifiers.
2831       // But only if we are not in a function prototype scope.
2832       if (getCurScope()->isFunctionPrototypeScope())
2833         break;
2834       if (SS)
2835         AnnotateScopeToken(*SS, /*IsNewAnnotation*/false);
2836       return false;
2837 
2838     default:
2839       // This is probably supposed to be a type. This includes cases like:
2840       //   int f(itn);
2841       //   struct S { unsigned : 4; };
2842       break;
2843     }
2844   }
2845 
2846   // This is almost certainly an invalid type name. Let Sema emit a diagnostic
2847   // and attempt to recover.
2848   ParsedType T;
2849   IdentifierInfo *II = Tok.getIdentifierInfo();
2850   bool IsTemplateName = getLangOpts().CPlusPlus && NextToken().is(tok::less);
2851   Actions.DiagnoseUnknownTypeName(II, Loc, getCurScope(), SS, T,
2852                                   IsTemplateName);
2853   if (T) {
2854     // The action has suggested that the type T could be used. Set that as
2855     // the type in the declaration specifiers, consume the would-be type
2856     // name token, and we're done.
2857     const char *PrevSpec;
2858     unsigned DiagID;
2859     DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec, DiagID, T,
2860                        Actions.getASTContext().getPrintingPolicy());
2861     DS.SetRangeEnd(Tok.getLocation());
2862     ConsumeToken();
2863     // There may be other declaration specifiers after this.
2864     return true;
2865   } else if (II != Tok.getIdentifierInfo()) {
2866     // If no type was suggested, the correction is to a keyword
2867     Tok.setKind(II->getTokenID());
2868     // There may be other declaration specifiers after this.
2869     return true;
2870   }
2871 
2872   // Otherwise, the action had no suggestion for us.  Mark this as an error.
2873   DS.SetTypeSpecError();
2874   DS.SetRangeEnd(Tok.getLocation());
2875   ConsumeToken();
2876 
2877   // Eat any following template arguments.
2878   if (IsTemplateName) {
2879     SourceLocation LAngle, RAngle;
2880     TemplateArgList Args;
2881     ParseTemplateIdAfterTemplateName(true, LAngle, Args, RAngle);
2882   }
2883 
2884   // TODO: Could inject an invalid typedef decl in an enclosing scope to
2885   // avoid rippling error messages on subsequent uses of the same type,
2886   // could be useful if #include was forgotten.
2887   return true;
2888 }
2889 
2890 /// Determine the declaration specifier context from the declarator
2891 /// context.
2892 ///
2893 /// \param Context the declarator context, which is one of the
2894 /// DeclaratorContext enumerator values.
2895 Parser::DeclSpecContext
getDeclSpecContextFromDeclaratorContext(DeclaratorContext Context)2896 Parser::getDeclSpecContextFromDeclaratorContext(DeclaratorContext Context) {
2897   switch (Context) {
2898   case DeclaratorContext::Member:
2899     return DeclSpecContext::DSC_class;
2900   case DeclaratorContext::File:
2901     return DeclSpecContext::DSC_top_level;
2902   case DeclaratorContext::TemplateParam:
2903     return DeclSpecContext::DSC_template_param;
2904   case DeclaratorContext::TemplateArg:
2905     return DeclSpecContext::DSC_template_arg;
2906   case DeclaratorContext::TemplateTypeArg:
2907     return DeclSpecContext::DSC_template_type_arg;
2908   case DeclaratorContext::TrailingReturn:
2909   case DeclaratorContext::TrailingReturnVar:
2910     return DeclSpecContext::DSC_trailing;
2911   case DeclaratorContext::AliasDecl:
2912   case DeclaratorContext::AliasTemplate:
2913     return DeclSpecContext::DSC_alias_declaration;
2914   case DeclaratorContext::Association:
2915     return DeclSpecContext::DSC_association;
2916   case DeclaratorContext::TypeName:
2917     return DeclSpecContext::DSC_type_specifier;
2918   case DeclaratorContext::Condition:
2919     return DeclSpecContext::DSC_condition;
2920   case DeclaratorContext::ConversionId:
2921     return DeclSpecContext::DSC_conv_operator;
2922   case DeclaratorContext::Prototype:
2923   case DeclaratorContext::ObjCResult:
2924   case DeclaratorContext::ObjCParameter:
2925   case DeclaratorContext::KNRTypeList:
2926   case DeclaratorContext::FunctionalCast:
2927   case DeclaratorContext::Block:
2928   case DeclaratorContext::ForInit:
2929   case DeclaratorContext::SelectionInit:
2930   case DeclaratorContext::CXXNew:
2931   case DeclaratorContext::CXXCatch:
2932   case DeclaratorContext::ObjCCatch:
2933   case DeclaratorContext::BlockLiteral:
2934   case DeclaratorContext::LambdaExpr:
2935   case DeclaratorContext::LambdaExprParameter:
2936   case DeclaratorContext::RequiresExpr:
2937     return DeclSpecContext::DSC_normal;
2938   }
2939 
2940   llvm_unreachable("Missing DeclaratorContext case");
2941 }
2942 
2943 /// ParseAlignArgument - Parse the argument to an alignment-specifier.
2944 ///
2945 /// FIXME: Simply returns an alignof() expression if the argument is a
2946 /// type. Ideally, the type should be propagated directly into Sema.
2947 ///
2948 /// [C11]   type-id
2949 /// [C11]   constant-expression
2950 /// [C++0x] type-id ...[opt]
2951 /// [C++0x] assignment-expression ...[opt]
ParseAlignArgument(SourceLocation Start,SourceLocation & EllipsisLoc)2952 ExprResult Parser::ParseAlignArgument(SourceLocation Start,
2953                                       SourceLocation &EllipsisLoc) {
2954   ExprResult ER;
2955   if (isTypeIdInParens()) {
2956     SourceLocation TypeLoc = Tok.getLocation();
2957     ParsedType Ty = ParseTypeName().get();
2958     SourceRange TypeRange(Start, Tok.getLocation());
2959     ER = Actions.ActOnUnaryExprOrTypeTraitExpr(TypeLoc, UETT_AlignOf, true,
2960                                                Ty.getAsOpaquePtr(), TypeRange);
2961   } else
2962     ER = ParseConstantExpression();
2963 
2964   if (getLangOpts().CPlusPlus11)
2965     TryConsumeToken(tok::ellipsis, EllipsisLoc);
2966 
2967   return ER;
2968 }
2969 
2970 /// ParseAlignmentSpecifier - Parse an alignment-specifier, and add the
2971 /// attribute to Attrs.
2972 ///
2973 /// alignment-specifier:
2974 /// [C11]   '_Alignas' '(' type-id ')'
2975 /// [C11]   '_Alignas' '(' constant-expression ')'
2976 /// [C++11] 'alignas' '(' type-id ...[opt] ')'
2977 /// [C++11] 'alignas' '(' assignment-expression ...[opt] ')'
ParseAlignmentSpecifier(ParsedAttributes & Attrs,SourceLocation * EndLoc)2978 void Parser::ParseAlignmentSpecifier(ParsedAttributes &Attrs,
2979                                      SourceLocation *EndLoc) {
2980   assert(Tok.isOneOf(tok::kw_alignas, tok::kw__Alignas) &&
2981          "Not an alignment-specifier!");
2982 
2983   IdentifierInfo *KWName = Tok.getIdentifierInfo();
2984   SourceLocation KWLoc = ConsumeToken();
2985 
2986   BalancedDelimiterTracker T(*this, tok::l_paren);
2987   if (T.expectAndConsume())
2988     return;
2989 
2990   SourceLocation EllipsisLoc;
2991   ExprResult ArgExpr = ParseAlignArgument(T.getOpenLocation(), EllipsisLoc);
2992   if (ArgExpr.isInvalid()) {
2993     T.skipToEnd();
2994     return;
2995   }
2996 
2997   T.consumeClose();
2998   if (EndLoc)
2999     *EndLoc = T.getCloseLocation();
3000 
3001   ArgsVector ArgExprs;
3002   ArgExprs.push_back(ArgExpr.get());
3003   Attrs.addNew(KWName, KWLoc, nullptr, KWLoc, ArgExprs.data(), 1,
3004                ParsedAttr::AS_Keyword, EllipsisLoc);
3005 }
3006 
ParseExtIntegerArgument()3007 ExprResult Parser::ParseExtIntegerArgument() {
3008   assert(Tok.isOneOf(tok::kw__ExtInt, tok::kw__BitInt) &&
3009          "Not an extended int type");
3010   ConsumeToken();
3011 
3012   BalancedDelimiterTracker T(*this, tok::l_paren);
3013   if (T.expectAndConsume())
3014     return ExprError();
3015 
3016   ExprResult ER = ParseConstantExpression();
3017   if (ER.isInvalid()) {
3018     T.skipToEnd();
3019     return ExprError();
3020   }
3021 
3022   if(T.consumeClose())
3023     return ExprError();
3024   return ER;
3025 }
3026 
3027 /// Determine whether we're looking at something that might be a declarator
3028 /// in a simple-declaration. If it can't possibly be a declarator, maybe
3029 /// diagnose a missing semicolon after a prior tag definition in the decl
3030 /// specifier.
3031 ///
3032 /// \return \c true if an error occurred and this can't be any kind of
3033 /// declaration.
3034 bool
DiagnoseMissingSemiAfterTagDefinition(DeclSpec & DS,AccessSpecifier AS,DeclSpecContext DSContext,LateParsedAttrList * LateAttrs)3035 Parser::DiagnoseMissingSemiAfterTagDefinition(DeclSpec &DS, AccessSpecifier AS,
3036                                               DeclSpecContext DSContext,
3037                                               LateParsedAttrList *LateAttrs) {
3038   assert(DS.hasTagDefinition() && "shouldn't call this");
3039 
3040   bool EnteringContext = (DSContext == DeclSpecContext::DSC_class ||
3041                           DSContext == DeclSpecContext::DSC_top_level);
3042 
3043   if (getLangOpts().CPlusPlus &&
3044       Tok.isOneOf(tok::identifier, tok::coloncolon, tok::kw_decltype,
3045                   tok::annot_template_id) &&
3046       TryAnnotateCXXScopeToken(EnteringContext)) {
3047     SkipMalformedDecl();
3048     return true;
3049   }
3050 
3051   bool HasScope = Tok.is(tok::annot_cxxscope);
3052   // Make a copy in case GetLookAheadToken invalidates the result of NextToken.
3053   Token AfterScope = HasScope ? NextToken() : Tok;
3054 
3055   // Determine whether the following tokens could possibly be a
3056   // declarator.
3057   bool MightBeDeclarator = true;
3058   if (Tok.isOneOf(tok::kw_typename, tok::annot_typename)) {
3059     // A declarator-id can't start with 'typename'.
3060     MightBeDeclarator = false;
3061   } else if (AfterScope.is(tok::annot_template_id)) {
3062     // If we have a type expressed as a template-id, this cannot be a
3063     // declarator-id (such a type cannot be redeclared in a simple-declaration).
3064     TemplateIdAnnotation *Annot =
3065         static_cast<TemplateIdAnnotation *>(AfterScope.getAnnotationValue());
3066     if (Annot->Kind == TNK_Type_template)
3067       MightBeDeclarator = false;
3068   } else if (AfterScope.is(tok::identifier)) {
3069     const Token &Next = HasScope ? GetLookAheadToken(2) : NextToken();
3070 
3071     // These tokens cannot come after the declarator-id in a
3072     // simple-declaration, and are likely to come after a type-specifier.
3073     if (Next.isOneOf(tok::star, tok::amp, tok::ampamp, tok::identifier,
3074                      tok::annot_cxxscope, tok::coloncolon)) {
3075       // Missing a semicolon.
3076       MightBeDeclarator = false;
3077     } else if (HasScope) {
3078       // If the declarator-id has a scope specifier, it must redeclare a
3079       // previously-declared entity. If that's a type (and this is not a
3080       // typedef), that's an error.
3081       CXXScopeSpec SS;
3082       Actions.RestoreNestedNameSpecifierAnnotation(
3083           Tok.getAnnotationValue(), Tok.getAnnotationRange(), SS);
3084       IdentifierInfo *Name = AfterScope.getIdentifierInfo();
3085       Sema::NameClassification Classification = Actions.ClassifyName(
3086           getCurScope(), SS, Name, AfterScope.getLocation(), Next,
3087           /*CCC=*/nullptr);
3088       switch (Classification.getKind()) {
3089       case Sema::NC_Error:
3090         SkipMalformedDecl();
3091         return true;
3092 
3093       case Sema::NC_Keyword:
3094         llvm_unreachable("typo correction is not possible here");
3095 
3096       case Sema::NC_Type:
3097       case Sema::NC_TypeTemplate:
3098       case Sema::NC_UndeclaredNonType:
3099       case Sema::NC_UndeclaredTemplate:
3100         // Not a previously-declared non-type entity.
3101         MightBeDeclarator = false;
3102         break;
3103 
3104       case Sema::NC_Unknown:
3105       case Sema::NC_NonType:
3106       case Sema::NC_DependentNonType:
3107       case Sema::NC_OverloadSet:
3108       case Sema::NC_VarTemplate:
3109       case Sema::NC_FunctionTemplate:
3110       case Sema::NC_Concept:
3111         // Might be a redeclaration of a prior entity.
3112         break;
3113       }
3114     }
3115   }
3116 
3117   if (MightBeDeclarator)
3118     return false;
3119 
3120   const PrintingPolicy &PPol = Actions.getASTContext().getPrintingPolicy();
3121   Diag(PP.getLocForEndOfToken(DS.getRepAsDecl()->getEndLoc()),
3122        diag::err_expected_after)
3123       << DeclSpec::getSpecifierName(DS.getTypeSpecType(), PPol) << tok::semi;
3124 
3125   // Try to recover from the typo, by dropping the tag definition and parsing
3126   // the problematic tokens as a type.
3127   //
3128   // FIXME: Split the DeclSpec into pieces for the standalone
3129   // declaration and pieces for the following declaration, instead
3130   // of assuming that all the other pieces attach to new declaration,
3131   // and call ParsedFreeStandingDeclSpec as appropriate.
3132   DS.ClearTypeSpecType();
3133   ParsedTemplateInfo NotATemplate;
3134   ParseDeclarationSpecifiers(DS, NotATemplate, AS, DSContext, LateAttrs);
3135   return false;
3136 }
3137 
3138 // Choose the apprpriate diagnostic error for why fixed point types are
3139 // disabled, set the previous specifier, and mark as invalid.
SetupFixedPointError(const LangOptions & LangOpts,const char * & PrevSpec,unsigned & DiagID,bool & isInvalid)3140 static void SetupFixedPointError(const LangOptions &LangOpts,
3141                                  const char *&PrevSpec, unsigned &DiagID,
3142                                  bool &isInvalid) {
3143   assert(!LangOpts.FixedPoint);
3144   DiagID = diag::err_fixed_point_not_enabled;
3145   PrevSpec = "";  // Not used by diagnostic
3146   isInvalid = true;
3147 }
3148 
3149 /// ParseDeclarationSpecifiers
3150 ///       declaration-specifiers: [C99 6.7]
3151 ///         storage-class-specifier declaration-specifiers[opt]
3152 ///         type-specifier declaration-specifiers[opt]
3153 /// [C99]   function-specifier declaration-specifiers[opt]
3154 /// [C11]   alignment-specifier declaration-specifiers[opt]
3155 /// [GNU]   attributes declaration-specifiers[opt]
3156 /// [Clang] '__module_private__' declaration-specifiers[opt]
3157 /// [ObjC1] '__kindof' declaration-specifiers[opt]
3158 ///
3159 ///       storage-class-specifier: [C99 6.7.1]
3160 ///         'typedef'
3161 ///         'extern'
3162 ///         'static'
3163 ///         'auto'
3164 ///         'register'
3165 /// [C++]   'mutable'
3166 /// [C++11] 'thread_local'
3167 /// [C11]   '_Thread_local'
3168 /// [GNU]   '__thread'
3169 ///       function-specifier: [C99 6.7.4]
3170 /// [C99]   'inline'
3171 /// [C++]   'virtual'
3172 /// [C++]   'explicit'
3173 /// [OpenCL] '__kernel'
3174 ///       'friend': [C++ dcl.friend]
3175 ///       'constexpr': [C++0x dcl.constexpr]
ParseDeclarationSpecifiers(DeclSpec & DS,const ParsedTemplateInfo & TemplateInfo,AccessSpecifier AS,DeclSpecContext DSContext,LateParsedAttrList * LateAttrs,ImplicitTypenameContext AllowImplicitTypename)3176 void Parser::ParseDeclarationSpecifiers(
3177     DeclSpec &DS, const ParsedTemplateInfo &TemplateInfo, AccessSpecifier AS,
3178     DeclSpecContext DSContext, LateParsedAttrList *LateAttrs,
3179     ImplicitTypenameContext AllowImplicitTypename) {
3180   if (DS.getSourceRange().isInvalid()) {
3181     // Start the range at the current token but make the end of the range
3182     // invalid.  This will make the entire range invalid unless we successfully
3183     // consume a token.
3184     DS.SetRangeStart(Tok.getLocation());
3185     DS.SetRangeEnd(SourceLocation());
3186   }
3187 
3188   // If we are in a operator context, convert it back into a type specifier
3189   // context for better error handling later on.
3190   if (DSContext == DeclSpecContext::DSC_conv_operator) {
3191     // No implicit typename here.
3192     AllowImplicitTypename = ImplicitTypenameContext::No;
3193     DSContext = DeclSpecContext::DSC_type_specifier;
3194   }
3195 
3196   bool EnteringContext = (DSContext == DeclSpecContext::DSC_class ||
3197                           DSContext == DeclSpecContext::DSC_top_level);
3198   bool AttrsLastTime = false;
3199   ParsedAttributes attrs(AttrFactory);
3200   // We use Sema's policy to get bool macros right.
3201   PrintingPolicy Policy = Actions.getPrintingPolicy();
3202   while (true) {
3203     bool isInvalid = false;
3204     bool isStorageClass = false;
3205     const char *PrevSpec = nullptr;
3206     unsigned DiagID = 0;
3207 
3208     // This value needs to be set to the location of the last token if the last
3209     // token of the specifier is already consumed.
3210     SourceLocation ConsumedEnd;
3211 
3212     // HACK: MSVC doesn't consider _Atomic to be a keyword and its STL
3213     // implementation for VS2013 uses _Atomic as an identifier for one of the
3214     // classes in <atomic>.
3215     //
3216     // A typedef declaration containing _Atomic<...> is among the places where
3217     // the class is used.  If we are currently parsing such a declaration, treat
3218     // the token as an identifier.
3219     if (getLangOpts().MSVCCompat && Tok.is(tok::kw__Atomic) &&
3220         DS.getStorageClassSpec() == clang::DeclSpec::SCS_typedef &&
3221         !DS.hasTypeSpecifier() && GetLookAheadToken(1).is(tok::less))
3222       Tok.setKind(tok::identifier);
3223 
3224     SourceLocation Loc = Tok.getLocation();
3225 
3226     // Helper for image types in OpenCL.
3227     auto handleOpenCLImageKW = [&] (StringRef Ext, TypeSpecifierType ImageTypeSpec) {
3228       // Check if the image type is supported and otherwise turn the keyword into an identifier
3229       // because image types from extensions are not reserved identifiers.
3230       if (!StringRef(Ext).empty() && !getActions().getOpenCLOptions().isSupported(Ext, getLangOpts())) {
3231         Tok.getIdentifierInfo()->revertTokenIDToIdentifier();
3232         Tok.setKind(tok::identifier);
3233         return false;
3234       }
3235       isInvalid = DS.SetTypeSpecType(ImageTypeSpec, Loc, PrevSpec, DiagID, Policy);
3236       return true;
3237     };
3238 
3239     // Turn off usual access checking for template specializations and
3240     // instantiations.
3241     bool IsTemplateSpecOrInst =
3242         (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation ||
3243          TemplateInfo.Kind == ParsedTemplateInfo::ExplicitSpecialization);
3244 
3245     switch (Tok.getKind()) {
3246     default:
3247     DoneWithDeclSpec:
3248       if (!AttrsLastTime)
3249         ProhibitAttributes(attrs);
3250       else {
3251         // Reject C++11 / C2x attributes that aren't type attributes.
3252         for (const ParsedAttr &PA : attrs) {
3253           if (!PA.isCXX11Attribute() && !PA.isC2xAttribute())
3254             continue;
3255           if (PA.getKind() == ParsedAttr::UnknownAttribute)
3256             // We will warn about the unknown attribute elsewhere (in
3257             // SemaDeclAttr.cpp)
3258             continue;
3259           // GCC ignores this attribute when placed on the DeclSpec in [[]]
3260           // syntax, so we do the same.
3261           if (PA.getKind() == ParsedAttr::AT_VectorSize) {
3262             Diag(PA.getLoc(), diag::warn_attribute_ignored) << PA;
3263             PA.setInvalid();
3264             continue;
3265           }
3266           // We reject AT_LifetimeBound and AT_AnyX86NoCfCheck, even though they
3267           // are type attributes, because we historically haven't allowed these
3268           // to be used as type attributes in C++11 / C2x syntax.
3269           if (PA.isTypeAttr() && PA.getKind() != ParsedAttr::AT_LifetimeBound &&
3270               PA.getKind() != ParsedAttr::AT_AnyX86NoCfCheck)
3271             continue;
3272           Diag(PA.getLoc(), diag::err_attribute_not_type_attr) << PA;
3273           PA.setInvalid();
3274         }
3275 
3276         DS.takeAttributesFrom(attrs);
3277       }
3278 
3279       // If this is not a declaration specifier token, we're done reading decl
3280       // specifiers.  First verify that DeclSpec's are consistent.
3281       DS.Finish(Actions, Policy);
3282       return;
3283 
3284     case tok::l_square:
3285     case tok::kw_alignas:
3286       if (!standardAttributesAllowed() || !isCXX11AttributeSpecifier())
3287         goto DoneWithDeclSpec;
3288 
3289       ProhibitAttributes(attrs);
3290       // FIXME: It would be good to recover by accepting the attributes,
3291       //        but attempting to do that now would cause serious
3292       //        madness in terms of diagnostics.
3293       attrs.clear();
3294       attrs.Range = SourceRange();
3295 
3296       ParseCXX11Attributes(attrs);
3297       AttrsLastTime = true;
3298       continue;
3299 
3300     case tok::code_completion: {
3301       Sema::ParserCompletionContext CCC = Sema::PCC_Namespace;
3302       if (DS.hasTypeSpecifier()) {
3303         bool AllowNonIdentifiers
3304           = (getCurScope()->getFlags() & (Scope::ControlScope |
3305                                           Scope::BlockScope |
3306                                           Scope::TemplateParamScope |
3307                                           Scope::FunctionPrototypeScope |
3308                                           Scope::AtCatchScope)) == 0;
3309         bool AllowNestedNameSpecifiers
3310           = DSContext == DeclSpecContext::DSC_top_level ||
3311             (DSContext == DeclSpecContext::DSC_class && DS.isFriendSpecified());
3312 
3313         cutOffParsing();
3314         Actions.CodeCompleteDeclSpec(getCurScope(), DS,
3315                                      AllowNonIdentifiers,
3316                                      AllowNestedNameSpecifiers);
3317         return;
3318       }
3319 
3320       // Class context can appear inside a function/block, so prioritise that.
3321       if (TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate)
3322         CCC = DSContext == DeclSpecContext::DSC_class ? Sema::PCC_MemberTemplate
3323                                                       : Sema::PCC_Template;
3324       else if (DSContext == DeclSpecContext::DSC_class)
3325         CCC = Sema::PCC_Class;
3326       else if (getCurScope()->getFnParent() || getCurScope()->getBlockParent())
3327         CCC = Sema::PCC_LocalDeclarationSpecifiers;
3328       else if (CurParsedObjCImpl)
3329         CCC = Sema::PCC_ObjCImplementation;
3330 
3331       cutOffParsing();
3332       Actions.CodeCompleteOrdinaryName(getCurScope(), CCC);
3333       return;
3334     }
3335 
3336     case tok::coloncolon: // ::foo::bar
3337       // C++ scope specifier.  Annotate and loop, or bail out on error.
3338       if (TryAnnotateCXXScopeToken(EnteringContext)) {
3339         if (!DS.hasTypeSpecifier())
3340           DS.SetTypeSpecError();
3341         goto DoneWithDeclSpec;
3342       }
3343       if (Tok.is(tok::coloncolon)) // ::new or ::delete
3344         goto DoneWithDeclSpec;
3345       continue;
3346 
3347     case tok::annot_cxxscope: {
3348       if (DS.hasTypeSpecifier() || DS.isTypeAltiVecVector())
3349         goto DoneWithDeclSpec;
3350 
3351       CXXScopeSpec SS;
3352       Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(),
3353                                                    Tok.getAnnotationRange(),
3354                                                    SS);
3355 
3356       // We are looking for a qualified typename.
3357       Token Next = NextToken();
3358 
3359       TemplateIdAnnotation *TemplateId = Next.is(tok::annot_template_id)
3360                                              ? takeTemplateIdAnnotation(Next)
3361                                              : nullptr;
3362       if (TemplateId && TemplateId->hasInvalidName()) {
3363         // We found something like 'T::U<Args> x', but U is not a template.
3364         // Assume it was supposed to be a type.
3365         DS.SetTypeSpecError();
3366         ConsumeAnnotationToken();
3367         break;
3368       }
3369 
3370       if (TemplateId && TemplateId->Kind == TNK_Type_template) {
3371         // We have a qualified template-id, e.g., N::A<int>
3372 
3373         // If this would be a valid constructor declaration with template
3374         // arguments, we will reject the attempt to form an invalid type-id
3375         // referring to the injected-class-name when we annotate the token,
3376         // per C++ [class.qual]p2.
3377         //
3378         // To improve diagnostics for this case, parse the declaration as a
3379         // constructor (and reject the extra template arguments later).
3380         if ((DSContext == DeclSpecContext::DSC_top_level ||
3381              DSContext == DeclSpecContext::DSC_class) &&
3382             TemplateId->Name &&
3383             Actions.isCurrentClassName(*TemplateId->Name, getCurScope(), &SS) &&
3384             isConstructorDeclarator(/*Unqualified=*/false,
3385                                     /*DeductionGuide=*/false,
3386                                     DS.isFriendSpecified())) {
3387           // The user meant this to be an out-of-line constructor
3388           // definition, but template arguments are not allowed
3389           // there.  Just allow this as a constructor; we'll
3390           // complain about it later.
3391           goto DoneWithDeclSpec;
3392         }
3393 
3394         DS.getTypeSpecScope() = SS;
3395         ConsumeAnnotationToken(); // The C++ scope.
3396         assert(Tok.is(tok::annot_template_id) &&
3397                "ParseOptionalCXXScopeSpecifier not working");
3398         AnnotateTemplateIdTokenAsType(SS, AllowImplicitTypename);
3399         continue;
3400       }
3401 
3402       if (TemplateId && TemplateId->Kind == TNK_Concept_template &&
3403           GetLookAheadToken(2).isOneOf(tok::kw_auto, tok::kw_decltype)) {
3404         DS.getTypeSpecScope() = SS;
3405         // This is a qualified placeholder-specifier, e.g., ::C<int> auto ...
3406         // Consume the scope annotation and continue to consume the template-id
3407         // as a placeholder-specifier.
3408         ConsumeAnnotationToken();
3409         continue;
3410       }
3411 
3412       if (Next.is(tok::annot_typename)) {
3413         DS.getTypeSpecScope() = SS;
3414         ConsumeAnnotationToken(); // The C++ scope.
3415         TypeResult T = getTypeAnnotation(Tok);
3416         isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename,
3417                                        Tok.getAnnotationEndLoc(),
3418                                        PrevSpec, DiagID, T, Policy);
3419         if (isInvalid)
3420           break;
3421         DS.SetRangeEnd(Tok.getAnnotationEndLoc());
3422         ConsumeAnnotationToken(); // The typename
3423       }
3424 
3425       if (AllowImplicitTypename == ImplicitTypenameContext::Yes &&
3426           Next.is(tok::annot_template_id) &&
3427           static_cast<TemplateIdAnnotation *>(Next.getAnnotationValue())
3428                   ->Kind == TNK_Dependent_template_name) {
3429         DS.getTypeSpecScope() = SS;
3430         ConsumeAnnotationToken(); // The C++ scope.
3431         AnnotateTemplateIdTokenAsType(SS, AllowImplicitTypename);
3432         continue;
3433       }
3434 
3435       if (Next.isNot(tok::identifier))
3436         goto DoneWithDeclSpec;
3437 
3438       // Check whether this is a constructor declaration. If we're in a
3439       // context where the identifier could be a class name, and it has the
3440       // shape of a constructor declaration, process it as one.
3441       if ((DSContext == DeclSpecContext::DSC_top_level ||
3442            DSContext == DeclSpecContext::DSC_class) &&
3443           Actions.isCurrentClassName(*Next.getIdentifierInfo(), getCurScope(),
3444                                      &SS) &&
3445           isConstructorDeclarator(/*Unqualified=*/false,
3446                                   /*DeductionGuide=*/false,
3447                                   DS.isFriendSpecified()))
3448         goto DoneWithDeclSpec;
3449 
3450       // C++20 [temp.spec] 13.9/6.
3451       // This disables the access checking rules for function template explicit
3452       // instantiation and explicit specialization:
3453       // - `return type`.
3454       SuppressAccessChecks SAC(*this, IsTemplateSpecOrInst);
3455 
3456       ParsedType TypeRep = Actions.getTypeName(
3457           *Next.getIdentifierInfo(), Next.getLocation(), getCurScope(), &SS,
3458           false, false, nullptr,
3459           /*IsCtorOrDtorName=*/false,
3460           /*WantNontrivialTypeSourceInfo=*/true,
3461           isClassTemplateDeductionContext(DSContext), AllowImplicitTypename);
3462 
3463       if (IsTemplateSpecOrInst)
3464         SAC.done();
3465 
3466       // If the referenced identifier is not a type, then this declspec is
3467       // erroneous: We already checked about that it has no type specifier, and
3468       // C++ doesn't have implicit int.  Diagnose it as a typo w.r.t. to the
3469       // typename.
3470       if (!TypeRep) {
3471         if (TryAnnotateTypeConstraint())
3472           goto DoneWithDeclSpec;
3473         if (Tok.isNot(tok::annot_cxxscope) ||
3474             NextToken().isNot(tok::identifier))
3475           continue;
3476         // Eat the scope spec so the identifier is current.
3477         ConsumeAnnotationToken();
3478         ParsedAttributes Attrs(AttrFactory);
3479         if (ParseImplicitInt(DS, &SS, TemplateInfo, AS, DSContext, Attrs)) {
3480           if (!Attrs.empty()) {
3481             AttrsLastTime = true;
3482             attrs.takeAllFrom(Attrs);
3483           }
3484           continue;
3485         }
3486         goto DoneWithDeclSpec;
3487       }
3488 
3489       DS.getTypeSpecScope() = SS;
3490       ConsumeAnnotationToken(); // The C++ scope.
3491 
3492       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec,
3493                                      DiagID, TypeRep, Policy);
3494       if (isInvalid)
3495         break;
3496 
3497       DS.SetRangeEnd(Tok.getLocation());
3498       ConsumeToken(); // The typename.
3499 
3500       continue;
3501     }
3502 
3503     case tok::annot_typename: {
3504       // If we've previously seen a tag definition, we were almost surely
3505       // missing a semicolon after it.
3506       if (DS.hasTypeSpecifier() && DS.hasTagDefinition())
3507         goto DoneWithDeclSpec;
3508 
3509       TypeResult T = getTypeAnnotation(Tok);
3510       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec,
3511                                      DiagID, T, Policy);
3512       if (isInvalid)
3513         break;
3514 
3515       DS.SetRangeEnd(Tok.getAnnotationEndLoc());
3516       ConsumeAnnotationToken(); // The typename
3517 
3518       continue;
3519     }
3520 
3521     case tok::kw___is_signed:
3522       // GNU libstdc++ 4.4 uses __is_signed as an identifier, but Clang
3523       // typically treats it as a trait. If we see __is_signed as it appears
3524       // in libstdc++, e.g.,
3525       //
3526       //   static const bool __is_signed;
3527       //
3528       // then treat __is_signed as an identifier rather than as a keyword.
3529       if (DS.getTypeSpecType() == TST_bool &&
3530           DS.getTypeQualifiers() == DeclSpec::TQ_const &&
3531           DS.getStorageClassSpec() == DeclSpec::SCS_static)
3532         TryKeywordIdentFallback(true);
3533 
3534       // We're done with the declaration-specifiers.
3535       goto DoneWithDeclSpec;
3536 
3537       // typedef-name
3538     case tok::kw___super:
3539     case tok::kw_decltype:
3540     case tok::identifier:
3541     ParseIdentifier: {
3542       // This identifier can only be a typedef name if we haven't already seen
3543       // a type-specifier.  Without this check we misparse:
3544       //  typedef int X; struct Y { short X; };  as 'short int'.
3545       if (DS.hasTypeSpecifier())
3546         goto DoneWithDeclSpec;
3547 
3548       // If the token is an identifier named "__declspec" and Microsoft
3549       // extensions are not enabled, it is likely that there will be cascading
3550       // parse errors if this really is a __declspec attribute. Attempt to
3551       // recognize that scenario and recover gracefully.
3552       if (!getLangOpts().DeclSpecKeyword && Tok.is(tok::identifier) &&
3553           Tok.getIdentifierInfo()->getName().equals("__declspec")) {
3554         Diag(Loc, diag::err_ms_attributes_not_enabled);
3555 
3556         // The next token should be an open paren. If it is, eat the entire
3557         // attribute declaration and continue.
3558         if (NextToken().is(tok::l_paren)) {
3559           // Consume the __declspec identifier.
3560           ConsumeToken();
3561 
3562           // Eat the parens and everything between them.
3563           BalancedDelimiterTracker T(*this, tok::l_paren);
3564           if (T.consumeOpen()) {
3565             assert(false && "Not a left paren?");
3566             return;
3567           }
3568           T.skipToEnd();
3569           continue;
3570         }
3571       }
3572 
3573       // In C++, check to see if this is a scope specifier like foo::bar::, if
3574       // so handle it as such.  This is important for ctor parsing.
3575       if (getLangOpts().CPlusPlus) {
3576         // C++20 [temp.spec] 13.9/6.
3577         // This disables the access checking rules for function template
3578         // explicit instantiation and explicit specialization:
3579         // - `return type`.
3580         SuppressAccessChecks SAC(*this, IsTemplateSpecOrInst);
3581 
3582         const bool Success = TryAnnotateCXXScopeToken(EnteringContext);
3583 
3584         if (IsTemplateSpecOrInst)
3585           SAC.done();
3586 
3587         if (Success) {
3588           if (IsTemplateSpecOrInst)
3589             SAC.redelay();
3590           DS.SetTypeSpecError();
3591           goto DoneWithDeclSpec;
3592         }
3593 
3594         if (!Tok.is(tok::identifier))
3595           continue;
3596       }
3597 
3598       // Check for need to substitute AltiVec keyword tokens.
3599       if (TryAltiVecToken(DS, Loc, PrevSpec, DiagID, isInvalid))
3600         break;
3601 
3602       // [AltiVec] 2.2: [If the 'vector' specifier is used] The syntax does not
3603       //                allow the use of a typedef name as a type specifier.
3604       if (DS.isTypeAltiVecVector())
3605         goto DoneWithDeclSpec;
3606 
3607       if (DSContext == DeclSpecContext::DSC_objc_method_result &&
3608           isObjCInstancetype()) {
3609         ParsedType TypeRep = Actions.ActOnObjCInstanceType(Loc);
3610         assert(TypeRep);
3611         isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec,
3612                                        DiagID, TypeRep, Policy);
3613         if (isInvalid)
3614           break;
3615 
3616         DS.SetRangeEnd(Loc);
3617         ConsumeToken();
3618         continue;
3619       }
3620 
3621       // If we're in a context where the identifier could be a class name,
3622       // check whether this is a constructor declaration.
3623       if (getLangOpts().CPlusPlus && DSContext == DeclSpecContext::DSC_class &&
3624           Actions.isCurrentClassName(*Tok.getIdentifierInfo(), getCurScope()) &&
3625           isConstructorDeclarator(/*Unqualified=*/true,
3626                                   /*DeductionGuide=*/false,
3627                                   DS.isFriendSpecified()))
3628         goto DoneWithDeclSpec;
3629 
3630       ParsedType TypeRep = Actions.getTypeName(
3631           *Tok.getIdentifierInfo(), Tok.getLocation(), getCurScope(), nullptr,
3632           false, false, nullptr, false, false,
3633           isClassTemplateDeductionContext(DSContext));
3634 
3635       // If this is not a typedef name, don't parse it as part of the declspec,
3636       // it must be an implicit int or an error.
3637       if (!TypeRep) {
3638         if (TryAnnotateTypeConstraint())
3639           goto DoneWithDeclSpec;
3640         if (Tok.isNot(tok::identifier))
3641           continue;
3642         ParsedAttributes Attrs(AttrFactory);
3643         if (ParseImplicitInt(DS, nullptr, TemplateInfo, AS, DSContext, Attrs)) {
3644           if (!Attrs.empty()) {
3645             AttrsLastTime = true;
3646             attrs.takeAllFrom(Attrs);
3647           }
3648           continue;
3649         }
3650         goto DoneWithDeclSpec;
3651       }
3652 
3653       // Likewise, if this is a context where the identifier could be a template
3654       // name, check whether this is a deduction guide declaration.
3655       if (getLangOpts().CPlusPlus17 &&
3656           (DSContext == DeclSpecContext::DSC_class ||
3657            DSContext == DeclSpecContext::DSC_top_level) &&
3658           Actions.isDeductionGuideName(getCurScope(), *Tok.getIdentifierInfo(),
3659                                        Tok.getLocation()) &&
3660           isConstructorDeclarator(/*Unqualified*/ true,
3661                                   /*DeductionGuide*/ true))
3662         goto DoneWithDeclSpec;
3663 
3664       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec,
3665                                      DiagID, TypeRep, Policy);
3666       if (isInvalid)
3667         break;
3668 
3669       DS.SetRangeEnd(Tok.getLocation());
3670       ConsumeToken(); // The identifier
3671 
3672       // Objective-C supports type arguments and protocol references
3673       // following an Objective-C object or object pointer
3674       // type. Handle either one of them.
3675       if (Tok.is(tok::less) && getLangOpts().ObjC) {
3676         SourceLocation NewEndLoc;
3677         TypeResult NewTypeRep = parseObjCTypeArgsAndProtocolQualifiers(
3678                                   Loc, TypeRep, /*consumeLastToken=*/true,
3679                                   NewEndLoc);
3680         if (NewTypeRep.isUsable()) {
3681           DS.UpdateTypeRep(NewTypeRep.get());
3682           DS.SetRangeEnd(NewEndLoc);
3683         }
3684       }
3685 
3686       // Need to support trailing type qualifiers (e.g. "id<p> const").
3687       // If a type specifier follows, it will be diagnosed elsewhere.
3688       continue;
3689     }
3690 
3691       // type-name or placeholder-specifier
3692     case tok::annot_template_id: {
3693       TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
3694 
3695       if (TemplateId->hasInvalidName()) {
3696         DS.SetTypeSpecError();
3697         break;
3698       }
3699 
3700       if (TemplateId->Kind == TNK_Concept_template) {
3701         // If we've already diagnosed that this type-constraint has invalid
3702         // arguments, drop it and just form 'auto' or 'decltype(auto)'.
3703         if (TemplateId->hasInvalidArgs())
3704           TemplateId = nullptr;
3705 
3706         // Any of the following tokens are likely the start of the user
3707         // forgetting 'auto' or 'decltype(auto)', so diagnose.
3708         // Note: if updating this list, please make sure we update
3709         // isCXXDeclarationSpecifier's check for IsPlaceholderSpecifier to have
3710         // a matching list.
3711         if (NextToken().isOneOf(tok::identifier, tok::kw_const,
3712                                 tok::kw_volatile, tok::kw_restrict, tok::amp,
3713                                 tok::ampamp)) {
3714           Diag(Loc, diag::err_placeholder_expected_auto_or_decltype_auto)
3715               << FixItHint::CreateInsertion(NextToken().getLocation(), "auto");
3716           // Attempt to continue as if 'auto' was placed here.
3717           isInvalid = DS.SetTypeSpecType(TST_auto, Loc, PrevSpec, DiagID,
3718                                          TemplateId, Policy);
3719           break;
3720         }
3721         if (!NextToken().isOneOf(tok::kw_auto, tok::kw_decltype))
3722             goto DoneWithDeclSpec;
3723         ConsumeAnnotationToken();
3724         SourceLocation AutoLoc = Tok.getLocation();
3725         if (TryConsumeToken(tok::kw_decltype)) {
3726           BalancedDelimiterTracker Tracker(*this, tok::l_paren);
3727           if (Tracker.consumeOpen()) {
3728             // Something like `void foo(Iterator decltype i)`
3729             Diag(Tok, diag::err_expected) << tok::l_paren;
3730           } else {
3731             if (!TryConsumeToken(tok::kw_auto)) {
3732               // Something like `void foo(Iterator decltype(int) i)`
3733               Tracker.skipToEnd();
3734               Diag(Tok, diag::err_placeholder_expected_auto_or_decltype_auto)
3735                 << FixItHint::CreateReplacement(SourceRange(AutoLoc,
3736                                                             Tok.getLocation()),
3737                                                 "auto");
3738             } else {
3739               Tracker.consumeClose();
3740             }
3741           }
3742           ConsumedEnd = Tok.getLocation();
3743           DS.setTypeArgumentRange(Tracker.getRange());
3744           // Even if something went wrong above, continue as if we've seen
3745           // `decltype(auto)`.
3746           isInvalid = DS.SetTypeSpecType(TST_decltype_auto, Loc, PrevSpec,
3747                                          DiagID, TemplateId, Policy);
3748         } else {
3749           isInvalid = DS.SetTypeSpecType(TST_auto, AutoLoc, PrevSpec, DiagID,
3750                                          TemplateId, Policy);
3751         }
3752         break;
3753       }
3754 
3755       if (TemplateId->Kind != TNK_Type_template &&
3756           TemplateId->Kind != TNK_Undeclared_template) {
3757         // This template-id does not refer to a type name, so we're
3758         // done with the type-specifiers.
3759         goto DoneWithDeclSpec;
3760       }
3761 
3762       // If we're in a context where the template-id could be a
3763       // constructor name or specialization, check whether this is a
3764       // constructor declaration.
3765       if (getLangOpts().CPlusPlus && DSContext == DeclSpecContext::DSC_class &&
3766           Actions.isCurrentClassName(*TemplateId->Name, getCurScope()) &&
3767           isConstructorDeclarator(/*Unqualified=*/true,
3768                                   /*DeductionGuide=*/false,
3769                                   DS.isFriendSpecified()))
3770         goto DoneWithDeclSpec;
3771 
3772       // Turn the template-id annotation token into a type annotation
3773       // token, then try again to parse it as a type-specifier.
3774       CXXScopeSpec SS;
3775       AnnotateTemplateIdTokenAsType(SS, AllowImplicitTypename);
3776       continue;
3777     }
3778 
3779     // Attributes support.
3780     case tok::kw___attribute:
3781     case tok::kw___declspec:
3782       ParseAttributes(PAKM_GNU | PAKM_Declspec, DS.getAttributes(), LateAttrs);
3783       continue;
3784 
3785     // Microsoft single token adornments.
3786     case tok::kw___forceinline: {
3787       isInvalid = DS.setFunctionSpecForceInline(Loc, PrevSpec, DiagID);
3788       IdentifierInfo *AttrName = Tok.getIdentifierInfo();
3789       SourceLocation AttrNameLoc = Tok.getLocation();
3790       DS.getAttributes().addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc,
3791                                 nullptr, 0, ParsedAttr::AS_Keyword);
3792       break;
3793     }
3794 
3795     case tok::kw___unaligned:
3796       isInvalid = DS.SetTypeQual(DeclSpec::TQ_unaligned, Loc, PrevSpec, DiagID,
3797                                  getLangOpts());
3798       break;
3799 
3800     case tok::kw___sptr:
3801     case tok::kw___uptr:
3802     case tok::kw___ptr64:
3803     case tok::kw___ptr32:
3804     case tok::kw___w64:
3805     case tok::kw___cdecl:
3806     case tok::kw___stdcall:
3807     case tok::kw___fastcall:
3808     case tok::kw___thiscall:
3809     case tok::kw___regcall:
3810     case tok::kw___vectorcall:
3811       ParseMicrosoftTypeAttributes(DS.getAttributes());
3812       continue;
3813 
3814     // Borland single token adornments.
3815     case tok::kw___pascal:
3816       ParseBorlandTypeAttributes(DS.getAttributes());
3817       continue;
3818 
3819     // OpenCL single token adornments.
3820     case tok::kw___kernel:
3821       ParseOpenCLKernelAttributes(DS.getAttributes());
3822       continue;
3823 
3824     // CUDA/HIP single token adornments.
3825     case tok::kw___noinline__:
3826       ParseCUDAFunctionAttributes(DS.getAttributes());
3827       continue;
3828 
3829     // Nullability type specifiers.
3830     case tok::kw__Nonnull:
3831     case tok::kw__Nullable:
3832     case tok::kw__Nullable_result:
3833     case tok::kw__Null_unspecified:
3834       ParseNullabilityTypeSpecifiers(DS.getAttributes());
3835       continue;
3836 
3837     // Objective-C 'kindof' types.
3838     case tok::kw___kindof:
3839       DS.getAttributes().addNew(Tok.getIdentifierInfo(), Loc, nullptr, Loc,
3840                                 nullptr, 0, ParsedAttr::AS_Keyword);
3841       (void)ConsumeToken();
3842       continue;
3843 
3844     // storage-class-specifier
3845     case tok::kw_typedef:
3846       isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_typedef, Loc,
3847                                          PrevSpec, DiagID, Policy);
3848       isStorageClass = true;
3849       break;
3850     case tok::kw_extern:
3851       if (DS.getThreadStorageClassSpec() == DeclSpec::TSCS___thread)
3852         Diag(Tok, diag::ext_thread_before) << "extern";
3853       isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_extern, Loc,
3854                                          PrevSpec, DiagID, Policy);
3855       isStorageClass = true;
3856       break;
3857     case tok::kw___private_extern__:
3858       isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_private_extern,
3859                                          Loc, PrevSpec, DiagID, Policy);
3860       isStorageClass = true;
3861       break;
3862     case tok::kw_static:
3863       if (DS.getThreadStorageClassSpec() == DeclSpec::TSCS___thread)
3864         Diag(Tok, diag::ext_thread_before) << "static";
3865       isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_static, Loc,
3866                                          PrevSpec, DiagID, Policy);
3867       isStorageClass = true;
3868       break;
3869     case tok::kw_auto:
3870       if (getLangOpts().CPlusPlus11) {
3871         if (isKnownToBeTypeSpecifier(GetLookAheadToken(1))) {
3872           isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_auto, Loc,
3873                                              PrevSpec, DiagID, Policy);
3874           if (!isInvalid)
3875             Diag(Tok, diag::ext_auto_storage_class)
3876               << FixItHint::CreateRemoval(DS.getStorageClassSpecLoc());
3877         } else
3878           isInvalid = DS.SetTypeSpecType(DeclSpec::TST_auto, Loc, PrevSpec,
3879                                          DiagID, Policy);
3880       } else
3881         isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_auto, Loc,
3882                                            PrevSpec, DiagID, Policy);
3883       isStorageClass = true;
3884       break;
3885     case tok::kw___auto_type:
3886       Diag(Tok, diag::ext_auto_type);
3887       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_auto_type, Loc, PrevSpec,
3888                                      DiagID, Policy);
3889       break;
3890     case tok::kw_register:
3891       isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_register, Loc,
3892                                          PrevSpec, DiagID, Policy);
3893       isStorageClass = true;
3894       break;
3895     case tok::kw_mutable:
3896       isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_mutable, Loc,
3897                                          PrevSpec, DiagID, Policy);
3898       isStorageClass = true;
3899       break;
3900     case tok::kw___thread:
3901       isInvalid = DS.SetStorageClassSpecThread(DeclSpec::TSCS___thread, Loc,
3902                                                PrevSpec, DiagID);
3903       isStorageClass = true;
3904       break;
3905     case tok::kw_thread_local:
3906       isInvalid = DS.SetStorageClassSpecThread(DeclSpec::TSCS_thread_local, Loc,
3907                                                PrevSpec, DiagID);
3908       isStorageClass = true;
3909       break;
3910     case tok::kw__Thread_local:
3911       if (!getLangOpts().C11)
3912         Diag(Tok, diag::ext_c11_feature) << Tok.getName();
3913       isInvalid = DS.SetStorageClassSpecThread(DeclSpec::TSCS__Thread_local,
3914                                                Loc, PrevSpec, DiagID);
3915       isStorageClass = true;
3916       break;
3917 
3918     // function-specifier
3919     case tok::kw_inline:
3920       isInvalid = DS.setFunctionSpecInline(Loc, PrevSpec, DiagID);
3921       break;
3922     case tok::kw_virtual:
3923       // C++ for OpenCL does not allow virtual function qualifier, to avoid
3924       // function pointers restricted in OpenCL v2.0 s6.9.a.
3925       if (getLangOpts().OpenCLCPlusPlus &&
3926           !getActions().getOpenCLOptions().isAvailableOption(
3927               "__cl_clang_function_pointers", getLangOpts())) {
3928         DiagID = diag::err_openclcxx_virtual_function;
3929         PrevSpec = Tok.getIdentifierInfo()->getNameStart();
3930         isInvalid = true;
3931       } else {
3932         isInvalid = DS.setFunctionSpecVirtual(Loc, PrevSpec, DiagID);
3933       }
3934       break;
3935     case tok::kw_explicit: {
3936       SourceLocation ExplicitLoc = Loc;
3937       SourceLocation CloseParenLoc;
3938       ExplicitSpecifier ExplicitSpec(nullptr, ExplicitSpecKind::ResolvedTrue);
3939       ConsumedEnd = ExplicitLoc;
3940       ConsumeToken(); // kw_explicit
3941       if (Tok.is(tok::l_paren)) {
3942         if (getLangOpts().CPlusPlus20 || isExplicitBool() == TPResult::True) {
3943           Diag(Tok.getLocation(), getLangOpts().CPlusPlus20
3944                                       ? diag::warn_cxx17_compat_explicit_bool
3945                                       : diag::ext_explicit_bool);
3946 
3947           ExprResult ExplicitExpr(static_cast<Expr *>(nullptr));
3948           BalancedDelimiterTracker Tracker(*this, tok::l_paren);
3949           Tracker.consumeOpen();
3950           ExplicitExpr = ParseConstantExpression();
3951           ConsumedEnd = Tok.getLocation();
3952           if (ExplicitExpr.isUsable()) {
3953             CloseParenLoc = Tok.getLocation();
3954             Tracker.consumeClose();
3955             ExplicitSpec =
3956                 Actions.ActOnExplicitBoolSpecifier(ExplicitExpr.get());
3957           } else
3958             Tracker.skipToEnd();
3959         } else {
3960           Diag(Tok.getLocation(), diag::warn_cxx20_compat_explicit_bool);
3961         }
3962       }
3963       isInvalid = DS.setFunctionSpecExplicit(ExplicitLoc, PrevSpec, DiagID,
3964                                              ExplicitSpec, CloseParenLoc);
3965       break;
3966     }
3967     case tok::kw__Noreturn:
3968       if (!getLangOpts().C11)
3969         Diag(Tok, diag::ext_c11_feature) << Tok.getName();
3970       isInvalid = DS.setFunctionSpecNoreturn(Loc, PrevSpec, DiagID);
3971       break;
3972 
3973     // alignment-specifier
3974     case tok::kw__Alignas:
3975       if (!getLangOpts().C11)
3976         Diag(Tok, diag::ext_c11_feature) << Tok.getName();
3977       ParseAlignmentSpecifier(DS.getAttributes());
3978       continue;
3979 
3980     // friend
3981     case tok::kw_friend:
3982       if (DSContext == DeclSpecContext::DSC_class)
3983         isInvalid = DS.SetFriendSpec(Loc, PrevSpec, DiagID);
3984       else {
3985         PrevSpec = ""; // not actually used by the diagnostic
3986         DiagID = diag::err_friend_invalid_in_context;
3987         isInvalid = true;
3988       }
3989       break;
3990 
3991     // Modules
3992     case tok::kw___module_private__:
3993       isInvalid = DS.setModulePrivateSpec(Loc, PrevSpec, DiagID);
3994       break;
3995 
3996     // constexpr, consteval, constinit specifiers
3997     case tok::kw_constexpr:
3998       isInvalid = DS.SetConstexprSpec(ConstexprSpecKind::Constexpr, Loc,
3999                                       PrevSpec, DiagID);
4000       break;
4001     case tok::kw_consteval:
4002       isInvalid = DS.SetConstexprSpec(ConstexprSpecKind::Consteval, Loc,
4003                                       PrevSpec, DiagID);
4004       break;
4005     case tok::kw_constinit:
4006       isInvalid = DS.SetConstexprSpec(ConstexprSpecKind::Constinit, Loc,
4007                                       PrevSpec, DiagID);
4008       break;
4009 
4010     // type-specifier
4011     case tok::kw_short:
4012       isInvalid = DS.SetTypeSpecWidth(TypeSpecifierWidth::Short, Loc, PrevSpec,
4013                                       DiagID, Policy);
4014       break;
4015     case tok::kw_long:
4016       if (DS.getTypeSpecWidth() != TypeSpecifierWidth::Long)
4017         isInvalid = DS.SetTypeSpecWidth(TypeSpecifierWidth::Long, Loc, PrevSpec,
4018                                         DiagID, Policy);
4019       else
4020         isInvalid = DS.SetTypeSpecWidth(TypeSpecifierWidth::LongLong, Loc,
4021                                         PrevSpec, DiagID, Policy);
4022       break;
4023     case tok::kw___int64:
4024       isInvalid = DS.SetTypeSpecWidth(TypeSpecifierWidth::LongLong, Loc,
4025                                       PrevSpec, DiagID, Policy);
4026       break;
4027     case tok::kw_signed:
4028       isInvalid =
4029           DS.SetTypeSpecSign(TypeSpecifierSign::Signed, Loc, PrevSpec, DiagID);
4030       break;
4031     case tok::kw_unsigned:
4032       isInvalid = DS.SetTypeSpecSign(TypeSpecifierSign::Unsigned, Loc, PrevSpec,
4033                                      DiagID);
4034       break;
4035     case tok::kw__Complex:
4036       if (!getLangOpts().C99)
4037         Diag(Tok, diag::ext_c99_feature) << Tok.getName();
4038       isInvalid = DS.SetTypeSpecComplex(DeclSpec::TSC_complex, Loc, PrevSpec,
4039                                         DiagID);
4040       break;
4041     case tok::kw__Imaginary:
4042       if (!getLangOpts().C99)
4043         Diag(Tok, diag::ext_c99_feature) << Tok.getName();
4044       isInvalid = DS.SetTypeSpecComplex(DeclSpec::TSC_imaginary, Loc, PrevSpec,
4045                                         DiagID);
4046       break;
4047     case tok::kw_void:
4048       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_void, Loc, PrevSpec,
4049                                      DiagID, Policy);
4050       break;
4051     case tok::kw_char:
4052       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_char, Loc, PrevSpec,
4053                                      DiagID, Policy);
4054       break;
4055     case tok::kw_int:
4056       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_int, Loc, PrevSpec,
4057                                      DiagID, Policy);
4058       break;
4059     case tok::kw__ExtInt:
4060     case tok::kw__BitInt: {
4061       DiagnoseBitIntUse(Tok);
4062       ExprResult ER = ParseExtIntegerArgument();
4063       if (ER.isInvalid())
4064         continue;
4065       isInvalid = DS.SetBitIntType(Loc, ER.get(), PrevSpec, DiagID, Policy);
4066       ConsumedEnd = PrevTokLocation;
4067       break;
4068     }
4069     case tok::kw___int128:
4070       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_int128, Loc, PrevSpec,
4071                                      DiagID, Policy);
4072       break;
4073     case tok::kw_half:
4074       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_half, Loc, PrevSpec,
4075                                      DiagID, Policy);
4076       break;
4077     case tok::kw___bf16:
4078       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_BFloat16, Loc, PrevSpec,
4079                                      DiagID, Policy);
4080       break;
4081     case tok::kw_float:
4082       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_float, Loc, PrevSpec,
4083                                      DiagID, Policy);
4084       break;
4085     case tok::kw_double:
4086       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_double, Loc, PrevSpec,
4087                                      DiagID, Policy);
4088       break;
4089     case tok::kw__Float16:
4090       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_float16, Loc, PrevSpec,
4091                                      DiagID, Policy);
4092       break;
4093     case tok::kw__Accum:
4094       if (!getLangOpts().FixedPoint) {
4095         SetupFixedPointError(getLangOpts(), PrevSpec, DiagID, isInvalid);
4096       } else {
4097         isInvalid = DS.SetTypeSpecType(DeclSpec::TST_accum, Loc, PrevSpec,
4098                                        DiagID, Policy);
4099       }
4100       break;
4101     case tok::kw__Fract:
4102       if (!getLangOpts().FixedPoint) {
4103         SetupFixedPointError(getLangOpts(), PrevSpec, DiagID, isInvalid);
4104       } else {
4105         isInvalid = DS.SetTypeSpecType(DeclSpec::TST_fract, Loc, PrevSpec,
4106                                        DiagID, Policy);
4107       }
4108       break;
4109     case tok::kw__Sat:
4110       if (!getLangOpts().FixedPoint) {
4111         SetupFixedPointError(getLangOpts(), PrevSpec, DiagID, isInvalid);
4112       } else {
4113         isInvalid = DS.SetTypeSpecSat(Loc, PrevSpec, DiagID);
4114       }
4115       break;
4116     case tok::kw___float128:
4117       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_float128, Loc, PrevSpec,
4118                                      DiagID, Policy);
4119       break;
4120     case tok::kw___ibm128:
4121       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_ibm128, Loc, PrevSpec,
4122                                      DiagID, Policy);
4123       break;
4124     case tok::kw_wchar_t:
4125       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_wchar, Loc, PrevSpec,
4126                                      DiagID, Policy);
4127       break;
4128     case tok::kw_char8_t:
4129       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_char8, Loc, PrevSpec,
4130                                      DiagID, Policy);
4131       break;
4132     case tok::kw_char16_t:
4133       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_char16, Loc, PrevSpec,
4134                                      DiagID, Policy);
4135       break;
4136     case tok::kw_char32_t:
4137       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_char32, Loc, PrevSpec,
4138                                      DiagID, Policy);
4139       break;
4140     case tok::kw_bool:
4141     case tok::kw__Bool:
4142       if (Tok.is(tok::kw__Bool) && !getLangOpts().C99)
4143         Diag(Tok, diag::ext_c99_feature) << Tok.getName();
4144 
4145       if (Tok.is(tok::kw_bool) &&
4146           DS.getTypeSpecType() != DeclSpec::TST_unspecified &&
4147           DS.getStorageClassSpec() == DeclSpec::SCS_typedef) {
4148         PrevSpec = ""; // Not used by the diagnostic.
4149         DiagID = diag::err_bool_redeclaration;
4150         // For better error recovery.
4151         Tok.setKind(tok::identifier);
4152         isInvalid = true;
4153       } else {
4154         isInvalid = DS.SetTypeSpecType(DeclSpec::TST_bool, Loc, PrevSpec,
4155                                        DiagID, Policy);
4156       }
4157       break;
4158     case tok::kw__Decimal32:
4159       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_decimal32, Loc, PrevSpec,
4160                                      DiagID, Policy);
4161       break;
4162     case tok::kw__Decimal64:
4163       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_decimal64, Loc, PrevSpec,
4164                                      DiagID, Policy);
4165       break;
4166     case tok::kw__Decimal128:
4167       isInvalid = DS.SetTypeSpecType(DeclSpec::TST_decimal128, Loc, PrevSpec,
4168                                      DiagID, Policy);
4169       break;
4170     case tok::kw___vector:
4171       isInvalid = DS.SetTypeAltiVecVector(true, Loc, PrevSpec, DiagID, Policy);
4172       break;
4173     case tok::kw___pixel:
4174       isInvalid = DS.SetTypeAltiVecPixel(true, Loc, PrevSpec, DiagID, Policy);
4175       break;
4176     case tok::kw___bool:
4177       isInvalid = DS.SetTypeAltiVecBool(true, Loc, PrevSpec, DiagID, Policy);
4178       break;
4179     case tok::kw_pipe:
4180       if (!getLangOpts().OpenCL ||
4181           getLangOpts().getOpenCLCompatibleVersion() < 200) {
4182         // OpenCL 2.0 and later define this keyword. OpenCL 1.2 and earlier
4183         // should support the "pipe" word as identifier.
4184         Tok.getIdentifierInfo()->revertTokenIDToIdentifier();
4185         Tok.setKind(tok::identifier);
4186         goto DoneWithDeclSpec;
4187       } else if (!getLangOpts().OpenCLPipes) {
4188         DiagID = diag::err_opencl_unknown_type_specifier;
4189         PrevSpec = Tok.getIdentifierInfo()->getNameStart();
4190         isInvalid = true;
4191       } else
4192         isInvalid = DS.SetTypePipe(true, Loc, PrevSpec, DiagID, Policy);
4193       break;
4194 // We only need to enumerate each image type once.
4195 #define IMAGE_READ_WRITE_TYPE(Type, Id, Ext)
4196 #define IMAGE_WRITE_TYPE(Type, Id, Ext)
4197 #define IMAGE_READ_TYPE(ImgType, Id, Ext) \
4198     case tok::kw_##ImgType##_t: \
4199       if (!handleOpenCLImageKW(Ext, DeclSpec::TST_##ImgType##_t)) \
4200         goto DoneWithDeclSpec; \
4201       break;
4202 #include "clang/Basic/OpenCLImageTypes.def"
4203     case tok::kw___unknown_anytype:
4204       isInvalid = DS.SetTypeSpecType(TST_unknown_anytype, Loc,
4205                                      PrevSpec, DiagID, Policy);
4206       break;
4207 
4208     // class-specifier:
4209     case tok::kw_class:
4210     case tok::kw_struct:
4211     case tok::kw___interface:
4212     case tok::kw_union: {
4213       tok::TokenKind Kind = Tok.getKind();
4214       ConsumeToken();
4215 
4216       // These are attributes following class specifiers.
4217       // To produce better diagnostic, we parse them when
4218       // parsing class specifier.
4219       ParsedAttributes Attributes(AttrFactory);
4220       ParseClassSpecifier(Kind, Loc, DS, TemplateInfo, AS,
4221                           EnteringContext, DSContext, Attributes);
4222 
4223       // If there are attributes following class specifier,
4224       // take them over and handle them here.
4225       if (!Attributes.empty()) {
4226         AttrsLastTime = true;
4227         attrs.takeAllFrom(Attributes);
4228       }
4229       continue;
4230     }
4231 
4232     // enum-specifier:
4233     case tok::kw_enum:
4234       ConsumeToken();
4235       ParseEnumSpecifier(Loc, DS, TemplateInfo, AS, DSContext);
4236       continue;
4237 
4238     // cv-qualifier:
4239     case tok::kw_const:
4240       isInvalid = DS.SetTypeQual(DeclSpec::TQ_const, Loc, PrevSpec, DiagID,
4241                                  getLangOpts());
4242       break;
4243     case tok::kw_volatile:
4244       isInvalid = DS.SetTypeQual(DeclSpec::TQ_volatile, Loc, PrevSpec, DiagID,
4245                                  getLangOpts());
4246       break;
4247     case tok::kw_restrict:
4248       isInvalid = DS.SetTypeQual(DeclSpec::TQ_restrict, Loc, PrevSpec, DiagID,
4249                                  getLangOpts());
4250       break;
4251 
4252     // C++ typename-specifier:
4253     case tok::kw_typename:
4254       if (TryAnnotateTypeOrScopeToken()) {
4255         DS.SetTypeSpecError();
4256         goto DoneWithDeclSpec;
4257       }
4258       if (!Tok.is(tok::kw_typename))
4259         continue;
4260       break;
4261 
4262     // C2x/GNU typeof support.
4263     case tok::kw_typeof:
4264     case tok::kw_typeof_unqual:
4265       ParseTypeofSpecifier(DS);
4266       continue;
4267 
4268     case tok::annot_decltype:
4269       ParseDecltypeSpecifier(DS);
4270       continue;
4271 
4272     case tok::annot_pragma_pack:
4273       HandlePragmaPack();
4274       continue;
4275 
4276     case tok::annot_pragma_ms_pragma:
4277       HandlePragmaMSPragma();
4278       continue;
4279 
4280     case tok::annot_pragma_ms_vtordisp:
4281       HandlePragmaMSVtorDisp();
4282       continue;
4283 
4284     case tok::annot_pragma_ms_pointers_to_members:
4285       HandlePragmaMSPointersToMembers();
4286       continue;
4287 
4288 #define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait:
4289 #include "clang/Basic/TransformTypeTraits.def"
4290       // HACK: libstdc++ already uses '__remove_cv' as an alias template so we
4291       // work around this by expecting all transform type traits to be suffixed
4292       // with '('. They're an identifier otherwise.
4293       if (!MaybeParseTypeTransformTypeSpecifier(DS))
4294         goto ParseIdentifier;
4295       continue;
4296 
4297     case tok::kw__Atomic:
4298       // C11 6.7.2.4/4:
4299       //   If the _Atomic keyword is immediately followed by a left parenthesis,
4300       //   it is interpreted as a type specifier (with a type name), not as a
4301       //   type qualifier.
4302       if (!getLangOpts().C11)
4303         Diag(Tok, diag::ext_c11_feature) << Tok.getName();
4304 
4305       if (NextToken().is(tok::l_paren)) {
4306         ParseAtomicSpecifier(DS);
4307         continue;
4308       }
4309       isInvalid = DS.SetTypeQual(DeclSpec::TQ_atomic, Loc, PrevSpec, DiagID,
4310                                  getLangOpts());
4311       break;
4312 
4313     // OpenCL address space qualifiers:
4314     case tok::kw___generic:
4315       // generic address space is introduced only in OpenCL v2.0
4316       // see OpenCL C Spec v2.0 s6.5.5
4317       // OpenCL v3.0 introduces __opencl_c_generic_address_space
4318       // feature macro to indicate if generic address space is supported
4319       if (!Actions.getLangOpts().OpenCLGenericAddressSpace) {
4320         DiagID = diag::err_opencl_unknown_type_specifier;
4321         PrevSpec = Tok.getIdentifierInfo()->getNameStart();
4322         isInvalid = true;
4323         break;
4324       }
4325       [[fallthrough]];
4326     case tok::kw_private:
4327       // It's fine (but redundant) to check this for __generic on the
4328       // fallthrough path; we only form the __generic token in OpenCL mode.
4329       if (!getLangOpts().OpenCL)
4330         goto DoneWithDeclSpec;
4331       [[fallthrough]];
4332     case tok::kw___private:
4333     case tok::kw___global:
4334     case tok::kw___local:
4335     case tok::kw___constant:
4336     // OpenCL access qualifiers:
4337     case tok::kw___read_only:
4338     case tok::kw___write_only:
4339     case tok::kw___read_write:
4340       ParseOpenCLQualifiers(DS.getAttributes());
4341       break;
4342 
4343     case tok::kw_groupshared:
4344       // NOTE: ParseHLSLQualifiers will consume the qualifier token.
4345       ParseHLSLQualifiers(DS.getAttributes());
4346       continue;
4347 
4348     case tok::less:
4349       // GCC ObjC supports types like "<SomeProtocol>" as a synonym for
4350       // "id<SomeProtocol>".  This is hopelessly old fashioned and dangerous,
4351       // but we support it.
4352       if (DS.hasTypeSpecifier() || !getLangOpts().ObjC)
4353         goto DoneWithDeclSpec;
4354 
4355       SourceLocation StartLoc = Tok.getLocation();
4356       SourceLocation EndLoc;
4357       TypeResult Type = parseObjCProtocolQualifierType(EndLoc);
4358       if (Type.isUsable()) {
4359         if (DS.SetTypeSpecType(DeclSpec::TST_typename, StartLoc, StartLoc,
4360                                PrevSpec, DiagID, Type.get(),
4361                                Actions.getASTContext().getPrintingPolicy()))
4362           Diag(StartLoc, DiagID) << PrevSpec;
4363 
4364         DS.SetRangeEnd(EndLoc);
4365       } else {
4366         DS.SetTypeSpecError();
4367       }
4368 
4369       // Need to support trailing type qualifiers (e.g. "id<p> const").
4370       // If a type specifier follows, it will be diagnosed elsewhere.
4371       continue;
4372     }
4373 
4374     DS.SetRangeEnd(ConsumedEnd.isValid() ? ConsumedEnd : Tok.getLocation());
4375 
4376     // If the specifier wasn't legal, issue a diagnostic.
4377     if (isInvalid) {
4378       assert(PrevSpec && "Method did not return previous specifier!");
4379       assert(DiagID);
4380 
4381       if (DiagID == diag::ext_duplicate_declspec ||
4382           DiagID == diag::ext_warn_duplicate_declspec ||
4383           DiagID == diag::err_duplicate_declspec)
4384         Diag(Loc, DiagID) << PrevSpec
4385                           << FixItHint::CreateRemoval(
4386                                  SourceRange(Loc, DS.getEndLoc()));
4387       else if (DiagID == diag::err_opencl_unknown_type_specifier) {
4388         Diag(Loc, DiagID) << getLangOpts().getOpenCLVersionString() << PrevSpec
4389                           << isStorageClass;
4390       } else
4391         Diag(Loc, DiagID) << PrevSpec;
4392     }
4393 
4394     if (DiagID != diag::err_bool_redeclaration && ConsumedEnd.isInvalid())
4395       // After an error the next token can be an annotation token.
4396       ConsumeAnyToken();
4397 
4398     AttrsLastTime = false;
4399   }
4400 }
4401 
4402 /// ParseStructDeclaration - Parse a struct declaration without the terminating
4403 /// semicolon.
4404 ///
4405 /// Note that a struct declaration refers to a declaration in a struct,
4406 /// not to the declaration of a struct.
4407 ///
4408 ///       struct-declaration:
4409 /// [C2x]   attributes-specifier-seq[opt]
4410 ///           specifier-qualifier-list struct-declarator-list
4411 /// [GNU]   __extension__ struct-declaration
4412 /// [GNU]   specifier-qualifier-list
4413 ///       struct-declarator-list:
4414 ///         struct-declarator
4415 ///         struct-declarator-list ',' struct-declarator
4416 /// [GNU]   struct-declarator-list ',' attributes[opt] struct-declarator
4417 ///       struct-declarator:
4418 ///         declarator
4419 /// [GNU]   declarator attributes[opt]
4420 ///         declarator[opt] ':' constant-expression
4421 /// [GNU]   declarator[opt] ':' constant-expression attributes[opt]
4422 ///
ParseStructDeclaration(ParsingDeclSpec & DS,llvm::function_ref<void (ParsingFieldDeclarator &)> FieldsCallback)4423 void Parser::ParseStructDeclaration(
4424     ParsingDeclSpec &DS,
4425     llvm::function_ref<void(ParsingFieldDeclarator &)> FieldsCallback) {
4426 
4427   if (Tok.is(tok::kw___extension__)) {
4428     // __extension__ silences extension warnings in the subexpression.
4429     ExtensionRAIIObject O(Diags);  // Use RAII to do this.
4430     ConsumeToken();
4431     return ParseStructDeclaration(DS, FieldsCallback);
4432   }
4433 
4434   // Parse leading attributes.
4435   ParsedAttributes Attrs(AttrFactory);
4436   MaybeParseCXX11Attributes(Attrs);
4437 
4438   // Parse the common specifier-qualifiers-list piece.
4439   ParseSpecifierQualifierList(DS);
4440 
4441   // If there are no declarators, this is a free-standing declaration
4442   // specifier. Let the actions module cope with it.
4443   if (Tok.is(tok::semi)) {
4444     // C2x 6.7.2.1p9 : "The optional attribute specifier sequence in a
4445     // member declaration appertains to each of the members declared by the
4446     // member declarator list; it shall not appear if the optional member
4447     // declarator list is omitted."
4448     ProhibitAttributes(Attrs);
4449     RecordDecl *AnonRecord = nullptr;
4450     Decl *TheDecl = Actions.ParsedFreeStandingDeclSpec(
4451         getCurScope(), AS_none, DS, ParsedAttributesView::none(), AnonRecord);
4452     assert(!AnonRecord && "Did not expect anonymous struct or union here");
4453     DS.complete(TheDecl);
4454     return;
4455   }
4456 
4457   // Read struct-declarators until we find the semicolon.
4458   bool FirstDeclarator = true;
4459   SourceLocation CommaLoc;
4460   while (true) {
4461     ParsingFieldDeclarator DeclaratorInfo(*this, DS, Attrs);
4462     DeclaratorInfo.D.setCommaLoc(CommaLoc);
4463 
4464     // Attributes are only allowed here on successive declarators.
4465     if (!FirstDeclarator) {
4466       // However, this does not apply for [[]] attributes (which could show up
4467       // before or after the __attribute__ attributes).
4468       DiagnoseAndSkipCXX11Attributes();
4469       MaybeParseGNUAttributes(DeclaratorInfo.D);
4470       DiagnoseAndSkipCXX11Attributes();
4471     }
4472 
4473     /// struct-declarator: declarator
4474     /// struct-declarator: declarator[opt] ':' constant-expression
4475     if (Tok.isNot(tok::colon)) {
4476       // Don't parse FOO:BAR as if it were a typo for FOO::BAR.
4477       ColonProtectionRAIIObject X(*this);
4478       ParseDeclarator(DeclaratorInfo.D);
4479     } else
4480       DeclaratorInfo.D.SetIdentifier(nullptr, Tok.getLocation());
4481 
4482     if (TryConsumeToken(tok::colon)) {
4483       ExprResult Res(ParseConstantExpression());
4484       if (Res.isInvalid())
4485         SkipUntil(tok::semi, StopBeforeMatch);
4486       else
4487         DeclaratorInfo.BitfieldSize = Res.get();
4488     }
4489 
4490     // If attributes exist after the declarator, parse them.
4491     MaybeParseGNUAttributes(DeclaratorInfo.D);
4492 
4493     // We're done with this declarator;  invoke the callback.
4494     FieldsCallback(DeclaratorInfo);
4495 
4496     // If we don't have a comma, it is either the end of the list (a ';')
4497     // or an error, bail out.
4498     if (!TryConsumeToken(tok::comma, CommaLoc))
4499       return;
4500 
4501     FirstDeclarator = false;
4502   }
4503 }
4504 
4505 /// ParseStructUnionBody
4506 ///       struct-contents:
4507 ///         struct-declaration-list
4508 /// [EXT]   empty
4509 /// [GNU]   "struct-declaration-list" without terminating ';'
4510 ///       struct-declaration-list:
4511 ///         struct-declaration
4512 ///         struct-declaration-list struct-declaration
4513 /// [OBC]   '@' 'defs' '(' class-name ')'
4514 ///
ParseStructUnionBody(SourceLocation RecordLoc,DeclSpec::TST TagType,RecordDecl * TagDecl)4515 void Parser::ParseStructUnionBody(SourceLocation RecordLoc,
4516                                   DeclSpec::TST TagType, RecordDecl *TagDecl) {
4517   PrettyDeclStackTraceEntry CrashInfo(Actions.Context, TagDecl, RecordLoc,
4518                                       "parsing struct/union body");
4519   assert(!getLangOpts().CPlusPlus && "C++ declarations not supported");
4520 
4521   BalancedDelimiterTracker T(*this, tok::l_brace);
4522   if (T.consumeOpen())
4523     return;
4524 
4525   ParseScope StructScope(this, Scope::ClassScope|Scope::DeclScope);
4526   Actions.ActOnTagStartDefinition(getCurScope(), TagDecl);
4527 
4528   // While we still have something to read, read the declarations in the struct.
4529   while (!tryParseMisplacedModuleImport() && Tok.isNot(tok::r_brace) &&
4530          Tok.isNot(tok::eof)) {
4531     // Each iteration of this loop reads one struct-declaration.
4532 
4533     // Check for extraneous top-level semicolon.
4534     if (Tok.is(tok::semi)) {
4535       ConsumeExtraSemi(InsideStruct, TagType);
4536       continue;
4537     }
4538 
4539     // Parse _Static_assert declaration.
4540     if (Tok.isOneOf(tok::kw__Static_assert, tok::kw_static_assert)) {
4541       SourceLocation DeclEnd;
4542       ParseStaticAssertDeclaration(DeclEnd);
4543       continue;
4544     }
4545 
4546     if (Tok.is(tok::annot_pragma_pack)) {
4547       HandlePragmaPack();
4548       continue;
4549     }
4550 
4551     if (Tok.is(tok::annot_pragma_align)) {
4552       HandlePragmaAlign();
4553       continue;
4554     }
4555 
4556     if (Tok.isOneOf(tok::annot_pragma_openmp, tok::annot_attr_openmp)) {
4557       // Result can be ignored, because it must be always empty.
4558       AccessSpecifier AS = AS_none;
4559       ParsedAttributes Attrs(AttrFactory);
4560       (void)ParseOpenMPDeclarativeDirectiveWithExtDecl(AS, Attrs);
4561       continue;
4562     }
4563 
4564     if (tok::isPragmaAnnotation(Tok.getKind())) {
4565       Diag(Tok.getLocation(), diag::err_pragma_misplaced_in_decl)
4566           << DeclSpec::getSpecifierName(
4567                  TagType, Actions.getASTContext().getPrintingPolicy());
4568       ConsumeAnnotationToken();
4569       continue;
4570     }
4571 
4572     if (!Tok.is(tok::at)) {
4573       auto CFieldCallback = [&](ParsingFieldDeclarator &FD) {
4574         // Install the declarator into the current TagDecl.
4575         Decl *Field =
4576             Actions.ActOnField(getCurScope(), TagDecl,
4577                                FD.D.getDeclSpec().getSourceRange().getBegin(),
4578                                FD.D, FD.BitfieldSize);
4579         FD.complete(Field);
4580       };
4581 
4582       // Parse all the comma separated declarators.
4583       ParsingDeclSpec DS(*this);
4584       ParseStructDeclaration(DS, CFieldCallback);
4585     } else { // Handle @defs
4586       ConsumeToken();
4587       if (!Tok.isObjCAtKeyword(tok::objc_defs)) {
4588         Diag(Tok, diag::err_unexpected_at);
4589         SkipUntil(tok::semi);
4590         continue;
4591       }
4592       ConsumeToken();
4593       ExpectAndConsume(tok::l_paren);
4594       if (!Tok.is(tok::identifier)) {
4595         Diag(Tok, diag::err_expected) << tok::identifier;
4596         SkipUntil(tok::semi);
4597         continue;
4598       }
4599       SmallVector<Decl *, 16> Fields;
4600       Actions.ActOnDefs(getCurScope(), TagDecl, Tok.getLocation(),
4601                         Tok.getIdentifierInfo(), Fields);
4602       ConsumeToken();
4603       ExpectAndConsume(tok::r_paren);
4604     }
4605 
4606     if (TryConsumeToken(tok::semi))
4607       continue;
4608 
4609     if (Tok.is(tok::r_brace)) {
4610       ExpectAndConsume(tok::semi, diag::ext_expected_semi_decl_list);
4611       break;
4612     }
4613 
4614     ExpectAndConsume(tok::semi, diag::err_expected_semi_decl_list);
4615     // Skip to end of block or statement to avoid ext-warning on extra ';'.
4616     SkipUntil(tok::r_brace, StopAtSemi | StopBeforeMatch);
4617     // If we stopped at a ';', eat it.
4618     TryConsumeToken(tok::semi);
4619   }
4620 
4621   T.consumeClose();
4622 
4623   ParsedAttributes attrs(AttrFactory);
4624   // If attributes exist after struct contents, parse them.
4625   MaybeParseGNUAttributes(attrs);
4626 
4627   SmallVector<Decl *, 32> FieldDecls(TagDecl->fields());
4628 
4629   Actions.ActOnFields(getCurScope(), RecordLoc, TagDecl, FieldDecls,
4630                       T.getOpenLocation(), T.getCloseLocation(), attrs);
4631   StructScope.Exit();
4632   Actions.ActOnTagFinishDefinition(getCurScope(), TagDecl, T.getRange());
4633 }
4634 
4635 /// ParseEnumSpecifier
4636 ///       enum-specifier: [C99 6.7.2.2]
4637 ///         'enum' identifier[opt] '{' enumerator-list '}'
4638 ///[C99/C++]'enum' identifier[opt] '{' enumerator-list ',' '}'
4639 /// [GNU]   'enum' attributes[opt] identifier[opt] '{' enumerator-list ',' [opt]
4640 ///                                                 '}' attributes[opt]
4641 /// [MS]    'enum' __declspec[opt] identifier[opt] '{' enumerator-list ',' [opt]
4642 ///                                                 '}'
4643 ///         'enum' identifier
4644 /// [GNU]   'enum' attributes[opt] identifier
4645 ///
4646 /// [C++11] enum-head '{' enumerator-list[opt] '}'
4647 /// [C++11] enum-head '{' enumerator-list ','  '}'
4648 ///
4649 ///       enum-head: [C++11]
4650 ///         enum-key attribute-specifier-seq[opt] identifier[opt] enum-base[opt]
4651 ///         enum-key attribute-specifier-seq[opt] nested-name-specifier
4652 ///             identifier enum-base[opt]
4653 ///
4654 ///       enum-key: [C++11]
4655 ///         'enum'
4656 ///         'enum' 'class'
4657 ///         'enum' 'struct'
4658 ///
4659 ///       enum-base: [C++11]
4660 ///         ':' type-specifier-seq
4661 ///
4662 /// [C++] elaborated-type-specifier:
4663 /// [C++]   'enum' nested-name-specifier[opt] identifier
4664 ///
ParseEnumSpecifier(SourceLocation StartLoc,DeclSpec & DS,const ParsedTemplateInfo & TemplateInfo,AccessSpecifier AS,DeclSpecContext DSC)4665 void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS,
4666                                 const ParsedTemplateInfo &TemplateInfo,
4667                                 AccessSpecifier AS, DeclSpecContext DSC) {
4668   // Parse the tag portion of this.
4669   if (Tok.is(tok::code_completion)) {
4670     // Code completion for an enum name.
4671     cutOffParsing();
4672     Actions.CodeCompleteTag(getCurScope(), DeclSpec::TST_enum);
4673     DS.SetTypeSpecError(); // Needed by ActOnUsingDeclaration.
4674     return;
4675   }
4676 
4677   // If attributes exist after tag, parse them.
4678   ParsedAttributes attrs(AttrFactory);
4679   MaybeParseAttributes(PAKM_GNU | PAKM_Declspec | PAKM_CXX11, attrs);
4680 
4681   SourceLocation ScopedEnumKWLoc;
4682   bool IsScopedUsingClassTag = false;
4683 
4684   // In C++11, recognize 'enum class' and 'enum struct'.
4685   if (Tok.isOneOf(tok::kw_class, tok::kw_struct) && getLangOpts().CPlusPlus) {
4686     Diag(Tok, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_scoped_enum
4687                                         : diag::ext_scoped_enum);
4688     IsScopedUsingClassTag = Tok.is(tok::kw_class);
4689     ScopedEnumKWLoc = ConsumeToken();
4690 
4691     // Attributes are not allowed between these keywords.  Diagnose,
4692     // but then just treat them like they appeared in the right place.
4693     ProhibitAttributes(attrs);
4694 
4695     // They are allowed afterwards, though.
4696     MaybeParseAttributes(PAKM_GNU | PAKM_Declspec | PAKM_CXX11, attrs);
4697   }
4698 
4699   // C++11 [temp.explicit]p12:
4700   //   The usual access controls do not apply to names used to specify
4701   //   explicit instantiations.
4702   // We extend this to also cover explicit specializations.  Note that
4703   // we don't suppress if this turns out to be an elaborated type
4704   // specifier.
4705   bool shouldDelayDiagsInTag =
4706     (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation ||
4707      TemplateInfo.Kind == ParsedTemplateInfo::ExplicitSpecialization);
4708   SuppressAccessChecks diagsFromTag(*this, shouldDelayDiagsInTag);
4709 
4710   // Determine whether this declaration is permitted to have an enum-base.
4711   AllowDefiningTypeSpec AllowEnumSpecifier =
4712       isDefiningTypeSpecifierContext(DSC, getLangOpts().CPlusPlus);
4713   bool CanBeOpaqueEnumDeclaration =
4714       DS.isEmpty() && isOpaqueEnumDeclarationContext(DSC);
4715   bool CanHaveEnumBase = (getLangOpts().CPlusPlus11 || getLangOpts().ObjC ||
4716                           getLangOpts().MicrosoftExt) &&
4717                          (AllowEnumSpecifier == AllowDefiningTypeSpec::Yes ||
4718                           CanBeOpaqueEnumDeclaration);
4719 
4720   CXXScopeSpec &SS = DS.getTypeSpecScope();
4721   if (getLangOpts().CPlusPlus) {
4722     // "enum foo : bar;" is not a potential typo for "enum foo::bar;".
4723     ColonProtectionRAIIObject X(*this);
4724 
4725     CXXScopeSpec Spec;
4726     if (ParseOptionalCXXScopeSpecifier(Spec, /*ObjectType=*/nullptr,
4727                                        /*ObjectHasErrors=*/false,
4728                                        /*EnteringContext=*/true))
4729       return;
4730 
4731     if (Spec.isSet() && Tok.isNot(tok::identifier)) {
4732       Diag(Tok, diag::err_expected) << tok::identifier;
4733       DS.SetTypeSpecError();
4734       if (Tok.isNot(tok::l_brace)) {
4735         // Has no name and is not a definition.
4736         // Skip the rest of this declarator, up until the comma or semicolon.
4737         SkipUntil(tok::comma, StopAtSemi);
4738         return;
4739       }
4740     }
4741 
4742     SS = Spec;
4743   }
4744 
4745   // Must have either 'enum name' or 'enum {...}' or (rarely) 'enum : T { ... }'.
4746   if (Tok.isNot(tok::identifier) && Tok.isNot(tok::l_brace) &&
4747       Tok.isNot(tok::colon)) {
4748     Diag(Tok, diag::err_expected_either) << tok::identifier << tok::l_brace;
4749 
4750     DS.SetTypeSpecError();
4751     // Skip the rest of this declarator, up until the comma or semicolon.
4752     SkipUntil(tok::comma, StopAtSemi);
4753     return;
4754   }
4755 
4756   // If an identifier is present, consume and remember it.
4757   IdentifierInfo *Name = nullptr;
4758   SourceLocation NameLoc;
4759   if (Tok.is(tok::identifier)) {
4760     Name = Tok.getIdentifierInfo();
4761     NameLoc = ConsumeToken();
4762   }
4763 
4764   if (!Name && ScopedEnumKWLoc.isValid()) {
4765     // C++0x 7.2p2: The optional identifier shall not be omitted in the
4766     // declaration of a scoped enumeration.
4767     Diag(Tok, diag::err_scoped_enum_missing_identifier);
4768     ScopedEnumKWLoc = SourceLocation();
4769     IsScopedUsingClassTag = false;
4770   }
4771 
4772   // Okay, end the suppression area.  We'll decide whether to emit the
4773   // diagnostics in a second.
4774   if (shouldDelayDiagsInTag)
4775     diagsFromTag.done();
4776 
4777   TypeResult BaseType;
4778   SourceRange BaseRange;
4779 
4780   bool CanBeBitfield =
4781       getCurScope()->isClassScope() && ScopedEnumKWLoc.isInvalid() && Name;
4782 
4783   // Parse the fixed underlying type.
4784   if (Tok.is(tok::colon)) {
4785     // This might be an enum-base or part of some unrelated enclosing context.
4786     //
4787     // 'enum E : base' is permitted in two circumstances:
4788     //
4789     // 1) As a defining-type-specifier, when followed by '{'.
4790     // 2) As the sole constituent of a complete declaration -- when DS is empty
4791     //    and the next token is ';'.
4792     //
4793     // The restriction to defining-type-specifiers is important to allow parsing
4794     //   a ? new enum E : int{}
4795     //   _Generic(a, enum E : int{})
4796     // properly.
4797     //
4798     // One additional consideration applies:
4799     //
4800     // C++ [dcl.enum]p1:
4801     //   A ':' following "enum nested-name-specifier[opt] identifier" within
4802     //   the decl-specifier-seq of a member-declaration is parsed as part of
4803     //   an enum-base.
4804     //
4805     // Other language modes supporting enumerations with fixed underlying types
4806     // do not have clear rules on this, so we disambiguate to determine whether
4807     // the tokens form a bit-field width or an enum-base.
4808 
4809     if (CanBeBitfield && !isEnumBase(CanBeOpaqueEnumDeclaration)) {
4810       // Outside C++11, do not interpret the tokens as an enum-base if they do
4811       // not make sense as one. In C++11, it's an error if this happens.
4812       if (getLangOpts().CPlusPlus11)
4813         Diag(Tok.getLocation(), diag::err_anonymous_enum_bitfield);
4814     } else if (CanHaveEnumBase || !ColonIsSacred) {
4815       SourceLocation ColonLoc = ConsumeToken();
4816 
4817       // Parse a type-specifier-seq as a type. We can't just ParseTypeName here,
4818       // because under -fms-extensions,
4819       //   enum E : int *p;
4820       // declares 'enum E : int; E *p;' not 'enum E : int*; E p;'.
4821       DeclSpec DS(AttrFactory);
4822       // enum-base is not assumed to be a type and therefore requires the
4823       // typename keyword [p0634r3].
4824       ParseSpecifierQualifierList(DS, ImplicitTypenameContext::No, AS,
4825                                   DeclSpecContext::DSC_type_specifier);
4826       Declarator DeclaratorInfo(DS, ParsedAttributesView::none(),
4827                                 DeclaratorContext::TypeName);
4828       BaseType = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
4829 
4830       BaseRange = SourceRange(ColonLoc, DeclaratorInfo.getSourceRange().getEnd());
4831 
4832       if (!getLangOpts().ObjC) {
4833         if (getLangOpts().CPlusPlus11)
4834           Diag(ColonLoc, diag::warn_cxx98_compat_enum_fixed_underlying_type)
4835               << BaseRange;
4836         else if (getLangOpts().CPlusPlus)
4837           Diag(ColonLoc, diag::ext_cxx11_enum_fixed_underlying_type)
4838               << BaseRange;
4839         else if (getLangOpts().MicrosoftExt)
4840           Diag(ColonLoc, diag::ext_ms_c_enum_fixed_underlying_type)
4841               << BaseRange;
4842         else
4843           Diag(ColonLoc, diag::ext_clang_c_enum_fixed_underlying_type)
4844               << BaseRange;
4845       }
4846     }
4847   }
4848 
4849   // There are four options here.  If we have 'friend enum foo;' then this is a
4850   // friend declaration, and cannot have an accompanying definition. If we have
4851   // 'enum foo;', then this is a forward declaration.  If we have
4852   // 'enum foo {...' then this is a definition. Otherwise we have something
4853   // like 'enum foo xyz', a reference.
4854   //
4855   // This is needed to handle stuff like this right (C99 6.7.2.3p11):
4856   // enum foo {..};  void bar() { enum foo; }    <- new foo in bar.
4857   // enum foo {..};  void bar() { enum foo x; }  <- use of old foo.
4858   //
4859   Sema::TagUseKind TUK;
4860   if (AllowEnumSpecifier == AllowDefiningTypeSpec::No)
4861     TUK = Sema::TUK_Reference;
4862   else if (Tok.is(tok::l_brace)) {
4863     if (DS.isFriendSpecified()) {
4864       Diag(Tok.getLocation(), diag::err_friend_decl_defines_type)
4865         << SourceRange(DS.getFriendSpecLoc());
4866       ConsumeBrace();
4867       SkipUntil(tok::r_brace, StopAtSemi);
4868       // Discard any other definition-only pieces.
4869       attrs.clear();
4870       ScopedEnumKWLoc = SourceLocation();
4871       IsScopedUsingClassTag = false;
4872       BaseType = TypeResult();
4873       TUK = Sema::TUK_Friend;
4874     } else {
4875       TUK = Sema::TUK_Definition;
4876     }
4877   } else if (!isTypeSpecifier(DSC) &&
4878              (Tok.is(tok::semi) ||
4879               (Tok.isAtStartOfLine() &&
4880                !isValidAfterTypeSpecifier(CanBeBitfield)))) {
4881     // An opaque-enum-declaration is required to be standalone (no preceding or
4882     // following tokens in the declaration). Sema enforces this separately by
4883     // diagnosing anything else in the DeclSpec.
4884     TUK = DS.isFriendSpecified() ? Sema::TUK_Friend : Sema::TUK_Declaration;
4885     if (Tok.isNot(tok::semi)) {
4886       // A semicolon was missing after this declaration. Diagnose and recover.
4887       ExpectAndConsume(tok::semi, diag::err_expected_after, "enum");
4888       PP.EnterToken(Tok, /*IsReinject=*/true);
4889       Tok.setKind(tok::semi);
4890     }
4891   } else {
4892     TUK = Sema::TUK_Reference;
4893   }
4894 
4895   bool IsElaboratedTypeSpecifier =
4896       TUK == Sema::TUK_Reference || TUK == Sema::TUK_Friend;
4897 
4898   // If this is an elaborated type specifier nested in a larger declaration,
4899   // and we delayed diagnostics before, just merge them into the current pool.
4900   if (TUK == Sema::TUK_Reference && shouldDelayDiagsInTag) {
4901     diagsFromTag.redelay();
4902   }
4903 
4904   MultiTemplateParamsArg TParams;
4905   if (TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate &&
4906       TUK != Sema::TUK_Reference) {
4907     if (!getLangOpts().CPlusPlus11 || !SS.isSet()) {
4908       // Skip the rest of this declarator, up until the comma or semicolon.
4909       Diag(Tok, diag::err_enum_template);
4910       SkipUntil(tok::comma, StopAtSemi);
4911       return;
4912     }
4913 
4914     if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) {
4915       // Enumerations can't be explicitly instantiated.
4916       DS.SetTypeSpecError();
4917       Diag(StartLoc, diag::err_explicit_instantiation_enum);
4918       return;
4919     }
4920 
4921     assert(TemplateInfo.TemplateParams && "no template parameters");
4922     TParams = MultiTemplateParamsArg(TemplateInfo.TemplateParams->data(),
4923                                      TemplateInfo.TemplateParams->size());
4924   }
4925 
4926   if (!Name && TUK != Sema::TUK_Definition) {
4927     Diag(Tok, diag::err_enumerator_unnamed_no_def);
4928 
4929     DS.SetTypeSpecError();
4930     // Skip the rest of this declarator, up until the comma or semicolon.
4931     SkipUntil(tok::comma, StopAtSemi);
4932     return;
4933   }
4934 
4935   // An elaborated-type-specifier has a much more constrained grammar:
4936   //
4937   //   'enum' nested-name-specifier[opt] identifier
4938   //
4939   // If we parsed any other bits, reject them now.
4940   //
4941   // MSVC and (for now at least) Objective-C permit a full enum-specifier
4942   // or opaque-enum-declaration anywhere.
4943   if (IsElaboratedTypeSpecifier && !getLangOpts().MicrosoftExt &&
4944       !getLangOpts().ObjC) {
4945     ProhibitCXX11Attributes(attrs, diag::err_attributes_not_allowed,
4946                             /*DiagnoseEmptyAttrs=*/true);
4947     if (BaseType.isUsable())
4948       Diag(BaseRange.getBegin(), diag::ext_enum_base_in_type_specifier)
4949           << (AllowEnumSpecifier == AllowDefiningTypeSpec::Yes) << BaseRange;
4950     else if (ScopedEnumKWLoc.isValid())
4951       Diag(ScopedEnumKWLoc, diag::ext_elaborated_enum_class)
4952         << FixItHint::CreateRemoval(ScopedEnumKWLoc) << IsScopedUsingClassTag;
4953   }
4954 
4955   stripTypeAttributesOffDeclSpec(attrs, DS, TUK);
4956 
4957   Sema::SkipBodyInfo SkipBody;
4958   if (!Name && TUK == Sema::TUK_Definition && Tok.is(tok::l_brace) &&
4959       NextToken().is(tok::identifier))
4960     SkipBody = Actions.shouldSkipAnonEnumBody(getCurScope(),
4961                                               NextToken().getIdentifierInfo(),
4962                                               NextToken().getLocation());
4963 
4964   bool Owned = false;
4965   bool IsDependent = false;
4966   const char *PrevSpec = nullptr;
4967   unsigned DiagID;
4968   Decl *TagDecl =
4969       Actions.ActOnTag(getCurScope(), DeclSpec::TST_enum, TUK, StartLoc, SS,
4970                     Name, NameLoc, attrs, AS, DS.getModulePrivateSpecLoc(),
4971                     TParams, Owned, IsDependent, ScopedEnumKWLoc,
4972                     IsScopedUsingClassTag,
4973                     BaseType, DSC == DeclSpecContext::DSC_type_specifier,
4974                     DSC == DeclSpecContext::DSC_template_param ||
4975                         DSC == DeclSpecContext::DSC_template_type_arg,
4976                     OffsetOfState, &SkipBody).get();
4977 
4978   if (SkipBody.ShouldSkip) {
4979     assert(TUK == Sema::TUK_Definition && "can only skip a definition");
4980 
4981     BalancedDelimiterTracker T(*this, tok::l_brace);
4982     T.consumeOpen();
4983     T.skipToEnd();
4984 
4985     if (DS.SetTypeSpecType(DeclSpec::TST_enum, StartLoc,
4986                            NameLoc.isValid() ? NameLoc : StartLoc,
4987                            PrevSpec, DiagID, TagDecl, Owned,
4988                            Actions.getASTContext().getPrintingPolicy()))
4989       Diag(StartLoc, DiagID) << PrevSpec;
4990     return;
4991   }
4992 
4993   if (IsDependent) {
4994     // This enum has a dependent nested-name-specifier. Handle it as a
4995     // dependent tag.
4996     if (!Name) {
4997       DS.SetTypeSpecError();
4998       Diag(Tok, diag::err_expected_type_name_after_typename);
4999       return;
5000     }
5001 
5002     TypeResult Type = Actions.ActOnDependentTag(
5003         getCurScope(), DeclSpec::TST_enum, TUK, SS, Name, StartLoc, NameLoc);
5004     if (Type.isInvalid()) {
5005       DS.SetTypeSpecError();
5006       return;
5007     }
5008 
5009     if (DS.SetTypeSpecType(DeclSpec::TST_typename, StartLoc,
5010                            NameLoc.isValid() ? NameLoc : StartLoc,
5011                            PrevSpec, DiagID, Type.get(),
5012                            Actions.getASTContext().getPrintingPolicy()))
5013       Diag(StartLoc, DiagID) << PrevSpec;
5014 
5015     return;
5016   }
5017 
5018   if (!TagDecl) {
5019     // The action failed to produce an enumeration tag. If this is a
5020     // definition, consume the entire definition.
5021     if (Tok.is(tok::l_brace) && TUK != Sema::TUK_Reference) {
5022       ConsumeBrace();
5023       SkipUntil(tok::r_brace, StopAtSemi);
5024     }
5025 
5026     DS.SetTypeSpecError();
5027     return;
5028   }
5029 
5030   if (Tok.is(tok::l_brace) && TUK == Sema::TUK_Definition) {
5031     Decl *D = SkipBody.CheckSameAsPrevious ? SkipBody.New : TagDecl;
5032     ParseEnumBody(StartLoc, D);
5033     if (SkipBody.CheckSameAsPrevious &&
5034         !Actions.ActOnDuplicateDefinition(TagDecl, SkipBody)) {
5035       DS.SetTypeSpecError();
5036       return;
5037     }
5038   }
5039 
5040   if (DS.SetTypeSpecType(DeclSpec::TST_enum, StartLoc,
5041                          NameLoc.isValid() ? NameLoc : StartLoc,
5042                          PrevSpec, DiagID, TagDecl, Owned,
5043                          Actions.getASTContext().getPrintingPolicy()))
5044     Diag(StartLoc, DiagID) << PrevSpec;
5045 }
5046 
5047 /// ParseEnumBody - Parse a {} enclosed enumerator-list.
5048 ///       enumerator-list:
5049 ///         enumerator
5050 ///         enumerator-list ',' enumerator
5051 ///       enumerator:
5052 ///         enumeration-constant attributes[opt]
5053 ///         enumeration-constant attributes[opt] '=' constant-expression
5054 ///       enumeration-constant:
5055 ///         identifier
5056 ///
ParseEnumBody(SourceLocation StartLoc,Decl * EnumDecl)5057 void Parser::ParseEnumBody(SourceLocation StartLoc, Decl *EnumDecl) {
5058   // Enter the scope of the enum body and start the definition.
5059   ParseScope EnumScope(this, Scope::DeclScope | Scope::EnumScope);
5060   Actions.ActOnTagStartDefinition(getCurScope(), EnumDecl);
5061 
5062   BalancedDelimiterTracker T(*this, tok::l_brace);
5063   T.consumeOpen();
5064 
5065   // C does not allow an empty enumerator-list, C++ does [dcl.enum].
5066   if (Tok.is(tok::r_brace) && !getLangOpts().CPlusPlus)
5067     Diag(Tok, diag::err_empty_enum);
5068 
5069   SmallVector<Decl *, 32> EnumConstantDecls;
5070   SmallVector<SuppressAccessChecks, 32> EnumAvailabilityDiags;
5071 
5072   Decl *LastEnumConstDecl = nullptr;
5073 
5074   // Parse the enumerator-list.
5075   while (Tok.isNot(tok::r_brace)) {
5076     // Parse enumerator. If failed, try skipping till the start of the next
5077     // enumerator definition.
5078     if (Tok.isNot(tok::identifier)) {
5079       Diag(Tok.getLocation(), diag::err_expected) << tok::identifier;
5080       if (SkipUntil(tok::comma, tok::r_brace, StopBeforeMatch) &&
5081           TryConsumeToken(tok::comma))
5082         continue;
5083       break;
5084     }
5085     IdentifierInfo *Ident = Tok.getIdentifierInfo();
5086     SourceLocation IdentLoc = ConsumeToken();
5087 
5088     // If attributes exist after the enumerator, parse them.
5089     ParsedAttributes attrs(AttrFactory);
5090     MaybeParseGNUAttributes(attrs);
5091     if (standardAttributesAllowed() && isCXX11AttributeSpecifier()) {
5092       if (getLangOpts().CPlusPlus)
5093         Diag(Tok.getLocation(), getLangOpts().CPlusPlus17
5094                                     ? diag::warn_cxx14_compat_ns_enum_attribute
5095                                     : diag::ext_ns_enum_attribute)
5096             << 1 /*enumerator*/;
5097       ParseCXX11Attributes(attrs);
5098     }
5099 
5100     SourceLocation EqualLoc;
5101     ExprResult AssignedVal;
5102     EnumAvailabilityDiags.emplace_back(*this);
5103 
5104     EnterExpressionEvaluationContext ConstantEvaluated(
5105         Actions, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5106     if (TryConsumeToken(tok::equal, EqualLoc)) {
5107       AssignedVal = ParseConstantExpressionInExprEvalContext();
5108       if (AssignedVal.isInvalid())
5109         SkipUntil(tok::comma, tok::r_brace, StopBeforeMatch);
5110     }
5111 
5112     // Install the enumerator constant into EnumDecl.
5113     Decl *EnumConstDecl = Actions.ActOnEnumConstant(
5114         getCurScope(), EnumDecl, LastEnumConstDecl, IdentLoc, Ident, attrs,
5115         EqualLoc, AssignedVal.get());
5116     EnumAvailabilityDiags.back().done();
5117 
5118     EnumConstantDecls.push_back(EnumConstDecl);
5119     LastEnumConstDecl = EnumConstDecl;
5120 
5121     if (Tok.is(tok::identifier)) {
5122       // We're missing a comma between enumerators.
5123       SourceLocation Loc = getEndOfPreviousToken();
5124       Diag(Loc, diag::err_enumerator_list_missing_comma)
5125         << FixItHint::CreateInsertion(Loc, ", ");
5126       continue;
5127     }
5128 
5129     // Emumerator definition must be finished, only comma or r_brace are
5130     // allowed here.
5131     SourceLocation CommaLoc;
5132     if (Tok.isNot(tok::r_brace) && !TryConsumeToken(tok::comma, CommaLoc)) {
5133       if (EqualLoc.isValid())
5134         Diag(Tok.getLocation(), diag::err_expected_either) << tok::r_brace
5135                                                            << tok::comma;
5136       else
5137         Diag(Tok.getLocation(), diag::err_expected_end_of_enumerator);
5138       if (SkipUntil(tok::comma, tok::r_brace, StopBeforeMatch)) {
5139         if (TryConsumeToken(tok::comma, CommaLoc))
5140           continue;
5141       } else {
5142         break;
5143       }
5144     }
5145 
5146     // If comma is followed by r_brace, emit appropriate warning.
5147     if (Tok.is(tok::r_brace) && CommaLoc.isValid()) {
5148       if (!getLangOpts().C99 && !getLangOpts().CPlusPlus11)
5149         Diag(CommaLoc, getLangOpts().CPlusPlus ?
5150                diag::ext_enumerator_list_comma_cxx :
5151                diag::ext_enumerator_list_comma_c)
5152           << FixItHint::CreateRemoval(CommaLoc);
5153       else if (getLangOpts().CPlusPlus11)
5154         Diag(CommaLoc, diag::warn_cxx98_compat_enumerator_list_comma)
5155           << FixItHint::CreateRemoval(CommaLoc);
5156       break;
5157     }
5158   }
5159 
5160   // Eat the }.
5161   T.consumeClose();
5162 
5163   // If attributes exist after the identifier list, parse them.
5164   ParsedAttributes attrs(AttrFactory);
5165   MaybeParseGNUAttributes(attrs);
5166 
5167   Actions.ActOnEnumBody(StartLoc, T.getRange(), EnumDecl, EnumConstantDecls,
5168                         getCurScope(), attrs);
5169 
5170   // Now handle enum constant availability diagnostics.
5171   assert(EnumConstantDecls.size() == EnumAvailabilityDiags.size());
5172   for (size_t i = 0, e = EnumConstantDecls.size(); i != e; ++i) {
5173     ParsingDeclRAIIObject PD(*this, ParsingDeclRAIIObject::NoParent);
5174     EnumAvailabilityDiags[i].redelay();
5175     PD.complete(EnumConstantDecls[i]);
5176   }
5177 
5178   EnumScope.Exit();
5179   Actions.ActOnTagFinishDefinition(getCurScope(), EnumDecl, T.getRange());
5180 
5181   // The next token must be valid after an enum definition. If not, a ';'
5182   // was probably forgotten.
5183   bool CanBeBitfield = getCurScope()->isClassScope();
5184   if (!isValidAfterTypeSpecifier(CanBeBitfield)) {
5185     ExpectAndConsume(tok::semi, diag::err_expected_after, "enum");
5186     // Push this token back into the preprocessor and change our current token
5187     // to ';' so that the rest of the code recovers as though there were an
5188     // ';' after the definition.
5189     PP.EnterToken(Tok, /*IsReinject=*/true);
5190     Tok.setKind(tok::semi);
5191   }
5192 }
5193 
5194 /// isKnownToBeTypeSpecifier - Return true if we know that the specified token
5195 /// is definitely a type-specifier.  Return false if it isn't part of a type
5196 /// specifier or if we're not sure.
isKnownToBeTypeSpecifier(const Token & Tok) const5197 bool Parser::isKnownToBeTypeSpecifier(const Token &Tok) const {
5198   switch (Tok.getKind()) {
5199   default: return false;
5200     // type-specifiers
5201   case tok::kw_short:
5202   case tok::kw_long:
5203   case tok::kw___int64:
5204   case tok::kw___int128:
5205   case tok::kw_signed:
5206   case tok::kw_unsigned:
5207   case tok::kw__Complex:
5208   case tok::kw__Imaginary:
5209   case tok::kw_void:
5210   case tok::kw_char:
5211   case tok::kw_wchar_t:
5212   case tok::kw_char8_t:
5213   case tok::kw_char16_t:
5214   case tok::kw_char32_t:
5215   case tok::kw_int:
5216   case tok::kw__ExtInt:
5217   case tok::kw__BitInt:
5218   case tok::kw___bf16:
5219   case tok::kw_half:
5220   case tok::kw_float:
5221   case tok::kw_double:
5222   case tok::kw__Accum:
5223   case tok::kw__Fract:
5224   case tok::kw__Float16:
5225   case tok::kw___float128:
5226   case tok::kw___ibm128:
5227   case tok::kw_bool:
5228   case tok::kw__Bool:
5229   case tok::kw__Decimal32:
5230   case tok::kw__Decimal64:
5231   case tok::kw__Decimal128:
5232   case tok::kw___vector:
5233 #define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t:
5234 #include "clang/Basic/OpenCLImageTypes.def"
5235 
5236     // struct-or-union-specifier (C99) or class-specifier (C++)
5237   case tok::kw_class:
5238   case tok::kw_struct:
5239   case tok::kw___interface:
5240   case tok::kw_union:
5241     // enum-specifier
5242   case tok::kw_enum:
5243 
5244     // typedef-name
5245   case tok::annot_typename:
5246     return true;
5247   }
5248 }
5249 
5250 /// isTypeSpecifierQualifier - Return true if the current token could be the
5251 /// start of a specifier-qualifier-list.
isTypeSpecifierQualifier()5252 bool Parser::isTypeSpecifierQualifier() {
5253   switch (Tok.getKind()) {
5254   default: return false;
5255 
5256   case tok::identifier:   // foo::bar
5257     if (TryAltiVecVectorToken())
5258       return true;
5259     [[fallthrough]];
5260   case tok::kw_typename:  // typename T::type
5261     // Annotate typenames and C++ scope specifiers.  If we get one, just
5262     // recurse to handle whatever we get.
5263     if (TryAnnotateTypeOrScopeToken())
5264       return true;
5265     if (Tok.is(tok::identifier))
5266       return false;
5267     return isTypeSpecifierQualifier();
5268 
5269   case tok::coloncolon:   // ::foo::bar
5270     if (NextToken().is(tok::kw_new) ||    // ::new
5271         NextToken().is(tok::kw_delete))   // ::delete
5272       return false;
5273 
5274     if (TryAnnotateTypeOrScopeToken())
5275       return true;
5276     return isTypeSpecifierQualifier();
5277 
5278     // GNU attributes support.
5279   case tok::kw___attribute:
5280     // C2x/GNU typeof support.
5281   case tok::kw_typeof:
5282   case tok::kw_typeof_unqual:
5283 
5284     // type-specifiers
5285   case tok::kw_short:
5286   case tok::kw_long:
5287   case tok::kw___int64:
5288   case tok::kw___int128:
5289   case tok::kw_signed:
5290   case tok::kw_unsigned:
5291   case tok::kw__Complex:
5292   case tok::kw__Imaginary:
5293   case tok::kw_void:
5294   case tok::kw_char:
5295   case tok::kw_wchar_t:
5296   case tok::kw_char8_t:
5297   case tok::kw_char16_t:
5298   case tok::kw_char32_t:
5299   case tok::kw_int:
5300   case tok::kw__ExtInt:
5301   case tok::kw__BitInt:
5302   case tok::kw_half:
5303   case tok::kw___bf16:
5304   case tok::kw_float:
5305   case tok::kw_double:
5306   case tok::kw__Accum:
5307   case tok::kw__Fract:
5308   case tok::kw__Float16:
5309   case tok::kw___float128:
5310   case tok::kw___ibm128:
5311   case tok::kw_bool:
5312   case tok::kw__Bool:
5313   case tok::kw__Decimal32:
5314   case tok::kw__Decimal64:
5315   case tok::kw__Decimal128:
5316   case tok::kw___vector:
5317 #define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t:
5318 #include "clang/Basic/OpenCLImageTypes.def"
5319 
5320     // struct-or-union-specifier (C99) or class-specifier (C++)
5321   case tok::kw_class:
5322   case tok::kw_struct:
5323   case tok::kw___interface:
5324   case tok::kw_union:
5325     // enum-specifier
5326   case tok::kw_enum:
5327 
5328     // type-qualifier
5329   case tok::kw_const:
5330   case tok::kw_volatile:
5331   case tok::kw_restrict:
5332   case tok::kw__Sat:
5333 
5334     // Debugger support.
5335   case tok::kw___unknown_anytype:
5336 
5337     // typedef-name
5338   case tok::annot_typename:
5339     return true;
5340 
5341     // GNU ObjC bizarre protocol extension: <proto1,proto2> with implicit 'id'.
5342   case tok::less:
5343     return getLangOpts().ObjC;
5344 
5345   case tok::kw___cdecl:
5346   case tok::kw___stdcall:
5347   case tok::kw___fastcall:
5348   case tok::kw___thiscall:
5349   case tok::kw___regcall:
5350   case tok::kw___vectorcall:
5351   case tok::kw___w64:
5352   case tok::kw___ptr64:
5353   case tok::kw___ptr32:
5354   case tok::kw___pascal:
5355   case tok::kw___unaligned:
5356 
5357   case tok::kw__Nonnull:
5358   case tok::kw__Nullable:
5359   case tok::kw__Nullable_result:
5360   case tok::kw__Null_unspecified:
5361 
5362   case tok::kw___kindof:
5363 
5364   case tok::kw___private:
5365   case tok::kw___local:
5366   case tok::kw___global:
5367   case tok::kw___constant:
5368   case tok::kw___generic:
5369   case tok::kw___read_only:
5370   case tok::kw___read_write:
5371   case tok::kw___write_only:
5372 
5373   case tok::kw_groupshared:
5374     return true;
5375 
5376   case tok::kw_private:
5377     return getLangOpts().OpenCL;
5378 
5379   // C11 _Atomic
5380   case tok::kw__Atomic:
5381     return true;
5382   }
5383 }
5384 
ParseTopLevelStmtDecl()5385 Parser::DeclGroupPtrTy Parser::ParseTopLevelStmtDecl() {
5386   assert(PP.isIncrementalProcessingEnabled() && "Not in incremental mode");
5387 
5388   // Parse a top-level-stmt.
5389   Parser::StmtVector Stmts;
5390   ParsedStmtContext SubStmtCtx = ParsedStmtContext();
5391   StmtResult R = ParseStatementOrDeclaration(Stmts, SubStmtCtx);
5392   if (!R.isUsable())
5393     return nullptr;
5394 
5395   SmallVector<Decl *, 2> DeclsInGroup;
5396   DeclsInGroup.push_back(Actions.ActOnTopLevelStmtDecl(R.get()));
5397   // Currently happens for things like  -fms-extensions and use `__if_exists`.
5398   for (Stmt *S : Stmts)
5399     DeclsInGroup.push_back(Actions.ActOnTopLevelStmtDecl(S));
5400 
5401   return Actions.BuildDeclaratorGroup(DeclsInGroup);
5402 }
5403 
5404 /// isDeclarationSpecifier() - Return true if the current token is part of a
5405 /// declaration specifier.
5406 ///
5407 /// \param AllowImplicitTypename whether this is a context where T::type [T
5408 /// dependent] can appear.
5409 /// \param DisambiguatingWithExpression True to indicate that the purpose of
5410 /// this check is to disambiguate between an expression and a declaration.
isDeclarationSpecifier(ImplicitTypenameContext AllowImplicitTypename,bool DisambiguatingWithExpression)5411 bool Parser::isDeclarationSpecifier(
5412     ImplicitTypenameContext AllowImplicitTypename,
5413     bool DisambiguatingWithExpression) {
5414   switch (Tok.getKind()) {
5415   default: return false;
5416 
5417   // OpenCL 2.0 and later define this keyword.
5418   case tok::kw_pipe:
5419     return getLangOpts().OpenCL &&
5420            getLangOpts().getOpenCLCompatibleVersion() >= 200;
5421 
5422   case tok::identifier:   // foo::bar
5423     // Unfortunate hack to support "Class.factoryMethod" notation.
5424     if (getLangOpts().ObjC && NextToken().is(tok::period))
5425       return false;
5426     if (TryAltiVecVectorToken())
5427       return true;
5428     [[fallthrough]];
5429   case tok::kw_decltype: // decltype(T())::type
5430   case tok::kw_typename: // typename T::type
5431     // Annotate typenames and C++ scope specifiers.  If we get one, just
5432     // recurse to handle whatever we get.
5433     if (TryAnnotateTypeOrScopeToken(AllowImplicitTypename))
5434       return true;
5435     if (TryAnnotateTypeConstraint())
5436       return true;
5437     if (Tok.is(tok::identifier))
5438       return false;
5439 
5440     // If we're in Objective-C and we have an Objective-C class type followed
5441     // by an identifier and then either ':' or ']', in a place where an
5442     // expression is permitted, then this is probably a class message send
5443     // missing the initial '['. In this case, we won't consider this to be
5444     // the start of a declaration.
5445     if (DisambiguatingWithExpression &&
5446         isStartOfObjCClassMessageMissingOpenBracket())
5447       return false;
5448 
5449     return isDeclarationSpecifier(AllowImplicitTypename);
5450 
5451   case tok::coloncolon:   // ::foo::bar
5452     if (!getLangOpts().CPlusPlus)
5453       return false;
5454     if (NextToken().is(tok::kw_new) ||    // ::new
5455         NextToken().is(tok::kw_delete))   // ::delete
5456       return false;
5457 
5458     // Annotate typenames and C++ scope specifiers.  If we get one, just
5459     // recurse to handle whatever we get.
5460     if (TryAnnotateTypeOrScopeToken())
5461       return true;
5462     return isDeclarationSpecifier(ImplicitTypenameContext::No);
5463 
5464     // storage-class-specifier
5465   case tok::kw_typedef:
5466   case tok::kw_extern:
5467   case tok::kw___private_extern__:
5468   case tok::kw_static:
5469   case tok::kw_auto:
5470   case tok::kw___auto_type:
5471   case tok::kw_register:
5472   case tok::kw___thread:
5473   case tok::kw_thread_local:
5474   case tok::kw__Thread_local:
5475 
5476     // Modules
5477   case tok::kw___module_private__:
5478 
5479     // Debugger support
5480   case tok::kw___unknown_anytype:
5481 
5482     // type-specifiers
5483   case tok::kw_short:
5484   case tok::kw_long:
5485   case tok::kw___int64:
5486   case tok::kw___int128:
5487   case tok::kw_signed:
5488   case tok::kw_unsigned:
5489   case tok::kw__Complex:
5490   case tok::kw__Imaginary:
5491   case tok::kw_void:
5492   case tok::kw_char:
5493   case tok::kw_wchar_t:
5494   case tok::kw_char8_t:
5495   case tok::kw_char16_t:
5496   case tok::kw_char32_t:
5497 
5498   case tok::kw_int:
5499   case tok::kw__ExtInt:
5500   case tok::kw__BitInt:
5501   case tok::kw_half:
5502   case tok::kw___bf16:
5503   case tok::kw_float:
5504   case tok::kw_double:
5505   case tok::kw__Accum:
5506   case tok::kw__Fract:
5507   case tok::kw__Float16:
5508   case tok::kw___float128:
5509   case tok::kw___ibm128:
5510   case tok::kw_bool:
5511   case tok::kw__Bool:
5512   case tok::kw__Decimal32:
5513   case tok::kw__Decimal64:
5514   case tok::kw__Decimal128:
5515   case tok::kw___vector:
5516 
5517     // struct-or-union-specifier (C99) or class-specifier (C++)
5518   case tok::kw_class:
5519   case tok::kw_struct:
5520   case tok::kw_union:
5521   case tok::kw___interface:
5522     // enum-specifier
5523   case tok::kw_enum:
5524 
5525     // type-qualifier
5526   case tok::kw_const:
5527   case tok::kw_volatile:
5528   case tok::kw_restrict:
5529   case tok::kw__Sat:
5530 
5531     // function-specifier
5532   case tok::kw_inline:
5533   case tok::kw_virtual:
5534   case tok::kw_explicit:
5535   case tok::kw__Noreturn:
5536 
5537     // alignment-specifier
5538   case tok::kw__Alignas:
5539 
5540     // friend keyword.
5541   case tok::kw_friend:
5542 
5543     // static_assert-declaration
5544   case tok::kw_static_assert:
5545   case tok::kw__Static_assert:
5546 
5547     // C2x/GNU typeof support.
5548   case tok::kw_typeof:
5549   case tok::kw_typeof_unqual:
5550 
5551     // GNU attributes.
5552   case tok::kw___attribute:
5553 
5554     // C++11 decltype and constexpr.
5555   case tok::annot_decltype:
5556   case tok::kw_constexpr:
5557 
5558     // C++20 consteval and constinit.
5559   case tok::kw_consteval:
5560   case tok::kw_constinit:
5561 
5562     // C11 _Atomic
5563   case tok::kw__Atomic:
5564     return true;
5565 
5566     // GNU ObjC bizarre protocol extension: <proto1,proto2> with implicit 'id'.
5567   case tok::less:
5568     return getLangOpts().ObjC;
5569 
5570     // typedef-name
5571   case tok::annot_typename:
5572     return !DisambiguatingWithExpression ||
5573            !isStartOfObjCClassMessageMissingOpenBracket();
5574 
5575     // placeholder-type-specifier
5576   case tok::annot_template_id: {
5577     TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
5578     if (TemplateId->hasInvalidName())
5579       return true;
5580     // FIXME: What about type templates that have only been annotated as
5581     // annot_template_id, not as annot_typename?
5582     return isTypeConstraintAnnotation() &&
5583            (NextToken().is(tok::kw_auto) || NextToken().is(tok::kw_decltype));
5584   }
5585 
5586   case tok::annot_cxxscope: {
5587     TemplateIdAnnotation *TemplateId =
5588         NextToken().is(tok::annot_template_id)
5589             ? takeTemplateIdAnnotation(NextToken())
5590             : nullptr;
5591     if (TemplateId && TemplateId->hasInvalidName())
5592       return true;
5593     // FIXME: What about type templates that have only been annotated as
5594     // annot_template_id, not as annot_typename?
5595     if (NextToken().is(tok::identifier) && TryAnnotateTypeConstraint())
5596       return true;
5597     return isTypeConstraintAnnotation() &&
5598         GetLookAheadToken(2).isOneOf(tok::kw_auto, tok::kw_decltype);
5599   }
5600 
5601   case tok::kw___declspec:
5602   case tok::kw___cdecl:
5603   case tok::kw___stdcall:
5604   case tok::kw___fastcall:
5605   case tok::kw___thiscall:
5606   case tok::kw___regcall:
5607   case tok::kw___vectorcall:
5608   case tok::kw___w64:
5609   case tok::kw___sptr:
5610   case tok::kw___uptr:
5611   case tok::kw___ptr64:
5612   case tok::kw___ptr32:
5613   case tok::kw___forceinline:
5614   case tok::kw___pascal:
5615   case tok::kw___unaligned:
5616 
5617   case tok::kw__Nonnull:
5618   case tok::kw__Nullable:
5619   case tok::kw__Nullable_result:
5620   case tok::kw__Null_unspecified:
5621 
5622   case tok::kw___kindof:
5623 
5624   case tok::kw___private:
5625   case tok::kw___local:
5626   case tok::kw___global:
5627   case tok::kw___constant:
5628   case tok::kw___generic:
5629   case tok::kw___read_only:
5630   case tok::kw___read_write:
5631   case tok::kw___write_only:
5632 #define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t:
5633 #include "clang/Basic/OpenCLImageTypes.def"
5634 
5635   case tok::kw_groupshared:
5636     return true;
5637 
5638   case tok::kw_private:
5639     return getLangOpts().OpenCL;
5640   }
5641 }
5642 
isConstructorDeclarator(bool IsUnqualified,bool DeductionGuide,DeclSpec::FriendSpecified IsFriend)5643 bool Parser::isConstructorDeclarator(bool IsUnqualified, bool DeductionGuide,
5644                                      DeclSpec::FriendSpecified IsFriend) {
5645   TentativeParsingAction TPA(*this);
5646 
5647   // Parse the C++ scope specifier.
5648   CXXScopeSpec SS;
5649   if (ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/nullptr,
5650                                      /*ObjectHasErrors=*/false,
5651                                      /*EnteringContext=*/true)) {
5652     TPA.Revert();
5653     return false;
5654   }
5655 
5656   // Parse the constructor name.
5657   if (Tok.is(tok::identifier)) {
5658     // We already know that we have a constructor name; just consume
5659     // the token.
5660     ConsumeToken();
5661   } else if (Tok.is(tok::annot_template_id)) {
5662     ConsumeAnnotationToken();
5663   } else {
5664     TPA.Revert();
5665     return false;
5666   }
5667 
5668   // There may be attributes here, appertaining to the constructor name or type
5669   // we just stepped past.
5670   SkipCXX11Attributes();
5671 
5672   // Current class name must be followed by a left parenthesis.
5673   if (Tok.isNot(tok::l_paren)) {
5674     TPA.Revert();
5675     return false;
5676   }
5677   ConsumeParen();
5678 
5679   // A right parenthesis, or ellipsis followed by a right parenthesis signals
5680   // that we have a constructor.
5681   if (Tok.is(tok::r_paren) ||
5682       (Tok.is(tok::ellipsis) && NextToken().is(tok::r_paren))) {
5683     TPA.Revert();
5684     return true;
5685   }
5686 
5687   // A C++11 attribute here signals that we have a constructor, and is an
5688   // attribute on the first constructor parameter.
5689   if (getLangOpts().CPlusPlus11 &&
5690       isCXX11AttributeSpecifier(/*Disambiguate*/ false,
5691                                 /*OuterMightBeMessageSend*/ true)) {
5692     TPA.Revert();
5693     return true;
5694   }
5695 
5696   // If we need to, enter the specified scope.
5697   DeclaratorScopeObj DeclScopeObj(*this, SS);
5698   if (SS.isSet() && Actions.ShouldEnterDeclaratorScope(getCurScope(), SS))
5699     DeclScopeObj.EnterDeclaratorScope();
5700 
5701   // Optionally skip Microsoft attributes.
5702   ParsedAttributes Attrs(AttrFactory);
5703   MaybeParseMicrosoftAttributes(Attrs);
5704 
5705   // Check whether the next token(s) are part of a declaration
5706   // specifier, in which case we have the start of a parameter and,
5707   // therefore, we know that this is a constructor.
5708   // Due to an ambiguity with implicit typename, the above is not enough.
5709   // Additionally, check to see if we are a friend.
5710   bool IsConstructor = false;
5711   if (isDeclarationSpecifier(IsFriend ? ImplicitTypenameContext::No
5712                                       : ImplicitTypenameContext::Yes))
5713     IsConstructor = true;
5714   else if (Tok.is(tok::identifier) ||
5715            (Tok.is(tok::annot_cxxscope) && NextToken().is(tok::identifier))) {
5716     // We've seen "C ( X" or "C ( X::Y", but "X" / "X::Y" is not a type.
5717     // This might be a parenthesized member name, but is more likely to
5718     // be a constructor declaration with an invalid argument type. Keep
5719     // looking.
5720     if (Tok.is(tok::annot_cxxscope))
5721       ConsumeAnnotationToken();
5722     ConsumeToken();
5723 
5724     // If this is not a constructor, we must be parsing a declarator,
5725     // which must have one of the following syntactic forms (see the
5726     // grammar extract at the start of ParseDirectDeclarator):
5727     switch (Tok.getKind()) {
5728     case tok::l_paren:
5729       // C(X   (   int));
5730     case tok::l_square:
5731       // C(X   [   5]);
5732       // C(X   [   [attribute]]);
5733     case tok::coloncolon:
5734       // C(X   ::   Y);
5735       // C(X   ::   *p);
5736       // Assume this isn't a constructor, rather than assuming it's a
5737       // constructor with an unnamed parameter of an ill-formed type.
5738       break;
5739 
5740     case tok::r_paren:
5741       // C(X   )
5742 
5743       // Skip past the right-paren and any following attributes to get to
5744       // the function body or trailing-return-type.
5745       ConsumeParen();
5746       SkipCXX11Attributes();
5747 
5748       if (DeductionGuide) {
5749         // C(X) -> ... is a deduction guide.
5750         IsConstructor = Tok.is(tok::arrow);
5751         break;
5752       }
5753       if (Tok.is(tok::colon) || Tok.is(tok::kw_try)) {
5754         // Assume these were meant to be constructors:
5755         //   C(X)   :    (the name of a bit-field cannot be parenthesized).
5756         //   C(X)   try  (this is otherwise ill-formed).
5757         IsConstructor = true;
5758       }
5759       if (Tok.is(tok::semi) || Tok.is(tok::l_brace)) {
5760         // If we have a constructor name within the class definition,
5761         // assume these were meant to be constructors:
5762         //   C(X)   {
5763         //   C(X)   ;
5764         // ... because otherwise we would be declaring a non-static data
5765         // member that is ill-formed because it's of the same type as its
5766         // surrounding class.
5767         //
5768         // FIXME: We can actually do this whether or not the name is qualified,
5769         // because if it is qualified in this context it must be being used as
5770         // a constructor name.
5771         // currently, so we're somewhat conservative here.
5772         IsConstructor = IsUnqualified;
5773       }
5774       break;
5775 
5776     default:
5777       IsConstructor = true;
5778       break;
5779     }
5780   }
5781 
5782   TPA.Revert();
5783   return IsConstructor;
5784 }
5785 
5786 /// ParseTypeQualifierListOpt
5787 ///          type-qualifier-list: [C99 6.7.5]
5788 ///            type-qualifier
5789 /// [vendor]   attributes
5790 ///              [ only if AttrReqs & AR_VendorAttributesParsed ]
5791 ///            type-qualifier-list type-qualifier
5792 /// [vendor]   type-qualifier-list attributes
5793 ///              [ only if AttrReqs & AR_VendorAttributesParsed ]
5794 /// [C++0x]    attribute-specifier[opt] is allowed before cv-qualifier-seq
5795 ///              [ only if AttReqs & AR_CXX11AttributesParsed ]
5796 /// Note: vendor can be GNU, MS, etc and can be explicitly controlled via
5797 /// AttrRequirements bitmask values.
ParseTypeQualifierListOpt(DeclSpec & DS,unsigned AttrReqs,bool AtomicAllowed,bool IdentifierRequired,std::optional<llvm::function_ref<void ()>> CodeCompletionHandler)5798 void Parser::ParseTypeQualifierListOpt(
5799     DeclSpec &DS, unsigned AttrReqs, bool AtomicAllowed,
5800     bool IdentifierRequired,
5801     std::optional<llvm::function_ref<void()>> CodeCompletionHandler) {
5802   if (standardAttributesAllowed() && (AttrReqs & AR_CXX11AttributesParsed) &&
5803       isCXX11AttributeSpecifier()) {
5804     ParsedAttributes Attrs(AttrFactory);
5805     ParseCXX11Attributes(Attrs);
5806     DS.takeAttributesFrom(Attrs);
5807   }
5808 
5809   SourceLocation EndLoc;
5810 
5811   while (true) {
5812     bool isInvalid = false;
5813     const char *PrevSpec = nullptr;
5814     unsigned DiagID = 0;
5815     SourceLocation Loc = Tok.getLocation();
5816 
5817     switch (Tok.getKind()) {
5818     case tok::code_completion:
5819       cutOffParsing();
5820       if (CodeCompletionHandler)
5821         (*CodeCompletionHandler)();
5822       else
5823         Actions.CodeCompleteTypeQualifiers(DS);
5824       return;
5825 
5826     case tok::kw_const:
5827       isInvalid = DS.SetTypeQual(DeclSpec::TQ_const   , Loc, PrevSpec, DiagID,
5828                                  getLangOpts());
5829       break;
5830     case tok::kw_volatile:
5831       isInvalid = DS.SetTypeQual(DeclSpec::TQ_volatile, Loc, PrevSpec, DiagID,
5832                                  getLangOpts());
5833       break;
5834     case tok::kw_restrict:
5835       isInvalid = DS.SetTypeQual(DeclSpec::TQ_restrict, Loc, PrevSpec, DiagID,
5836                                  getLangOpts());
5837       break;
5838     case tok::kw__Atomic:
5839       if (!AtomicAllowed)
5840         goto DoneWithTypeQuals;
5841       if (!getLangOpts().C11)
5842         Diag(Tok, diag::ext_c11_feature) << Tok.getName();
5843       isInvalid = DS.SetTypeQual(DeclSpec::TQ_atomic, Loc, PrevSpec, DiagID,
5844                                  getLangOpts());
5845       break;
5846 
5847     // OpenCL qualifiers:
5848     case tok::kw_private:
5849       if (!getLangOpts().OpenCL)
5850         goto DoneWithTypeQuals;
5851       [[fallthrough]];
5852     case tok::kw___private:
5853     case tok::kw___global:
5854     case tok::kw___local:
5855     case tok::kw___constant:
5856     case tok::kw___generic:
5857     case tok::kw___read_only:
5858     case tok::kw___write_only:
5859     case tok::kw___read_write:
5860       ParseOpenCLQualifiers(DS.getAttributes());
5861       break;
5862 
5863     case tok::kw_groupshared:
5864       // NOTE: ParseHLSLQualifiers will consume the qualifier token.
5865       ParseHLSLQualifiers(DS.getAttributes());
5866       continue;
5867 
5868     case tok::kw___unaligned:
5869       isInvalid = DS.SetTypeQual(DeclSpec::TQ_unaligned, Loc, PrevSpec, DiagID,
5870                                  getLangOpts());
5871       break;
5872     case tok::kw___uptr:
5873       // GNU libc headers in C mode use '__uptr' as an identifier which conflicts
5874       // with the MS modifier keyword.
5875       if ((AttrReqs & AR_DeclspecAttributesParsed) && !getLangOpts().CPlusPlus &&
5876           IdentifierRequired && DS.isEmpty() && NextToken().is(tok::semi)) {
5877         if (TryKeywordIdentFallback(false))
5878           continue;
5879       }
5880       [[fallthrough]];
5881     case tok::kw___sptr:
5882     case tok::kw___w64:
5883     case tok::kw___ptr64:
5884     case tok::kw___ptr32:
5885     case tok::kw___cdecl:
5886     case tok::kw___stdcall:
5887     case tok::kw___fastcall:
5888     case tok::kw___thiscall:
5889     case tok::kw___regcall:
5890     case tok::kw___vectorcall:
5891       if (AttrReqs & AR_DeclspecAttributesParsed) {
5892         ParseMicrosoftTypeAttributes(DS.getAttributes());
5893         continue;
5894       }
5895       goto DoneWithTypeQuals;
5896     case tok::kw___pascal:
5897       if (AttrReqs & AR_VendorAttributesParsed) {
5898         ParseBorlandTypeAttributes(DS.getAttributes());
5899         continue;
5900       }
5901       goto DoneWithTypeQuals;
5902 
5903     // Nullability type specifiers.
5904     case tok::kw__Nonnull:
5905     case tok::kw__Nullable:
5906     case tok::kw__Nullable_result:
5907     case tok::kw__Null_unspecified:
5908       ParseNullabilityTypeSpecifiers(DS.getAttributes());
5909       continue;
5910 
5911     // Objective-C 'kindof' types.
5912     case tok::kw___kindof:
5913       DS.getAttributes().addNew(Tok.getIdentifierInfo(), Loc, nullptr, Loc,
5914                                 nullptr, 0, ParsedAttr::AS_Keyword);
5915       (void)ConsumeToken();
5916       continue;
5917 
5918     case tok::kw___attribute:
5919       if (AttrReqs & AR_GNUAttributesParsedAndRejected)
5920         // When GNU attributes are expressly forbidden, diagnose their usage.
5921         Diag(Tok, diag::err_attributes_not_allowed);
5922 
5923       // Parse the attributes even if they are rejected to ensure that error
5924       // recovery is graceful.
5925       if (AttrReqs & AR_GNUAttributesParsed ||
5926           AttrReqs & AR_GNUAttributesParsedAndRejected) {
5927         ParseGNUAttributes(DS.getAttributes());
5928         continue; // do *not* consume the next token!
5929       }
5930       // otherwise, FALL THROUGH!
5931       [[fallthrough]];
5932     default:
5933       DoneWithTypeQuals:
5934       // If this is not a type-qualifier token, we're done reading type
5935       // qualifiers.  First verify that DeclSpec's are consistent.
5936       DS.Finish(Actions, Actions.getASTContext().getPrintingPolicy());
5937       if (EndLoc.isValid())
5938         DS.SetRangeEnd(EndLoc);
5939       return;
5940     }
5941 
5942     // If the specifier combination wasn't legal, issue a diagnostic.
5943     if (isInvalid) {
5944       assert(PrevSpec && "Method did not return previous specifier!");
5945       Diag(Tok, DiagID) << PrevSpec;
5946     }
5947     EndLoc = ConsumeToken();
5948   }
5949 }
5950 
5951 /// ParseDeclarator - Parse and verify a newly-initialized declarator.
ParseDeclarator(Declarator & D)5952 void Parser::ParseDeclarator(Declarator &D) {
5953   /// This implements the 'declarator' production in the C grammar, then checks
5954   /// for well-formedness and issues diagnostics.
5955   Actions.runWithSufficientStackSpace(D.getBeginLoc(), [&] {
5956     ParseDeclaratorInternal(D, &Parser::ParseDirectDeclarator);
5957   });
5958 }
5959 
isPtrOperatorToken(tok::TokenKind Kind,const LangOptions & Lang,DeclaratorContext TheContext)5960 static bool isPtrOperatorToken(tok::TokenKind Kind, const LangOptions &Lang,
5961                                DeclaratorContext TheContext) {
5962   if (Kind == tok::star || Kind == tok::caret)
5963     return true;
5964 
5965   // OpenCL 2.0 and later define this keyword.
5966   if (Kind == tok::kw_pipe && Lang.OpenCL &&
5967       Lang.getOpenCLCompatibleVersion() >= 200)
5968     return true;
5969 
5970   if (!Lang.CPlusPlus)
5971     return false;
5972 
5973   if (Kind == tok::amp)
5974     return true;
5975 
5976   // We parse rvalue refs in C++03, because otherwise the errors are scary.
5977   // But we must not parse them in conversion-type-ids and new-type-ids, since
5978   // those can be legitimately followed by a && operator.
5979   // (The same thing can in theory happen after a trailing-return-type, but
5980   // since those are a C++11 feature, there is no rejects-valid issue there.)
5981   if (Kind == tok::ampamp)
5982     return Lang.CPlusPlus11 || (TheContext != DeclaratorContext::ConversionId &&
5983                                 TheContext != DeclaratorContext::CXXNew);
5984 
5985   return false;
5986 }
5987 
5988 // Indicates whether the given declarator is a pipe declarator.
isPipeDeclarator(const Declarator & D)5989 static bool isPipeDeclarator(const Declarator &D) {
5990   const unsigned NumTypes = D.getNumTypeObjects();
5991 
5992   for (unsigned Idx = 0; Idx != NumTypes; ++Idx)
5993     if (DeclaratorChunk::Pipe == D.getTypeObject(Idx).Kind)
5994       return true;
5995 
5996   return false;
5997 }
5998 
5999 /// ParseDeclaratorInternal - Parse a C or C++ declarator. The direct-declarator
6000 /// is parsed by the function passed to it. Pass null, and the direct-declarator
6001 /// isn't parsed at all, making this function effectively parse the C++
6002 /// ptr-operator production.
6003 ///
6004 /// If the grammar of this construct is extended, matching changes must also be
6005 /// made to TryParseDeclarator and MightBeDeclarator, and possibly to
6006 /// isConstructorDeclarator.
6007 ///
6008 ///       declarator: [C99 6.7.5] [C++ 8p4, dcl.decl]
6009 /// [C]     pointer[opt] direct-declarator
6010 /// [C++]   direct-declarator
6011 /// [C++]   ptr-operator declarator
6012 ///
6013 ///       pointer: [C99 6.7.5]
6014 ///         '*' type-qualifier-list[opt]
6015 ///         '*' type-qualifier-list[opt] pointer
6016 ///
6017 ///       ptr-operator:
6018 ///         '*' cv-qualifier-seq[opt]
6019 ///         '&'
6020 /// [C++0x] '&&'
6021 /// [GNU]   '&' restrict[opt] attributes[opt]
6022 /// [GNU?]  '&&' restrict[opt] attributes[opt]
6023 ///         '::'[opt] nested-name-specifier '*' cv-qualifier-seq[opt]
ParseDeclaratorInternal(Declarator & D,DirectDeclParseFunction DirectDeclParser)6024 void Parser::ParseDeclaratorInternal(Declarator &D,
6025                                      DirectDeclParseFunction DirectDeclParser) {
6026   if (Diags.hasAllExtensionsSilenced())
6027     D.setExtension();
6028 
6029   // C++ member pointers start with a '::' or a nested-name.
6030   // Member pointers get special handling, since there's no place for the
6031   // scope spec in the generic path below.
6032   if (getLangOpts().CPlusPlus &&
6033       (Tok.is(tok::coloncolon) || Tok.is(tok::kw_decltype) ||
6034        (Tok.is(tok::identifier) &&
6035         (NextToken().is(tok::coloncolon) || NextToken().is(tok::less))) ||
6036        Tok.is(tok::annot_cxxscope))) {
6037     bool EnteringContext = D.getContext() == DeclaratorContext::File ||
6038                            D.getContext() == DeclaratorContext::Member;
6039     CXXScopeSpec SS;
6040     ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/nullptr,
6041                                    /*ObjectHasErrors=*/false, EnteringContext);
6042 
6043     if (SS.isNotEmpty()) {
6044       if (Tok.isNot(tok::star)) {
6045         // The scope spec really belongs to the direct-declarator.
6046         if (D.mayHaveIdentifier())
6047           D.getCXXScopeSpec() = SS;
6048         else
6049           AnnotateScopeToken(SS, true);
6050 
6051         if (DirectDeclParser)
6052           (this->*DirectDeclParser)(D);
6053         return;
6054       }
6055 
6056       if (SS.isValid()) {
6057         checkCompoundToken(SS.getEndLoc(), tok::coloncolon,
6058                            CompoundToken::MemberPtr);
6059       }
6060 
6061       SourceLocation StarLoc = ConsumeToken();
6062       D.SetRangeEnd(StarLoc);
6063       DeclSpec DS(AttrFactory);
6064       ParseTypeQualifierListOpt(DS);
6065       D.ExtendWithDeclSpec(DS);
6066 
6067       // Recurse to parse whatever is left.
6068       Actions.runWithSufficientStackSpace(D.getBeginLoc(), [&] {
6069         ParseDeclaratorInternal(D, DirectDeclParser);
6070       });
6071 
6072       // Sema will have to catch (syntactically invalid) pointers into global
6073       // scope. It has to catch pointers into namespace scope anyway.
6074       D.AddTypeInfo(DeclaratorChunk::getMemberPointer(
6075                         SS, DS.getTypeQualifiers(), StarLoc, DS.getEndLoc()),
6076                     std::move(DS.getAttributes()),
6077                     /* Don't replace range end. */ SourceLocation());
6078       return;
6079     }
6080   }
6081 
6082   tok::TokenKind Kind = Tok.getKind();
6083 
6084   if (D.getDeclSpec().isTypeSpecPipe() && !isPipeDeclarator(D)) {
6085     DeclSpec DS(AttrFactory);
6086     ParseTypeQualifierListOpt(DS);
6087 
6088     D.AddTypeInfo(
6089         DeclaratorChunk::getPipe(DS.getTypeQualifiers(), DS.getPipeLoc()),
6090         std::move(DS.getAttributes()), SourceLocation());
6091   }
6092 
6093   // Not a pointer, C++ reference, or block.
6094   if (!isPtrOperatorToken(Kind, getLangOpts(), D.getContext())) {
6095     if (DirectDeclParser)
6096       (this->*DirectDeclParser)(D);
6097     return;
6098   }
6099 
6100   // Otherwise, '*' -> pointer, '^' -> block, '&' -> lvalue reference,
6101   // '&&' -> rvalue reference
6102   SourceLocation Loc = ConsumeToken();  // Eat the *, ^, & or &&.
6103   D.SetRangeEnd(Loc);
6104 
6105   if (Kind == tok::star || Kind == tok::caret) {
6106     // Is a pointer.
6107     DeclSpec DS(AttrFactory);
6108 
6109     // GNU attributes are not allowed here in a new-type-id, but Declspec and
6110     // C++11 attributes are allowed.
6111     unsigned Reqs = AR_CXX11AttributesParsed | AR_DeclspecAttributesParsed |
6112                     ((D.getContext() != DeclaratorContext::CXXNew)
6113                          ? AR_GNUAttributesParsed
6114                          : AR_GNUAttributesParsedAndRejected);
6115     ParseTypeQualifierListOpt(DS, Reqs, true, !D.mayOmitIdentifier());
6116     D.ExtendWithDeclSpec(DS);
6117 
6118     // Recursively parse the declarator.
6119     Actions.runWithSufficientStackSpace(
6120         D.getBeginLoc(), [&] { ParseDeclaratorInternal(D, DirectDeclParser); });
6121     if (Kind == tok::star)
6122       // Remember that we parsed a pointer type, and remember the type-quals.
6123       D.AddTypeInfo(DeclaratorChunk::getPointer(
6124                         DS.getTypeQualifiers(), Loc, DS.getConstSpecLoc(),
6125                         DS.getVolatileSpecLoc(), DS.getRestrictSpecLoc(),
6126                         DS.getAtomicSpecLoc(), DS.getUnalignedSpecLoc()),
6127                     std::move(DS.getAttributes()), SourceLocation());
6128     else
6129       // Remember that we parsed a Block type, and remember the type-quals.
6130       D.AddTypeInfo(
6131           DeclaratorChunk::getBlockPointer(DS.getTypeQualifiers(), Loc),
6132           std::move(DS.getAttributes()), SourceLocation());
6133   } else {
6134     // Is a reference
6135     DeclSpec DS(AttrFactory);
6136 
6137     // Complain about rvalue references in C++03, but then go on and build
6138     // the declarator.
6139     if (Kind == tok::ampamp)
6140       Diag(Loc, getLangOpts().CPlusPlus11 ?
6141            diag::warn_cxx98_compat_rvalue_reference :
6142            diag::ext_rvalue_reference);
6143 
6144     // GNU-style and C++11 attributes are allowed here, as is restrict.
6145     ParseTypeQualifierListOpt(DS);
6146     D.ExtendWithDeclSpec(DS);
6147 
6148     // C++ 8.3.2p1: cv-qualified references are ill-formed except when the
6149     // cv-qualifiers are introduced through the use of a typedef or of a
6150     // template type argument, in which case the cv-qualifiers are ignored.
6151     if (DS.getTypeQualifiers() != DeclSpec::TQ_unspecified) {
6152       if (DS.getTypeQualifiers() & DeclSpec::TQ_const)
6153         Diag(DS.getConstSpecLoc(),
6154              diag::err_invalid_reference_qualifier_application) << "const";
6155       if (DS.getTypeQualifiers() & DeclSpec::TQ_volatile)
6156         Diag(DS.getVolatileSpecLoc(),
6157              diag::err_invalid_reference_qualifier_application) << "volatile";
6158       // 'restrict' is permitted as an extension.
6159       if (DS.getTypeQualifiers() & DeclSpec::TQ_atomic)
6160         Diag(DS.getAtomicSpecLoc(),
6161              diag::err_invalid_reference_qualifier_application) << "_Atomic";
6162     }
6163 
6164     // Recursively parse the declarator.
6165     Actions.runWithSufficientStackSpace(
6166         D.getBeginLoc(), [&] { ParseDeclaratorInternal(D, DirectDeclParser); });
6167 
6168     if (D.getNumTypeObjects() > 0) {
6169       // C++ [dcl.ref]p4: There shall be no references to references.
6170       DeclaratorChunk& InnerChunk = D.getTypeObject(D.getNumTypeObjects() - 1);
6171       if (InnerChunk.Kind == DeclaratorChunk::Reference) {
6172         if (const IdentifierInfo *II = D.getIdentifier())
6173           Diag(InnerChunk.Loc, diag::err_illegal_decl_reference_to_reference)
6174            << II;
6175         else
6176           Diag(InnerChunk.Loc, diag::err_illegal_decl_reference_to_reference)
6177             << "type name";
6178 
6179         // Once we've complained about the reference-to-reference, we
6180         // can go ahead and build the (technically ill-formed)
6181         // declarator: reference collapsing will take care of it.
6182       }
6183     }
6184 
6185     // Remember that we parsed a reference type.
6186     D.AddTypeInfo(DeclaratorChunk::getReference(DS.getTypeQualifiers(), Loc,
6187                                                 Kind == tok::amp),
6188                   std::move(DS.getAttributes()), SourceLocation());
6189   }
6190 }
6191 
6192 // When correcting from misplaced brackets before the identifier, the location
6193 // is saved inside the declarator so that other diagnostic messages can use
6194 // them.  This extracts and returns that location, or returns the provided
6195 // location if a stored location does not exist.
getMissingDeclaratorIdLoc(Declarator & D,SourceLocation Loc)6196 static SourceLocation getMissingDeclaratorIdLoc(Declarator &D,
6197                                                 SourceLocation Loc) {
6198   if (D.getName().StartLocation.isInvalid() &&
6199       D.getName().EndLocation.isValid())
6200     return D.getName().EndLocation;
6201 
6202   return Loc;
6203 }
6204 
6205 /// ParseDirectDeclarator
6206 ///       direct-declarator: [C99 6.7.5]
6207 /// [C99]   identifier
6208 ///         '(' declarator ')'
6209 /// [GNU]   '(' attributes declarator ')'
6210 /// [C90]   direct-declarator '[' constant-expression[opt] ']'
6211 /// [C99]   direct-declarator '[' type-qual-list[opt] assignment-expr[opt] ']'
6212 /// [C99]   direct-declarator '[' 'static' type-qual-list[opt] assign-expr ']'
6213 /// [C99]   direct-declarator '[' type-qual-list 'static' assignment-expr ']'
6214 /// [C99]   direct-declarator '[' type-qual-list[opt] '*' ']'
6215 /// [C++11] direct-declarator '[' constant-expression[opt] ']'
6216 ///                    attribute-specifier-seq[opt]
6217 ///         direct-declarator '(' parameter-type-list ')'
6218 ///         direct-declarator '(' identifier-list[opt] ')'
6219 /// [GNU]   direct-declarator '(' parameter-forward-declarations
6220 ///                    parameter-type-list[opt] ')'
6221 /// [C++]   direct-declarator '(' parameter-declaration-clause ')'
6222 ///                    cv-qualifier-seq[opt] exception-specification[opt]
6223 /// [C++11] direct-declarator '(' parameter-declaration-clause ')'
6224 ///                    attribute-specifier-seq[opt] cv-qualifier-seq[opt]
6225 ///                    ref-qualifier[opt] exception-specification[opt]
6226 /// [C++]   declarator-id
6227 /// [C++11] declarator-id attribute-specifier-seq[opt]
6228 ///
6229 ///       declarator-id: [C++ 8]
6230 ///         '...'[opt] id-expression
6231 ///         '::'[opt] nested-name-specifier[opt] type-name
6232 ///
6233 ///       id-expression: [C++ 5.1]
6234 ///         unqualified-id
6235 ///         qualified-id
6236 ///
6237 ///       unqualified-id: [C++ 5.1]
6238 ///         identifier
6239 ///         operator-function-id
6240 ///         conversion-function-id
6241 ///          '~' class-name
6242 ///         template-id
6243 ///
6244 /// C++17 adds the following, which we also handle here:
6245 ///
6246 ///       simple-declaration:
6247 ///         <decl-spec> '[' identifier-list ']' brace-or-equal-initializer ';'
6248 ///
6249 /// Note, any additional constructs added here may need corresponding changes
6250 /// in isConstructorDeclarator.
ParseDirectDeclarator(Declarator & D)6251 void Parser::ParseDirectDeclarator(Declarator &D) {
6252   DeclaratorScopeObj DeclScopeObj(*this, D.getCXXScopeSpec());
6253 
6254   if (getLangOpts().CPlusPlus && D.mayHaveIdentifier()) {
6255     // This might be a C++17 structured binding.
6256     if (Tok.is(tok::l_square) && !D.mayOmitIdentifier() &&
6257         D.getCXXScopeSpec().isEmpty())
6258       return ParseDecompositionDeclarator(D);
6259 
6260     // Don't parse FOO:BAR as if it were a typo for FOO::BAR inside a class, in
6261     // this context it is a bitfield. Also in range-based for statement colon
6262     // may delimit for-range-declaration.
6263     ColonProtectionRAIIObject X(
6264         *this, D.getContext() == DeclaratorContext::Member ||
6265                    (D.getContext() == DeclaratorContext::ForInit &&
6266                     getLangOpts().CPlusPlus11));
6267 
6268     // ParseDeclaratorInternal might already have parsed the scope.
6269     if (D.getCXXScopeSpec().isEmpty()) {
6270       bool EnteringContext = D.getContext() == DeclaratorContext::File ||
6271                              D.getContext() == DeclaratorContext::Member;
6272       ParseOptionalCXXScopeSpecifier(
6273           D.getCXXScopeSpec(), /*ObjectType=*/nullptr,
6274           /*ObjectHasErrors=*/false, EnteringContext);
6275     }
6276 
6277     if (D.getCXXScopeSpec().isValid()) {
6278       if (Actions.ShouldEnterDeclaratorScope(getCurScope(),
6279                                              D.getCXXScopeSpec()))
6280         // Change the declaration context for name lookup, until this function
6281         // is exited (and the declarator has been parsed).
6282         DeclScopeObj.EnterDeclaratorScope();
6283       else if (getObjCDeclContext()) {
6284         // Ensure that we don't interpret the next token as an identifier when
6285         // dealing with declarations in an Objective-C container.
6286         D.SetIdentifier(nullptr, Tok.getLocation());
6287         D.setInvalidType(true);
6288         ConsumeToken();
6289         goto PastIdentifier;
6290       }
6291     }
6292 
6293     // C++0x [dcl.fct]p14:
6294     //   There is a syntactic ambiguity when an ellipsis occurs at the end of a
6295     //   parameter-declaration-clause without a preceding comma. In this case,
6296     //   the ellipsis is parsed as part of the abstract-declarator if the type
6297     //   of the parameter either names a template parameter pack that has not
6298     //   been expanded or contains auto; otherwise, it is parsed as part of the
6299     //   parameter-declaration-clause.
6300     if (Tok.is(tok::ellipsis) && D.getCXXScopeSpec().isEmpty() &&
6301         !((D.getContext() == DeclaratorContext::Prototype ||
6302            D.getContext() == DeclaratorContext::LambdaExprParameter ||
6303            D.getContext() == DeclaratorContext::BlockLiteral) &&
6304           NextToken().is(tok::r_paren) && !D.hasGroupingParens() &&
6305           !Actions.containsUnexpandedParameterPacks(D) &&
6306           D.getDeclSpec().getTypeSpecType() != TST_auto)) {
6307       SourceLocation EllipsisLoc = ConsumeToken();
6308       if (isPtrOperatorToken(Tok.getKind(), getLangOpts(), D.getContext())) {
6309         // The ellipsis was put in the wrong place. Recover, and explain to
6310         // the user what they should have done.
6311         ParseDeclarator(D);
6312         if (EllipsisLoc.isValid())
6313           DiagnoseMisplacedEllipsisInDeclarator(EllipsisLoc, D);
6314         return;
6315       } else
6316         D.setEllipsisLoc(EllipsisLoc);
6317 
6318       // The ellipsis can't be followed by a parenthesized declarator. We
6319       // check for that in ParseParenDeclarator, after we have disambiguated
6320       // the l_paren token.
6321     }
6322 
6323     if (Tok.isOneOf(tok::identifier, tok::kw_operator, tok::annot_template_id,
6324                     tok::tilde)) {
6325       // We found something that indicates the start of an unqualified-id.
6326       // Parse that unqualified-id.
6327       bool AllowConstructorName;
6328       bool AllowDeductionGuide;
6329       if (D.getDeclSpec().hasTypeSpecifier()) {
6330         AllowConstructorName = false;
6331         AllowDeductionGuide = false;
6332       } else if (D.getCXXScopeSpec().isSet()) {
6333         AllowConstructorName = (D.getContext() == DeclaratorContext::File ||
6334                                 D.getContext() == DeclaratorContext::Member);
6335         AllowDeductionGuide = false;
6336       } else {
6337         AllowConstructorName = (D.getContext() == DeclaratorContext::Member);
6338         AllowDeductionGuide = (D.getContext() == DeclaratorContext::File ||
6339                                D.getContext() == DeclaratorContext::Member);
6340       }
6341 
6342       bool HadScope = D.getCXXScopeSpec().isValid();
6343       if (ParseUnqualifiedId(D.getCXXScopeSpec(),
6344                              /*ObjectType=*/nullptr,
6345                              /*ObjectHadErrors=*/false,
6346                              /*EnteringContext=*/true,
6347                              /*AllowDestructorName=*/true, AllowConstructorName,
6348                              AllowDeductionGuide, nullptr, D.getName()) ||
6349           // Once we're past the identifier, if the scope was bad, mark the
6350           // whole declarator bad.
6351           D.getCXXScopeSpec().isInvalid()) {
6352         D.SetIdentifier(nullptr, Tok.getLocation());
6353         D.setInvalidType(true);
6354       } else {
6355         // ParseUnqualifiedId might have parsed a scope specifier during error
6356         // recovery. If it did so, enter that scope.
6357         if (!HadScope && D.getCXXScopeSpec().isValid() &&
6358             Actions.ShouldEnterDeclaratorScope(getCurScope(),
6359                                                D.getCXXScopeSpec()))
6360           DeclScopeObj.EnterDeclaratorScope();
6361 
6362         // Parsed the unqualified-id; update range information and move along.
6363         if (D.getSourceRange().getBegin().isInvalid())
6364           D.SetRangeBegin(D.getName().getSourceRange().getBegin());
6365         D.SetRangeEnd(D.getName().getSourceRange().getEnd());
6366       }
6367       goto PastIdentifier;
6368     }
6369 
6370     if (D.getCXXScopeSpec().isNotEmpty()) {
6371       // We have a scope specifier but no following unqualified-id.
6372       Diag(PP.getLocForEndOfToken(D.getCXXScopeSpec().getEndLoc()),
6373            diag::err_expected_unqualified_id)
6374           << /*C++*/1;
6375       D.SetIdentifier(nullptr, Tok.getLocation());
6376       goto PastIdentifier;
6377     }
6378   } else if (Tok.is(tok::identifier) && D.mayHaveIdentifier()) {
6379     assert(!getLangOpts().CPlusPlus &&
6380            "There's a C++-specific check for tok::identifier above");
6381     assert(Tok.getIdentifierInfo() && "Not an identifier?");
6382     D.SetIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
6383     D.SetRangeEnd(Tok.getLocation());
6384     ConsumeToken();
6385     goto PastIdentifier;
6386   } else if (Tok.is(tok::identifier) && !D.mayHaveIdentifier()) {
6387     // We're not allowed an identifier here, but we got one. Try to figure out
6388     // if the user was trying to attach a name to the type, or whether the name
6389     // is some unrelated trailing syntax.
6390     bool DiagnoseIdentifier = false;
6391     if (D.hasGroupingParens())
6392       // An identifier within parens is unlikely to be intended to be anything
6393       // other than a name being "declared".
6394       DiagnoseIdentifier = true;
6395     else if (D.getContext() == DeclaratorContext::TemplateArg)
6396       // T<int N> is an accidental identifier; T<int N indicates a missing '>'.
6397       DiagnoseIdentifier =
6398           NextToken().isOneOf(tok::comma, tok::greater, tok::greatergreater);
6399     else if (D.getContext() == DeclaratorContext::AliasDecl ||
6400              D.getContext() == DeclaratorContext::AliasTemplate)
6401       // The most likely error is that the ';' was forgotten.
6402       DiagnoseIdentifier = NextToken().isOneOf(tok::comma, tok::semi);
6403     else if ((D.getContext() == DeclaratorContext::TrailingReturn ||
6404               D.getContext() == DeclaratorContext::TrailingReturnVar) &&
6405              !isCXX11VirtSpecifier(Tok))
6406       DiagnoseIdentifier = NextToken().isOneOf(
6407           tok::comma, tok::semi, tok::equal, tok::l_brace, tok::kw_try);
6408     if (DiagnoseIdentifier) {
6409       Diag(Tok.getLocation(), diag::err_unexpected_unqualified_id)
6410         << FixItHint::CreateRemoval(Tok.getLocation());
6411       D.SetIdentifier(nullptr, Tok.getLocation());
6412       ConsumeToken();
6413       goto PastIdentifier;
6414     }
6415   }
6416 
6417   if (Tok.is(tok::l_paren)) {
6418     // If this might be an abstract-declarator followed by a direct-initializer,
6419     // check whether this is a valid declarator chunk. If it can't be, assume
6420     // that it's an initializer instead.
6421     if (D.mayOmitIdentifier() && D.mayBeFollowedByCXXDirectInit()) {
6422       RevertingTentativeParsingAction PA(*this);
6423       if (TryParseDeclarator(true, D.mayHaveIdentifier(), true) ==
6424               TPResult::False) {
6425         D.SetIdentifier(nullptr, Tok.getLocation());
6426         goto PastIdentifier;
6427       }
6428     }
6429 
6430     // direct-declarator: '(' declarator ')'
6431     // direct-declarator: '(' attributes declarator ')'
6432     // Example: 'char (*X)'   or 'int (*XX)(void)'
6433     ParseParenDeclarator(D);
6434 
6435     // If the declarator was parenthesized, we entered the declarator
6436     // scope when parsing the parenthesized declarator, then exited
6437     // the scope already. Re-enter the scope, if we need to.
6438     if (D.getCXXScopeSpec().isSet()) {
6439       // If there was an error parsing parenthesized declarator, declarator
6440       // scope may have been entered before. Don't do it again.
6441       if (!D.isInvalidType() &&
6442           Actions.ShouldEnterDeclaratorScope(getCurScope(),
6443                                              D.getCXXScopeSpec()))
6444         // Change the declaration context for name lookup, until this function
6445         // is exited (and the declarator has been parsed).
6446         DeclScopeObj.EnterDeclaratorScope();
6447     }
6448   } else if (D.mayOmitIdentifier()) {
6449     // This could be something simple like "int" (in which case the declarator
6450     // portion is empty), if an abstract-declarator is allowed.
6451     D.SetIdentifier(nullptr, Tok.getLocation());
6452 
6453     // The grammar for abstract-pack-declarator does not allow grouping parens.
6454     // FIXME: Revisit this once core issue 1488 is resolved.
6455     if (D.hasEllipsis() && D.hasGroupingParens())
6456       Diag(PP.getLocForEndOfToken(D.getEllipsisLoc()),
6457            diag::ext_abstract_pack_declarator_parens);
6458   } else {
6459     if (Tok.getKind() == tok::annot_pragma_parser_crash)
6460       LLVM_BUILTIN_TRAP;
6461     if (Tok.is(tok::l_square))
6462       return ParseMisplacedBracketDeclarator(D);
6463     if (D.getContext() == DeclaratorContext::Member) {
6464       // Objective-C++: Detect C++ keywords and try to prevent further errors by
6465       // treating these keyword as valid member names.
6466       if (getLangOpts().ObjC && getLangOpts().CPlusPlus &&
6467           Tok.getIdentifierInfo() &&
6468           Tok.getIdentifierInfo()->isCPlusPlusKeyword(getLangOpts())) {
6469         Diag(getMissingDeclaratorIdLoc(D, Tok.getLocation()),
6470              diag::err_expected_member_name_or_semi_objcxx_keyword)
6471             << Tok.getIdentifierInfo()
6472             << (D.getDeclSpec().isEmpty() ? SourceRange()
6473                                           : D.getDeclSpec().getSourceRange());
6474         D.SetIdentifier(Tok.getIdentifierInfo(), Tok.getLocation());
6475         D.SetRangeEnd(Tok.getLocation());
6476         ConsumeToken();
6477         goto PastIdentifier;
6478       }
6479       Diag(getMissingDeclaratorIdLoc(D, Tok.getLocation()),
6480            diag::err_expected_member_name_or_semi)
6481           << (D.getDeclSpec().isEmpty() ? SourceRange()
6482                                         : D.getDeclSpec().getSourceRange());
6483     } else {
6484       if (Tok.getKind() == tok::TokenKind::kw_while) {
6485         Diag(Tok, diag::err_while_loop_outside_of_a_function);
6486       } else if (getLangOpts().CPlusPlus) {
6487         if (Tok.isOneOf(tok::period, tok::arrow))
6488           Diag(Tok, diag::err_invalid_operator_on_type) << Tok.is(tok::arrow);
6489         else {
6490           SourceLocation Loc = D.getCXXScopeSpec().getEndLoc();
6491           if (Tok.isAtStartOfLine() && Loc.isValid())
6492             Diag(PP.getLocForEndOfToken(Loc), diag::err_expected_unqualified_id)
6493                 << getLangOpts().CPlusPlus;
6494           else
6495             Diag(getMissingDeclaratorIdLoc(D, Tok.getLocation()),
6496                  diag::err_expected_unqualified_id)
6497                 << getLangOpts().CPlusPlus;
6498         }
6499       } else {
6500         Diag(getMissingDeclaratorIdLoc(D, Tok.getLocation()),
6501              diag::err_expected_either)
6502             << tok::identifier << tok::l_paren;
6503       }
6504     }
6505     D.SetIdentifier(nullptr, Tok.getLocation());
6506     D.setInvalidType(true);
6507   }
6508 
6509  PastIdentifier:
6510   assert(D.isPastIdentifier() &&
6511          "Haven't past the location of the identifier yet?");
6512 
6513   // Don't parse attributes unless we have parsed an unparenthesized name.
6514   if (D.hasName() && !D.getNumTypeObjects())
6515     MaybeParseCXX11Attributes(D);
6516 
6517   while (true) {
6518     if (Tok.is(tok::l_paren)) {
6519       bool IsFunctionDeclaration = D.isFunctionDeclaratorAFunctionDeclaration();
6520       // Enter function-declaration scope, limiting any declarators to the
6521       // function prototype scope, including parameter declarators.
6522       ParseScope PrototypeScope(this,
6523                                 Scope::FunctionPrototypeScope|Scope::DeclScope|
6524                                 (IsFunctionDeclaration
6525                                    ? Scope::FunctionDeclarationScope : 0));
6526 
6527       // The paren may be part of a C++ direct initializer, eg. "int x(1);".
6528       // In such a case, check if we actually have a function declarator; if it
6529       // is not, the declarator has been fully parsed.
6530       bool IsAmbiguous = false;
6531       if (getLangOpts().CPlusPlus && D.mayBeFollowedByCXXDirectInit()) {
6532         // C++2a [temp.res]p5
6533         // A qualified-id is assumed to name a type if
6534         //   - [...]
6535         //   - it is a decl-specifier of the decl-specifier-seq of a
6536         //     - [...]
6537         //     - parameter-declaration in a member-declaration [...]
6538         //     - parameter-declaration in a declarator of a function or function
6539         //       template declaration whose declarator-id is qualified [...]
6540         auto AllowImplicitTypename = ImplicitTypenameContext::No;
6541         if (D.getCXXScopeSpec().isSet())
6542           AllowImplicitTypename =
6543               (ImplicitTypenameContext)Actions.isDeclaratorFunctionLike(D);
6544         else if (D.getContext() == DeclaratorContext::Member) {
6545           AllowImplicitTypename = ImplicitTypenameContext::Yes;
6546         }
6547 
6548         // The name of the declarator, if any, is tentatively declared within
6549         // a possible direct initializer.
6550         TentativelyDeclaredIdentifiers.push_back(D.getIdentifier());
6551         bool IsFunctionDecl =
6552             isCXXFunctionDeclarator(&IsAmbiguous, AllowImplicitTypename);
6553         TentativelyDeclaredIdentifiers.pop_back();
6554         if (!IsFunctionDecl)
6555           break;
6556       }
6557       ParsedAttributes attrs(AttrFactory);
6558       BalancedDelimiterTracker T(*this, tok::l_paren);
6559       T.consumeOpen();
6560       if (IsFunctionDeclaration)
6561         Actions.ActOnStartFunctionDeclarationDeclarator(D,
6562                                                         TemplateParameterDepth);
6563       ParseFunctionDeclarator(D, attrs, T, IsAmbiguous);
6564       if (IsFunctionDeclaration)
6565         Actions.ActOnFinishFunctionDeclarationDeclarator(D);
6566       PrototypeScope.Exit();
6567     } else if (Tok.is(tok::l_square)) {
6568       ParseBracketDeclarator(D);
6569     } else if (Tok.is(tok::kw_requires) && D.hasGroupingParens()) {
6570       // This declarator is declaring a function, but the requires clause is
6571       // in the wrong place:
6572       //   void (f() requires true);
6573       // instead of
6574       //   void f() requires true;
6575       // or
6576       //   void (f()) requires true;
6577       Diag(Tok, diag::err_requires_clause_inside_parens);
6578       ConsumeToken();
6579       ExprResult TrailingRequiresClause = Actions.CorrectDelayedTyposInExpr(
6580          ParseConstraintLogicalOrExpression(/*IsTrailingRequiresClause=*/true));
6581       if (TrailingRequiresClause.isUsable() && D.isFunctionDeclarator() &&
6582           !D.hasTrailingRequiresClause())
6583         // We're already ill-formed if we got here but we'll accept it anyway.
6584         D.setTrailingRequiresClause(TrailingRequiresClause.get());
6585     } else {
6586       break;
6587     }
6588   }
6589 }
6590 
ParseDecompositionDeclarator(Declarator & D)6591 void Parser::ParseDecompositionDeclarator(Declarator &D) {
6592   assert(Tok.is(tok::l_square));
6593 
6594   // If this doesn't look like a structured binding, maybe it's a misplaced
6595   // array declarator.
6596   // FIXME: Consume the l_square first so we don't need extra lookahead for
6597   // this.
6598   if (!(NextToken().is(tok::identifier) &&
6599         GetLookAheadToken(2).isOneOf(tok::comma, tok::r_square)) &&
6600       !(NextToken().is(tok::r_square) &&
6601         GetLookAheadToken(2).isOneOf(tok::equal, tok::l_brace)))
6602     return ParseMisplacedBracketDeclarator(D);
6603 
6604   BalancedDelimiterTracker T(*this, tok::l_square);
6605   T.consumeOpen();
6606 
6607   SmallVector<DecompositionDeclarator::Binding, 32> Bindings;
6608   while (Tok.isNot(tok::r_square)) {
6609     if (!Bindings.empty()) {
6610       if (Tok.is(tok::comma))
6611         ConsumeToken();
6612       else {
6613         if (Tok.is(tok::identifier)) {
6614           SourceLocation EndLoc = getEndOfPreviousToken();
6615           Diag(EndLoc, diag::err_expected)
6616               << tok::comma << FixItHint::CreateInsertion(EndLoc, ",");
6617         } else {
6618           Diag(Tok, diag::err_expected_comma_or_rsquare);
6619         }
6620 
6621         SkipUntil(tok::r_square, tok::comma, tok::identifier,
6622                   StopAtSemi | StopBeforeMatch);
6623         if (Tok.is(tok::comma))
6624           ConsumeToken();
6625         else if (Tok.isNot(tok::identifier))
6626           break;
6627       }
6628     }
6629 
6630     if (Tok.isNot(tok::identifier)) {
6631       Diag(Tok, diag::err_expected) << tok::identifier;
6632       break;
6633     }
6634 
6635     Bindings.push_back({Tok.getIdentifierInfo(), Tok.getLocation()});
6636     ConsumeToken();
6637   }
6638 
6639   if (Tok.isNot(tok::r_square))
6640     // We've already diagnosed a problem here.
6641     T.skipToEnd();
6642   else {
6643     // C++17 does not allow the identifier-list in a structured binding
6644     // to be empty.
6645     if (Bindings.empty())
6646       Diag(Tok.getLocation(), diag::ext_decomp_decl_empty);
6647 
6648     T.consumeClose();
6649   }
6650 
6651   return D.setDecompositionBindings(T.getOpenLocation(), Bindings,
6652                                     T.getCloseLocation());
6653 }
6654 
6655 /// ParseParenDeclarator - We parsed the declarator D up to a paren.  This is
6656 /// only called before the identifier, so these are most likely just grouping
6657 /// parens for precedence.  If we find that these are actually function
6658 /// parameter parens in an abstract-declarator, we call ParseFunctionDeclarator.
6659 ///
6660 ///       direct-declarator:
6661 ///         '(' declarator ')'
6662 /// [GNU]   '(' attributes declarator ')'
6663 ///         direct-declarator '(' parameter-type-list ')'
6664 ///         direct-declarator '(' identifier-list[opt] ')'
6665 /// [GNU]   direct-declarator '(' parameter-forward-declarations
6666 ///                    parameter-type-list[opt] ')'
6667 ///
ParseParenDeclarator(Declarator & D)6668 void Parser::ParseParenDeclarator(Declarator &D) {
6669   BalancedDelimiterTracker T(*this, tok::l_paren);
6670   T.consumeOpen();
6671 
6672   assert(!D.isPastIdentifier() && "Should be called before passing identifier");
6673 
6674   // Eat any attributes before we look at whether this is a grouping or function
6675   // declarator paren.  If this is a grouping paren, the attribute applies to
6676   // the type being built up, for example:
6677   //     int (__attribute__(()) *x)(long y)
6678   // If this ends up not being a grouping paren, the attribute applies to the
6679   // first argument, for example:
6680   //     int (__attribute__(()) int x)
6681   // In either case, we need to eat any attributes to be able to determine what
6682   // sort of paren this is.
6683   //
6684   ParsedAttributes attrs(AttrFactory);
6685   bool RequiresArg = false;
6686   if (Tok.is(tok::kw___attribute)) {
6687     ParseGNUAttributes(attrs);
6688 
6689     // We require that the argument list (if this is a non-grouping paren) be
6690     // present even if the attribute list was empty.
6691     RequiresArg = true;
6692   }
6693 
6694   // Eat any Microsoft extensions.
6695   ParseMicrosoftTypeAttributes(attrs);
6696 
6697   // Eat any Borland extensions.
6698   if  (Tok.is(tok::kw___pascal))
6699     ParseBorlandTypeAttributes(attrs);
6700 
6701   // If we haven't past the identifier yet (or where the identifier would be
6702   // stored, if this is an abstract declarator), then this is probably just
6703   // grouping parens. However, if this could be an abstract-declarator, then
6704   // this could also be the start of function arguments (consider 'void()').
6705   bool isGrouping;
6706 
6707   if (!D.mayOmitIdentifier()) {
6708     // If this can't be an abstract-declarator, this *must* be a grouping
6709     // paren, because we haven't seen the identifier yet.
6710     isGrouping = true;
6711   } else if (Tok.is(tok::r_paren) || // 'int()' is a function.
6712              (getLangOpts().CPlusPlus && Tok.is(tok::ellipsis) &&
6713               NextToken().is(tok::r_paren)) || // C++ int(...)
6714              isDeclarationSpecifier(
6715                  ImplicitTypenameContext::No) || // 'int(int)' is a function.
6716              isCXX11AttributeSpecifier()) { // 'int([[]]int)' is a function.
6717     // This handles C99 6.7.5.3p11: in "typedef int X; void foo(X)", X is
6718     // considered to be a type, not a K&R identifier-list.
6719     isGrouping = false;
6720   } else {
6721     // Otherwise, this is a grouping paren, e.g. 'int (*X)' or 'int(X)'.
6722     isGrouping = true;
6723   }
6724 
6725   // If this is a grouping paren, handle:
6726   // direct-declarator: '(' declarator ')'
6727   // direct-declarator: '(' attributes declarator ')'
6728   if (isGrouping) {
6729     SourceLocation EllipsisLoc = D.getEllipsisLoc();
6730     D.setEllipsisLoc(SourceLocation());
6731 
6732     bool hadGroupingParens = D.hasGroupingParens();
6733     D.setGroupingParens(true);
6734     ParseDeclaratorInternal(D, &Parser::ParseDirectDeclarator);
6735     // Match the ')'.
6736     T.consumeClose();
6737     D.AddTypeInfo(
6738         DeclaratorChunk::getParen(T.getOpenLocation(), T.getCloseLocation()),
6739         std::move(attrs), T.getCloseLocation());
6740 
6741     D.setGroupingParens(hadGroupingParens);
6742 
6743     // An ellipsis cannot be placed outside parentheses.
6744     if (EllipsisLoc.isValid())
6745       DiagnoseMisplacedEllipsisInDeclarator(EllipsisLoc, D);
6746 
6747     return;
6748   }
6749 
6750   // Okay, if this wasn't a grouping paren, it must be the start of a function
6751   // argument list.  Recognize that this declarator will never have an
6752   // identifier (and remember where it would have been), then call into
6753   // ParseFunctionDeclarator to handle of argument list.
6754   D.SetIdentifier(nullptr, Tok.getLocation());
6755 
6756   // Enter function-declaration scope, limiting any declarators to the
6757   // function prototype scope, including parameter declarators.
6758   ParseScope PrototypeScope(this,
6759                             Scope::FunctionPrototypeScope | Scope::DeclScope |
6760                             (D.isFunctionDeclaratorAFunctionDeclaration()
6761                                ? Scope::FunctionDeclarationScope : 0));
6762   ParseFunctionDeclarator(D, attrs, T, false, RequiresArg);
6763   PrototypeScope.Exit();
6764 }
6765 
InitCXXThisScopeForDeclaratorIfRelevant(const Declarator & D,const DeclSpec & DS,std::optional<Sema::CXXThisScopeRAII> & ThisScope)6766 void Parser::InitCXXThisScopeForDeclaratorIfRelevant(
6767     const Declarator &D, const DeclSpec &DS,
6768     std::optional<Sema::CXXThisScopeRAII> &ThisScope) {
6769   // C++11 [expr.prim.general]p3:
6770   //   If a declaration declares a member function or member function
6771   //   template of a class X, the expression this is a prvalue of type
6772   //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
6773   //   and the end of the function-definition, member-declarator, or
6774   //   declarator.
6775   // FIXME: currently, "static" case isn't handled correctly.
6776   bool IsCXX11MemberFunction =
6777       getLangOpts().CPlusPlus11 &&
6778       D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef &&
6779       (D.getContext() == DeclaratorContext::Member
6780            ? !D.getDeclSpec().isFriendSpecified()
6781            : D.getContext() == DeclaratorContext::File &&
6782                  D.getCXXScopeSpec().isValid() &&
6783                  Actions.CurContext->isRecord());
6784   if (!IsCXX11MemberFunction)
6785     return;
6786 
6787   Qualifiers Q = Qualifiers::fromCVRUMask(DS.getTypeQualifiers());
6788   if (D.getDeclSpec().hasConstexprSpecifier() && !getLangOpts().CPlusPlus14)
6789     Q.addConst();
6790   // FIXME: Collect C++ address spaces.
6791   // If there are multiple different address spaces, the source is invalid.
6792   // Carry on using the first addr space for the qualifiers of 'this'.
6793   // The diagnostic will be given later while creating the function
6794   // prototype for the method.
6795   if (getLangOpts().OpenCLCPlusPlus) {
6796     for (ParsedAttr &attr : DS.getAttributes()) {
6797       LangAS ASIdx = attr.asOpenCLLangAS();
6798       if (ASIdx != LangAS::Default) {
6799         Q.addAddressSpace(ASIdx);
6800         break;
6801       }
6802     }
6803   }
6804   ThisScope.emplace(Actions, dyn_cast<CXXRecordDecl>(Actions.CurContext), Q,
6805                     IsCXX11MemberFunction);
6806 }
6807 
6808 /// ParseFunctionDeclarator - We are after the identifier and have parsed the
6809 /// declarator D up to a paren, which indicates that we are parsing function
6810 /// arguments.
6811 ///
6812 /// If FirstArgAttrs is non-null, then the caller parsed those attributes
6813 /// immediately after the open paren - they will be applied to the DeclSpec
6814 /// of the first parameter.
6815 ///
6816 /// If RequiresArg is true, then the first argument of the function is required
6817 /// to be present and required to not be an identifier list.
6818 ///
6819 /// For C++, after the parameter-list, it also parses the cv-qualifier-seq[opt],
6820 /// (C++11) ref-qualifier[opt], exception-specification[opt],
6821 /// (C++11) attribute-specifier-seq[opt], (C++11) trailing-return-type[opt] and
6822 /// (C++2a) the trailing requires-clause.
6823 ///
6824 /// [C++11] exception-specification:
6825 ///           dynamic-exception-specification
6826 ///           noexcept-specification
6827 ///
ParseFunctionDeclarator(Declarator & D,ParsedAttributes & FirstArgAttrs,BalancedDelimiterTracker & Tracker,bool IsAmbiguous,bool RequiresArg)6828 void Parser::ParseFunctionDeclarator(Declarator &D,
6829                                      ParsedAttributes &FirstArgAttrs,
6830                                      BalancedDelimiterTracker &Tracker,
6831                                      bool IsAmbiguous,
6832                                      bool RequiresArg) {
6833   assert(getCurScope()->isFunctionPrototypeScope() &&
6834          "Should call from a Function scope");
6835   // lparen is already consumed!
6836   assert(D.isPastIdentifier() && "Should not call before identifier!");
6837 
6838   // This should be true when the function has typed arguments.
6839   // Otherwise, it is treated as a K&R-style function.
6840   bool HasProto = false;
6841   // Build up an array of information about the parsed arguments.
6842   SmallVector<DeclaratorChunk::ParamInfo, 16> ParamInfo;
6843   // Remember where we see an ellipsis, if any.
6844   SourceLocation EllipsisLoc;
6845 
6846   DeclSpec DS(AttrFactory);
6847   bool RefQualifierIsLValueRef = true;
6848   SourceLocation RefQualifierLoc;
6849   ExceptionSpecificationType ESpecType = EST_None;
6850   SourceRange ESpecRange;
6851   SmallVector<ParsedType, 2> DynamicExceptions;
6852   SmallVector<SourceRange, 2> DynamicExceptionRanges;
6853   ExprResult NoexceptExpr;
6854   CachedTokens *ExceptionSpecTokens = nullptr;
6855   ParsedAttributes FnAttrs(AttrFactory);
6856   TypeResult TrailingReturnType;
6857   SourceLocation TrailingReturnTypeLoc;
6858 
6859   /* LocalEndLoc is the end location for the local FunctionTypeLoc.
6860      EndLoc is the end location for the function declarator.
6861      They differ for trailing return types. */
6862   SourceLocation StartLoc, LocalEndLoc, EndLoc;
6863   SourceLocation LParenLoc, RParenLoc;
6864   LParenLoc = Tracker.getOpenLocation();
6865   StartLoc = LParenLoc;
6866 
6867   if (isFunctionDeclaratorIdentifierList()) {
6868     if (RequiresArg)
6869       Diag(Tok, diag::err_argument_required_after_attribute);
6870 
6871     ParseFunctionDeclaratorIdentifierList(D, ParamInfo);
6872 
6873     Tracker.consumeClose();
6874     RParenLoc = Tracker.getCloseLocation();
6875     LocalEndLoc = RParenLoc;
6876     EndLoc = RParenLoc;
6877 
6878     // If there are attributes following the identifier list, parse them and
6879     // prohibit them.
6880     MaybeParseCXX11Attributes(FnAttrs);
6881     ProhibitAttributes(FnAttrs);
6882   } else {
6883     if (Tok.isNot(tok::r_paren))
6884       ParseParameterDeclarationClause(D, FirstArgAttrs, ParamInfo, EllipsisLoc);
6885     else if (RequiresArg)
6886       Diag(Tok, diag::err_argument_required_after_attribute);
6887 
6888     // OpenCL disallows functions without a prototype, but it doesn't enforce
6889     // strict prototypes as in C2x because it allows a function definition to
6890     // have an identifier list. See OpenCL 3.0 6.11/g for more details.
6891     HasProto = ParamInfo.size() || getLangOpts().requiresStrictPrototypes() ||
6892                getLangOpts().OpenCL;
6893 
6894     // If we have the closing ')', eat it.
6895     Tracker.consumeClose();
6896     RParenLoc = Tracker.getCloseLocation();
6897     LocalEndLoc = RParenLoc;
6898     EndLoc = RParenLoc;
6899 
6900     if (getLangOpts().CPlusPlus) {
6901       // FIXME: Accept these components in any order, and produce fixits to
6902       // correct the order if the user gets it wrong. Ideally we should deal
6903       // with the pure-specifier in the same way.
6904 
6905       // Parse cv-qualifier-seq[opt].
6906       ParseTypeQualifierListOpt(DS, AR_NoAttributesParsed,
6907                                 /*AtomicAllowed*/ false,
6908                                 /*IdentifierRequired=*/false,
6909                                 llvm::function_ref<void()>([&]() {
6910                                   Actions.CodeCompleteFunctionQualifiers(DS, D);
6911                                 }));
6912       if (!DS.getSourceRange().getEnd().isInvalid()) {
6913         EndLoc = DS.getSourceRange().getEnd();
6914       }
6915 
6916       // Parse ref-qualifier[opt].
6917       if (ParseRefQualifier(RefQualifierIsLValueRef, RefQualifierLoc))
6918         EndLoc = RefQualifierLoc;
6919 
6920       std::optional<Sema::CXXThisScopeRAII> ThisScope;
6921       InitCXXThisScopeForDeclaratorIfRelevant(D, DS, ThisScope);
6922 
6923       // Parse exception-specification[opt].
6924       // FIXME: Per [class.mem]p6, all exception-specifications at class scope
6925       // should be delayed, including those for non-members (eg, friend
6926       // declarations). But only applying this to member declarations is
6927       // consistent with what other implementations do.
6928       bool Delayed = D.isFirstDeclarationOfMember() &&
6929                      D.isFunctionDeclaratorAFunctionDeclaration();
6930       if (Delayed && Actions.isLibstdcxxEagerExceptionSpecHack(D) &&
6931           GetLookAheadToken(0).is(tok::kw_noexcept) &&
6932           GetLookAheadToken(1).is(tok::l_paren) &&
6933           GetLookAheadToken(2).is(tok::kw_noexcept) &&
6934           GetLookAheadToken(3).is(tok::l_paren) &&
6935           GetLookAheadToken(4).is(tok::identifier) &&
6936           GetLookAheadToken(4).getIdentifierInfo()->isStr("swap")) {
6937         // HACK: We've got an exception-specification
6938         //   noexcept(noexcept(swap(...)))
6939         // or
6940         //   noexcept(noexcept(swap(...)) && noexcept(swap(...)))
6941         // on a 'swap' member function. This is a libstdc++ bug; the lookup
6942         // for 'swap' will only find the function we're currently declaring,
6943         // whereas it expects to find a non-member swap through ADL. Turn off
6944         // delayed parsing to give it a chance to find what it expects.
6945         Delayed = false;
6946       }
6947       ESpecType = tryParseExceptionSpecification(Delayed,
6948                                                  ESpecRange,
6949                                                  DynamicExceptions,
6950                                                  DynamicExceptionRanges,
6951                                                  NoexceptExpr,
6952                                                  ExceptionSpecTokens);
6953       if (ESpecType != EST_None)
6954         EndLoc = ESpecRange.getEnd();
6955 
6956       // Parse attribute-specifier-seq[opt]. Per DR 979 and DR 1297, this goes
6957       // after the exception-specification.
6958       MaybeParseCXX11Attributes(FnAttrs);
6959 
6960       // Parse trailing-return-type[opt].
6961       LocalEndLoc = EndLoc;
6962       if (getLangOpts().CPlusPlus11 && Tok.is(tok::arrow)) {
6963         Diag(Tok, diag::warn_cxx98_compat_trailing_return_type);
6964         if (D.getDeclSpec().getTypeSpecType() == TST_auto)
6965           StartLoc = D.getDeclSpec().getTypeSpecTypeLoc();
6966         LocalEndLoc = Tok.getLocation();
6967         SourceRange Range;
6968         TrailingReturnType =
6969             ParseTrailingReturnType(Range, D.mayBeFollowedByCXXDirectInit());
6970         TrailingReturnTypeLoc = Range.getBegin();
6971         EndLoc = Range.getEnd();
6972       }
6973     } else if (standardAttributesAllowed()) {
6974       MaybeParseCXX11Attributes(FnAttrs);
6975     }
6976   }
6977 
6978   // Collect non-parameter declarations from the prototype if this is a function
6979   // declaration. They will be moved into the scope of the function. Only do
6980   // this in C and not C++, where the decls will continue to live in the
6981   // surrounding context.
6982   SmallVector<NamedDecl *, 0> DeclsInPrototype;
6983   if (getCurScope()->isFunctionDeclarationScope() && !getLangOpts().CPlusPlus) {
6984     for (Decl *D : getCurScope()->decls()) {
6985       NamedDecl *ND = dyn_cast<NamedDecl>(D);
6986       if (!ND || isa<ParmVarDecl>(ND))
6987         continue;
6988       DeclsInPrototype.push_back(ND);
6989     }
6990   }
6991 
6992   // Remember that we parsed a function type, and remember the attributes.
6993   D.AddTypeInfo(DeclaratorChunk::getFunction(
6994                     HasProto, IsAmbiguous, LParenLoc, ParamInfo.data(),
6995                     ParamInfo.size(), EllipsisLoc, RParenLoc,
6996                     RefQualifierIsLValueRef, RefQualifierLoc,
6997                     /*MutableLoc=*/SourceLocation(),
6998                     ESpecType, ESpecRange, DynamicExceptions.data(),
6999                     DynamicExceptionRanges.data(), DynamicExceptions.size(),
7000                     NoexceptExpr.isUsable() ? NoexceptExpr.get() : nullptr,
7001                     ExceptionSpecTokens, DeclsInPrototype, StartLoc,
7002                     LocalEndLoc, D, TrailingReturnType, TrailingReturnTypeLoc,
7003                     &DS),
7004                 std::move(FnAttrs), EndLoc);
7005 }
7006 
7007 /// ParseRefQualifier - Parses a member function ref-qualifier. Returns
7008 /// true if a ref-qualifier is found.
ParseRefQualifier(bool & RefQualifierIsLValueRef,SourceLocation & RefQualifierLoc)7009 bool Parser::ParseRefQualifier(bool &RefQualifierIsLValueRef,
7010                                SourceLocation &RefQualifierLoc) {
7011   if (Tok.isOneOf(tok::amp, tok::ampamp)) {
7012     Diag(Tok, getLangOpts().CPlusPlus11 ?
7013          diag::warn_cxx98_compat_ref_qualifier :
7014          diag::ext_ref_qualifier);
7015 
7016     RefQualifierIsLValueRef = Tok.is(tok::amp);
7017     RefQualifierLoc = ConsumeToken();
7018     return true;
7019   }
7020   return false;
7021 }
7022 
7023 /// isFunctionDeclaratorIdentifierList - This parameter list may have an
7024 /// identifier list form for a K&R-style function:  void foo(a,b,c)
7025 ///
7026 /// Note that identifier-lists are only allowed for normal declarators, not for
7027 /// abstract-declarators.
isFunctionDeclaratorIdentifierList()7028 bool Parser::isFunctionDeclaratorIdentifierList() {
7029   return !getLangOpts().requiresStrictPrototypes()
7030          && Tok.is(tok::identifier)
7031          && !TryAltiVecVectorToken()
7032          // K&R identifier lists can't have typedefs as identifiers, per C99
7033          // 6.7.5.3p11.
7034          && (TryAnnotateTypeOrScopeToken() || !Tok.is(tok::annot_typename))
7035          // Identifier lists follow a really simple grammar: the identifiers can
7036          // be followed *only* by a ", identifier" or ")".  However, K&R
7037          // identifier lists are really rare in the brave new modern world, and
7038          // it is very common for someone to typo a type in a non-K&R style
7039          // list.  If we are presented with something like: "void foo(intptr x,
7040          // float y)", we don't want to start parsing the function declarator as
7041          // though it is a K&R style declarator just because intptr is an
7042          // invalid type.
7043          //
7044          // To handle this, we check to see if the token after the first
7045          // identifier is a "," or ")".  Only then do we parse it as an
7046          // identifier list.
7047          && (!Tok.is(tok::eof) &&
7048              (NextToken().is(tok::comma) || NextToken().is(tok::r_paren)));
7049 }
7050 
7051 /// ParseFunctionDeclaratorIdentifierList - While parsing a function declarator
7052 /// we found a K&R-style identifier list instead of a typed parameter list.
7053 ///
7054 /// After returning, ParamInfo will hold the parsed parameters.
7055 ///
7056 ///       identifier-list: [C99 6.7.5]
7057 ///         identifier
7058 ///         identifier-list ',' identifier
7059 ///
ParseFunctionDeclaratorIdentifierList(Declarator & D,SmallVectorImpl<DeclaratorChunk::ParamInfo> & ParamInfo)7060 void Parser::ParseFunctionDeclaratorIdentifierList(
7061        Declarator &D,
7062        SmallVectorImpl<DeclaratorChunk::ParamInfo> &ParamInfo) {
7063   // We should never reach this point in C2x or C++.
7064   assert(!getLangOpts().requiresStrictPrototypes() &&
7065          "Cannot parse an identifier list in C2x or C++");
7066 
7067   // If there was no identifier specified for the declarator, either we are in
7068   // an abstract-declarator, or we are in a parameter declarator which was found
7069   // to be abstract.  In abstract-declarators, identifier lists are not valid:
7070   // diagnose this.
7071   if (!D.getIdentifier())
7072     Diag(Tok, diag::ext_ident_list_in_param);
7073 
7074   // Maintain an efficient lookup of params we have seen so far.
7075   llvm::SmallSet<const IdentifierInfo*, 16> ParamsSoFar;
7076 
7077   do {
7078     // If this isn't an identifier, report the error and skip until ')'.
7079     if (Tok.isNot(tok::identifier)) {
7080       Diag(Tok, diag::err_expected) << tok::identifier;
7081       SkipUntil(tok::r_paren, StopAtSemi | StopBeforeMatch);
7082       // Forget we parsed anything.
7083       ParamInfo.clear();
7084       return;
7085     }
7086 
7087     IdentifierInfo *ParmII = Tok.getIdentifierInfo();
7088 
7089     // Reject 'typedef int y; int test(x, y)', but continue parsing.
7090     if (Actions.getTypeName(*ParmII, Tok.getLocation(), getCurScope()))
7091       Diag(Tok, diag::err_unexpected_typedef_ident) << ParmII;
7092 
7093     // Verify that the argument identifier has not already been mentioned.
7094     if (!ParamsSoFar.insert(ParmII).second) {
7095       Diag(Tok, diag::err_param_redefinition) << ParmII;
7096     } else {
7097       // Remember this identifier in ParamInfo.
7098       ParamInfo.push_back(DeclaratorChunk::ParamInfo(ParmII,
7099                                                      Tok.getLocation(),
7100                                                      nullptr));
7101     }
7102 
7103     // Eat the identifier.
7104     ConsumeToken();
7105     // The list continues if we see a comma.
7106   } while (TryConsumeToken(tok::comma));
7107 }
7108 
7109 /// ParseParameterDeclarationClause - Parse a (possibly empty) parameter-list
7110 /// after the opening parenthesis. This function will not parse a K&R-style
7111 /// identifier list.
7112 ///
7113 /// DeclContext is the context of the declarator being parsed.  If FirstArgAttrs
7114 /// is non-null, then the caller parsed those attributes immediately after the
7115 /// open paren - they will be applied to the DeclSpec of the first parameter.
7116 ///
7117 /// After returning, ParamInfo will hold the parsed parameters. EllipsisLoc will
7118 /// be the location of the ellipsis, if any was parsed.
7119 ///
7120 ///       parameter-type-list: [C99 6.7.5]
7121 ///         parameter-list
7122 ///         parameter-list ',' '...'
7123 /// [C++]   parameter-list '...'
7124 ///
7125 ///       parameter-list: [C99 6.7.5]
7126 ///         parameter-declaration
7127 ///         parameter-list ',' parameter-declaration
7128 ///
7129 ///       parameter-declaration: [C99 6.7.5]
7130 ///         declaration-specifiers declarator
7131 /// [C++]   declaration-specifiers declarator '=' assignment-expression
7132 /// [C++11]                                       initializer-clause
7133 /// [GNU]   declaration-specifiers declarator attributes
7134 ///         declaration-specifiers abstract-declarator[opt]
7135 /// [C++]   declaration-specifiers abstract-declarator[opt]
7136 ///           '=' assignment-expression
7137 /// [GNU]   declaration-specifiers abstract-declarator[opt] attributes
7138 /// [C++11] attribute-specifier-seq parameter-declaration
7139 ///
ParseParameterDeclarationClause(DeclaratorContext DeclaratorCtx,ParsedAttributes & FirstArgAttrs,SmallVectorImpl<DeclaratorChunk::ParamInfo> & ParamInfo,SourceLocation & EllipsisLoc,bool IsACXXFunctionDeclaration)7140 void Parser::ParseParameterDeclarationClause(
7141     DeclaratorContext DeclaratorCtx, ParsedAttributes &FirstArgAttrs,
7142     SmallVectorImpl<DeclaratorChunk::ParamInfo> &ParamInfo,
7143     SourceLocation &EllipsisLoc, bool IsACXXFunctionDeclaration) {
7144 
7145   // Avoid exceeding the maximum function scope depth.
7146   // See https://bugs.llvm.org/show_bug.cgi?id=19607
7147   // Note Sema::ActOnParamDeclarator calls ParmVarDecl::setScopeInfo with
7148   // getFunctionPrototypeDepth() - 1.
7149   if (getCurScope()->getFunctionPrototypeDepth() - 1 >
7150       ParmVarDecl::getMaxFunctionScopeDepth()) {
7151     Diag(Tok.getLocation(), diag::err_function_scope_depth_exceeded)
7152         << ParmVarDecl::getMaxFunctionScopeDepth();
7153     cutOffParsing();
7154     return;
7155   }
7156 
7157   // C++2a [temp.res]p5
7158   // A qualified-id is assumed to name a type if
7159   //   - [...]
7160   //   - it is a decl-specifier of the decl-specifier-seq of a
7161   //     - [...]
7162   //     - parameter-declaration in a member-declaration [...]
7163   //     - parameter-declaration in a declarator of a function or function
7164   //       template declaration whose declarator-id is qualified [...]
7165   //     - parameter-declaration in a lambda-declarator [...]
7166   auto AllowImplicitTypename = ImplicitTypenameContext::No;
7167   if (DeclaratorCtx == DeclaratorContext::Member ||
7168       DeclaratorCtx == DeclaratorContext::LambdaExpr ||
7169       DeclaratorCtx == DeclaratorContext::RequiresExpr ||
7170       IsACXXFunctionDeclaration) {
7171     AllowImplicitTypename = ImplicitTypenameContext::Yes;
7172   }
7173 
7174   do {
7175     // FIXME: Issue a diagnostic if we parsed an attribute-specifier-seq
7176     // before deciding this was a parameter-declaration-clause.
7177     if (TryConsumeToken(tok::ellipsis, EllipsisLoc))
7178       break;
7179 
7180     // Parse the declaration-specifiers.
7181     // Just use the ParsingDeclaration "scope" of the declarator.
7182     DeclSpec DS(AttrFactory);
7183 
7184     ParsedAttributes ArgDeclAttrs(AttrFactory);
7185     ParsedAttributes ArgDeclSpecAttrs(AttrFactory);
7186 
7187     if (FirstArgAttrs.Range.isValid()) {
7188       // If the caller parsed attributes for the first argument, add them now.
7189       // Take them so that we only apply the attributes to the first parameter.
7190       // We have already started parsing the decl-specifier sequence, so don't
7191       // parse any parameter-declaration pieces that precede it.
7192       ArgDeclSpecAttrs.takeAllFrom(FirstArgAttrs);
7193     } else {
7194       // Parse any C++11 attributes.
7195       MaybeParseCXX11Attributes(ArgDeclAttrs);
7196 
7197       // Skip any Microsoft attributes before a param.
7198       MaybeParseMicrosoftAttributes(ArgDeclSpecAttrs);
7199     }
7200 
7201     SourceLocation DSStart = Tok.getLocation();
7202 
7203     ParseDeclarationSpecifiers(DS, /*TemplateInfo=*/ParsedTemplateInfo(),
7204                                AS_none, DeclSpecContext::DSC_normal,
7205                                /*LateAttrs=*/nullptr, AllowImplicitTypename);
7206     DS.takeAttributesFrom(ArgDeclSpecAttrs);
7207 
7208     // Parse the declarator.  This is "PrototypeContext" or
7209     // "LambdaExprParameterContext", because we must accept either
7210     // 'declarator' or 'abstract-declarator' here.
7211     Declarator ParmDeclarator(DS, ArgDeclAttrs,
7212                               DeclaratorCtx == DeclaratorContext::RequiresExpr
7213                                   ? DeclaratorContext::RequiresExpr
7214                               : DeclaratorCtx == DeclaratorContext::LambdaExpr
7215                                   ? DeclaratorContext::LambdaExprParameter
7216                                   : DeclaratorContext::Prototype);
7217     ParseDeclarator(ParmDeclarator);
7218 
7219     // Parse GNU attributes, if present.
7220     MaybeParseGNUAttributes(ParmDeclarator);
7221     if (getLangOpts().HLSL)
7222       MaybeParseHLSLSemantics(DS.getAttributes());
7223 
7224     if (Tok.is(tok::kw_requires)) {
7225       // User tried to define a requires clause in a parameter declaration,
7226       // which is surely not a function declaration.
7227       // void f(int (*g)(int, int) requires true);
7228       Diag(Tok,
7229            diag::err_requires_clause_on_declarator_not_declaring_a_function);
7230       ConsumeToken();
7231       Actions.CorrectDelayedTyposInExpr(
7232          ParseConstraintLogicalOrExpression(/*IsTrailingRequiresClause=*/true));
7233     }
7234 
7235     // Remember this parsed parameter in ParamInfo.
7236     IdentifierInfo *ParmII = ParmDeclarator.getIdentifier();
7237 
7238     // DefArgToks is used when the parsing of default arguments needs
7239     // to be delayed.
7240     std::unique_ptr<CachedTokens> DefArgToks;
7241 
7242     // If no parameter was specified, verify that *something* was specified,
7243     // otherwise we have a missing type and identifier.
7244     if (DS.isEmpty() && ParmDeclarator.getIdentifier() == nullptr &&
7245         ParmDeclarator.getNumTypeObjects() == 0) {
7246       // Completely missing, emit error.
7247       Diag(DSStart, diag::err_missing_param);
7248     } else {
7249       // Otherwise, we have something.  Add it and let semantic analysis try
7250       // to grok it and add the result to the ParamInfo we are building.
7251 
7252       // Last chance to recover from a misplaced ellipsis in an attempted
7253       // parameter pack declaration.
7254       if (Tok.is(tok::ellipsis) &&
7255           (NextToken().isNot(tok::r_paren) ||
7256            (!ParmDeclarator.getEllipsisLoc().isValid() &&
7257             !Actions.isUnexpandedParameterPackPermitted())) &&
7258           Actions.containsUnexpandedParameterPacks(ParmDeclarator))
7259         DiagnoseMisplacedEllipsisInDeclarator(ConsumeToken(), ParmDeclarator);
7260 
7261       // Now we are at the point where declarator parsing is finished.
7262       //
7263       // Try to catch keywords in place of the identifier in a declarator, and
7264       // in particular the common case where:
7265       //   1 identifier comes at the end of the declarator
7266       //   2 if the identifier is dropped, the declarator is valid but anonymous
7267       //     (no identifier)
7268       //   3 declarator parsing succeeds, and then we have a trailing keyword,
7269       //     which is never valid in a param list (e.g. missing a ',')
7270       // And we can't handle this in ParseDeclarator because in general keywords
7271       // may be allowed to follow the declarator. (And in some cases there'd be
7272       // better recovery like inserting punctuation). ParseDeclarator is just
7273       // treating this as an anonymous parameter, and fortunately at this point
7274       // we've already almost done that.
7275       //
7276       // We care about case 1) where the declarator type should be known, and
7277       // the identifier should be null.
7278       if (!ParmDeclarator.isInvalidType() && !ParmDeclarator.hasName() &&
7279           Tok.isNot(tok::raw_identifier) && !Tok.isAnnotation() &&
7280           Tok.getIdentifierInfo() &&
7281           Tok.getIdentifierInfo()->isKeyword(getLangOpts())) {
7282         Diag(Tok, diag::err_keyword_as_parameter) << PP.getSpelling(Tok);
7283         // Consume the keyword.
7284         ConsumeToken();
7285       }
7286       // Inform the actions module about the parameter declarator, so it gets
7287       // added to the current scope.
7288       Decl *Param = Actions.ActOnParamDeclarator(getCurScope(), ParmDeclarator);
7289       // Parse the default argument, if any. We parse the default
7290       // arguments in all dialects; the semantic analysis in
7291       // ActOnParamDefaultArgument will reject the default argument in
7292       // C.
7293       if (Tok.is(tok::equal)) {
7294         SourceLocation EqualLoc = Tok.getLocation();
7295 
7296         // Parse the default argument
7297         if (DeclaratorCtx == DeclaratorContext::Member) {
7298           // If we're inside a class definition, cache the tokens
7299           // corresponding to the default argument. We'll actually parse
7300           // them when we see the end of the class definition.
7301           DefArgToks.reset(new CachedTokens);
7302 
7303           SourceLocation ArgStartLoc = NextToken().getLocation();
7304           if (!ConsumeAndStoreInitializer(*DefArgToks, CIK_DefaultArgument)) {
7305             DefArgToks.reset();
7306             Actions.ActOnParamDefaultArgumentError(Param, EqualLoc);
7307           } else {
7308             Actions.ActOnParamUnparsedDefaultArgument(Param, EqualLoc,
7309                                                       ArgStartLoc);
7310           }
7311         } else {
7312           // Consume the '='.
7313           ConsumeToken();
7314 
7315           // The argument isn't actually potentially evaluated unless it is
7316           // used.
7317           EnterExpressionEvaluationContext Eval(
7318               Actions,
7319               Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed,
7320               Param);
7321 
7322           ExprResult DefArgResult;
7323           if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {
7324             Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
7325             DefArgResult = ParseBraceInitializer();
7326           } else {
7327             if (Tok.is(tok::l_paren) && NextToken().is(tok::l_brace)) {
7328               Diag(Tok, diag::err_stmt_expr_in_default_arg) << 0;
7329               Actions.ActOnParamDefaultArgumentError(Param, EqualLoc);
7330               // Skip the statement expression and continue parsing
7331               SkipUntil(tok::comma, StopBeforeMatch);
7332               continue;
7333             }
7334             DefArgResult = ParseAssignmentExpression();
7335           }
7336           DefArgResult = Actions.CorrectDelayedTyposInExpr(DefArgResult);
7337           if (DefArgResult.isInvalid()) {
7338             Actions.ActOnParamDefaultArgumentError(Param, EqualLoc);
7339             SkipUntil(tok::comma, tok::r_paren, StopAtSemi | StopBeforeMatch);
7340           } else {
7341             // Inform the actions module about the default argument
7342             Actions.ActOnParamDefaultArgument(Param, EqualLoc,
7343                                               DefArgResult.get());
7344           }
7345         }
7346       }
7347 
7348       ParamInfo.push_back(DeclaratorChunk::ParamInfo(ParmII,
7349                                           ParmDeclarator.getIdentifierLoc(),
7350                                           Param, std::move(DefArgToks)));
7351     }
7352 
7353     if (TryConsumeToken(tok::ellipsis, EllipsisLoc)) {
7354       if (!getLangOpts().CPlusPlus) {
7355         // We have ellipsis without a preceding ',', which is ill-formed
7356         // in C. Complain and provide the fix.
7357         Diag(EllipsisLoc, diag::err_missing_comma_before_ellipsis)
7358             << FixItHint::CreateInsertion(EllipsisLoc, ", ");
7359       } else if (ParmDeclarator.getEllipsisLoc().isValid() ||
7360                  Actions.containsUnexpandedParameterPacks(ParmDeclarator)) {
7361         // It looks like this was supposed to be a parameter pack. Warn and
7362         // point out where the ellipsis should have gone.
7363         SourceLocation ParmEllipsis = ParmDeclarator.getEllipsisLoc();
7364         Diag(EllipsisLoc, diag::warn_misplaced_ellipsis_vararg)
7365           << ParmEllipsis.isValid() << ParmEllipsis;
7366         if (ParmEllipsis.isValid()) {
7367           Diag(ParmEllipsis,
7368                diag::note_misplaced_ellipsis_vararg_existing_ellipsis);
7369         } else {
7370           Diag(ParmDeclarator.getIdentifierLoc(),
7371                diag::note_misplaced_ellipsis_vararg_add_ellipsis)
7372             << FixItHint::CreateInsertion(ParmDeclarator.getIdentifierLoc(),
7373                                           "...")
7374             << !ParmDeclarator.hasName();
7375         }
7376         Diag(EllipsisLoc, diag::note_misplaced_ellipsis_vararg_add_comma)
7377           << FixItHint::CreateInsertion(EllipsisLoc, ", ");
7378       }
7379 
7380       // We can't have any more parameters after an ellipsis.
7381       break;
7382     }
7383 
7384     // If the next token is a comma, consume it and keep reading arguments.
7385   } while (TryConsumeToken(tok::comma));
7386 }
7387 
7388 /// [C90]   direct-declarator '[' constant-expression[opt] ']'
7389 /// [C99]   direct-declarator '[' type-qual-list[opt] assignment-expr[opt] ']'
7390 /// [C99]   direct-declarator '[' 'static' type-qual-list[opt] assign-expr ']'
7391 /// [C99]   direct-declarator '[' type-qual-list 'static' assignment-expr ']'
7392 /// [C99]   direct-declarator '[' type-qual-list[opt] '*' ']'
7393 /// [C++11] direct-declarator '[' constant-expression[opt] ']'
7394 ///                           attribute-specifier-seq[opt]
ParseBracketDeclarator(Declarator & D)7395 void Parser::ParseBracketDeclarator(Declarator &D) {
7396   if (CheckProhibitedCXX11Attribute())
7397     return;
7398 
7399   BalancedDelimiterTracker T(*this, tok::l_square);
7400   T.consumeOpen();
7401 
7402   // C array syntax has many features, but by-far the most common is [] and [4].
7403   // This code does a fast path to handle some of the most obvious cases.
7404   if (Tok.getKind() == tok::r_square) {
7405     T.consumeClose();
7406     ParsedAttributes attrs(AttrFactory);
7407     MaybeParseCXX11Attributes(attrs);
7408 
7409     // Remember that we parsed the empty array type.
7410     D.AddTypeInfo(DeclaratorChunk::getArray(0, false, false, nullptr,
7411                                             T.getOpenLocation(),
7412                                             T.getCloseLocation()),
7413                   std::move(attrs), T.getCloseLocation());
7414     return;
7415   } else if (Tok.getKind() == tok::numeric_constant &&
7416              GetLookAheadToken(1).is(tok::r_square)) {
7417     // [4] is very common.  Parse the numeric constant expression.
7418     ExprResult ExprRes(Actions.ActOnNumericConstant(Tok, getCurScope()));
7419     ConsumeToken();
7420 
7421     T.consumeClose();
7422     ParsedAttributes attrs(AttrFactory);
7423     MaybeParseCXX11Attributes(attrs);
7424 
7425     // Remember that we parsed a array type, and remember its features.
7426     D.AddTypeInfo(DeclaratorChunk::getArray(0, false, false, ExprRes.get(),
7427                                             T.getOpenLocation(),
7428                                             T.getCloseLocation()),
7429                   std::move(attrs), T.getCloseLocation());
7430     return;
7431   } else if (Tok.getKind() == tok::code_completion) {
7432     cutOffParsing();
7433     Actions.CodeCompleteBracketDeclarator(getCurScope());
7434     return;
7435   }
7436 
7437   // If valid, this location is the position where we read the 'static' keyword.
7438   SourceLocation StaticLoc;
7439   TryConsumeToken(tok::kw_static, StaticLoc);
7440 
7441   // If there is a type-qualifier-list, read it now.
7442   // Type qualifiers in an array subscript are a C99 feature.
7443   DeclSpec DS(AttrFactory);
7444   ParseTypeQualifierListOpt(DS, AR_CXX11AttributesParsed);
7445 
7446   // If we haven't already read 'static', check to see if there is one after the
7447   // type-qualifier-list.
7448   if (!StaticLoc.isValid())
7449     TryConsumeToken(tok::kw_static, StaticLoc);
7450 
7451   // Handle "direct-declarator [ type-qual-list[opt] * ]".
7452   bool isStar = false;
7453   ExprResult NumElements;
7454 
7455   // Handle the case where we have '[*]' as the array size.  However, a leading
7456   // star could be the start of an expression, for example 'X[*p + 4]'.  Verify
7457   // the token after the star is a ']'.  Since stars in arrays are
7458   // infrequent, use of lookahead is not costly here.
7459   if (Tok.is(tok::star) && GetLookAheadToken(1).is(tok::r_square)) {
7460     ConsumeToken();  // Eat the '*'.
7461 
7462     if (StaticLoc.isValid()) {
7463       Diag(StaticLoc, diag::err_unspecified_vla_size_with_static);
7464       StaticLoc = SourceLocation();  // Drop the static.
7465     }
7466     isStar = true;
7467   } else if (Tok.isNot(tok::r_square)) {
7468     // Note, in C89, this production uses the constant-expr production instead
7469     // of assignment-expr.  The only difference is that assignment-expr allows
7470     // things like '=' and '*='.  Sema rejects these in C89 mode because they
7471     // are not i-c-e's, so we don't need to distinguish between the two here.
7472 
7473     // Parse the constant-expression or assignment-expression now (depending
7474     // on dialect).
7475     if (getLangOpts().CPlusPlus) {
7476       NumElements = ParseConstantExpression();
7477     } else {
7478       EnterExpressionEvaluationContext Unevaluated(
7479           Actions, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7480       NumElements =
7481           Actions.CorrectDelayedTyposInExpr(ParseAssignmentExpression());
7482     }
7483   } else {
7484     if (StaticLoc.isValid()) {
7485       Diag(StaticLoc, diag::err_unspecified_size_with_static);
7486       StaticLoc = SourceLocation();  // Drop the static.
7487     }
7488   }
7489 
7490   // If there was an error parsing the assignment-expression, recover.
7491   if (NumElements.isInvalid()) {
7492     D.setInvalidType(true);
7493     // If the expression was invalid, skip it.
7494     SkipUntil(tok::r_square, StopAtSemi);
7495     return;
7496   }
7497 
7498   T.consumeClose();
7499 
7500   MaybeParseCXX11Attributes(DS.getAttributes());
7501 
7502   // Remember that we parsed a array type, and remember its features.
7503   D.AddTypeInfo(
7504       DeclaratorChunk::getArray(DS.getTypeQualifiers(), StaticLoc.isValid(),
7505                                 isStar, NumElements.get(), T.getOpenLocation(),
7506                                 T.getCloseLocation()),
7507       std::move(DS.getAttributes()), T.getCloseLocation());
7508 }
7509 
7510 /// Diagnose brackets before an identifier.
ParseMisplacedBracketDeclarator(Declarator & D)7511 void Parser::ParseMisplacedBracketDeclarator(Declarator &D) {
7512   assert(Tok.is(tok::l_square) && "Missing opening bracket");
7513   assert(!D.mayOmitIdentifier() && "Declarator cannot omit identifier");
7514 
7515   SourceLocation StartBracketLoc = Tok.getLocation();
7516   Declarator TempDeclarator(D.getDeclSpec(), ParsedAttributesView::none(),
7517                             D.getContext());
7518 
7519   while (Tok.is(tok::l_square)) {
7520     ParseBracketDeclarator(TempDeclarator);
7521   }
7522 
7523   // Stuff the location of the start of the brackets into the Declarator.
7524   // The diagnostics from ParseDirectDeclarator will make more sense if
7525   // they use this location instead.
7526   if (Tok.is(tok::semi))
7527     D.getName().EndLocation = StartBracketLoc;
7528 
7529   SourceLocation SuggestParenLoc = Tok.getLocation();
7530 
7531   // Now that the brackets are removed, try parsing the declarator again.
7532   ParseDeclaratorInternal(D, &Parser::ParseDirectDeclarator);
7533 
7534   // Something went wrong parsing the brackets, in which case,
7535   // ParseBracketDeclarator has emitted an error, and we don't need to emit
7536   // one here.
7537   if (TempDeclarator.getNumTypeObjects() == 0)
7538     return;
7539 
7540   // Determine if parens will need to be suggested in the diagnostic.
7541   bool NeedParens = false;
7542   if (D.getNumTypeObjects() != 0) {
7543     switch (D.getTypeObject(D.getNumTypeObjects() - 1).Kind) {
7544     case DeclaratorChunk::Pointer:
7545     case DeclaratorChunk::Reference:
7546     case DeclaratorChunk::BlockPointer:
7547     case DeclaratorChunk::MemberPointer:
7548     case DeclaratorChunk::Pipe:
7549       NeedParens = true;
7550       break;
7551     case DeclaratorChunk::Array:
7552     case DeclaratorChunk::Function:
7553     case DeclaratorChunk::Paren:
7554       break;
7555     }
7556   }
7557 
7558   if (NeedParens) {
7559     // Create a DeclaratorChunk for the inserted parens.
7560     SourceLocation EndLoc = PP.getLocForEndOfToken(D.getEndLoc());
7561     D.AddTypeInfo(DeclaratorChunk::getParen(SuggestParenLoc, EndLoc),
7562                   SourceLocation());
7563   }
7564 
7565   // Adding back the bracket info to the end of the Declarator.
7566   for (unsigned i = 0, e = TempDeclarator.getNumTypeObjects(); i < e; ++i) {
7567     const DeclaratorChunk &Chunk = TempDeclarator.getTypeObject(i);
7568     D.AddTypeInfo(Chunk, SourceLocation());
7569   }
7570 
7571   // The missing identifier would have been diagnosed in ParseDirectDeclarator.
7572   // If parentheses are required, always suggest them.
7573   if (!D.getIdentifier() && !NeedParens)
7574     return;
7575 
7576   SourceLocation EndBracketLoc = TempDeclarator.getEndLoc();
7577 
7578   // Generate the move bracket error message.
7579   SourceRange BracketRange(StartBracketLoc, EndBracketLoc);
7580   SourceLocation EndLoc = PP.getLocForEndOfToken(D.getEndLoc());
7581 
7582   if (NeedParens) {
7583     Diag(EndLoc, diag::err_brackets_go_after_unqualified_id)
7584         << getLangOpts().CPlusPlus
7585         << FixItHint::CreateInsertion(SuggestParenLoc, "(")
7586         << FixItHint::CreateInsertion(EndLoc, ")")
7587         << FixItHint::CreateInsertionFromRange(
7588                EndLoc, CharSourceRange(BracketRange, true))
7589         << FixItHint::CreateRemoval(BracketRange);
7590   } else {
7591     Diag(EndLoc, diag::err_brackets_go_after_unqualified_id)
7592         << getLangOpts().CPlusPlus
7593         << FixItHint::CreateInsertionFromRange(
7594                EndLoc, CharSourceRange(BracketRange, true))
7595         << FixItHint::CreateRemoval(BracketRange);
7596   }
7597 }
7598 
7599 /// [GNU]   typeof-specifier:
7600 ///           typeof ( expressions )
7601 ///           typeof ( type-name )
7602 /// [GNU/C++] typeof unary-expression
7603 /// [C2x]   typeof-specifier:
7604 ///           typeof '(' typeof-specifier-argument ')'
7605 ///           typeof_unqual '(' typeof-specifier-argument ')'
7606 ///
7607 ///         typeof-specifier-argument:
7608 ///           expression
7609 ///           type-name
7610 ///
ParseTypeofSpecifier(DeclSpec & DS)7611 void Parser::ParseTypeofSpecifier(DeclSpec &DS) {
7612   assert(Tok.isOneOf(tok::kw_typeof, tok::kw_typeof_unqual) &&
7613          "Not a typeof specifier");
7614 
7615   bool IsUnqual = Tok.is(tok::kw_typeof_unqual);
7616   const IdentifierInfo *II = Tok.getIdentifierInfo();
7617   if (getLangOpts().C2x && !II->getName().startswith("__"))
7618     Diag(Tok.getLocation(), diag::warn_c2x_compat_typeof_type_specifier)
7619         << IsUnqual;
7620 
7621   Token OpTok = Tok;
7622   SourceLocation StartLoc = ConsumeToken();
7623   bool HasParens = Tok.is(tok::l_paren);
7624 
7625   EnterExpressionEvaluationContext Unevaluated(
7626       Actions, Sema::ExpressionEvaluationContext::Unevaluated,
7627       Sema::ReuseLambdaContextDecl);
7628 
7629   bool isCastExpr;
7630   ParsedType CastTy;
7631   SourceRange CastRange;
7632   ExprResult Operand = Actions.CorrectDelayedTyposInExpr(
7633       ParseExprAfterUnaryExprOrTypeTrait(OpTok, isCastExpr, CastTy, CastRange));
7634   if (HasParens)
7635     DS.setTypeArgumentRange(CastRange);
7636 
7637   if (CastRange.getEnd().isInvalid())
7638     // FIXME: Not accurate, the range gets one token more than it should.
7639     DS.SetRangeEnd(Tok.getLocation());
7640   else
7641     DS.SetRangeEnd(CastRange.getEnd());
7642 
7643   if (isCastExpr) {
7644     if (!CastTy) {
7645       DS.SetTypeSpecError();
7646       return;
7647     }
7648 
7649     const char *PrevSpec = nullptr;
7650     unsigned DiagID;
7651     // Check for duplicate type specifiers (e.g. "int typeof(int)").
7652     if (DS.SetTypeSpecType(IsUnqual ? DeclSpec::TST_typeof_unqualType
7653                                     : DeclSpec::TST_typeofType,
7654                            StartLoc, PrevSpec,
7655                            DiagID, CastTy,
7656                            Actions.getASTContext().getPrintingPolicy()))
7657       Diag(StartLoc, DiagID) << PrevSpec;
7658     return;
7659   }
7660 
7661   // If we get here, the operand to the typeof was an expression.
7662   if (Operand.isInvalid()) {
7663     DS.SetTypeSpecError();
7664     return;
7665   }
7666 
7667   // We might need to transform the operand if it is potentially evaluated.
7668   Operand = Actions.HandleExprEvaluationContextForTypeof(Operand.get());
7669   if (Operand.isInvalid()) {
7670     DS.SetTypeSpecError();
7671     return;
7672   }
7673 
7674   const char *PrevSpec = nullptr;
7675   unsigned DiagID;
7676   // Check for duplicate type specifiers (e.g. "int typeof(int)").
7677   if (DS.SetTypeSpecType(IsUnqual ? DeclSpec::TST_typeof_unqualExpr
7678                                   : DeclSpec::TST_typeofExpr,
7679                          StartLoc, PrevSpec,
7680                          DiagID, Operand.get(),
7681                          Actions.getASTContext().getPrintingPolicy()))
7682     Diag(StartLoc, DiagID) << PrevSpec;
7683 }
7684 
7685 /// [C11]   atomic-specifier:
7686 ///           _Atomic ( type-name )
7687 ///
ParseAtomicSpecifier(DeclSpec & DS)7688 void Parser::ParseAtomicSpecifier(DeclSpec &DS) {
7689   assert(Tok.is(tok::kw__Atomic) && NextToken().is(tok::l_paren) &&
7690          "Not an atomic specifier");
7691 
7692   SourceLocation StartLoc = ConsumeToken();
7693   BalancedDelimiterTracker T(*this, tok::l_paren);
7694   if (T.consumeOpen())
7695     return;
7696 
7697   TypeResult Result = ParseTypeName();
7698   if (Result.isInvalid()) {
7699     SkipUntil(tok::r_paren, StopAtSemi);
7700     return;
7701   }
7702 
7703   // Match the ')'
7704   T.consumeClose();
7705 
7706   if (T.getCloseLocation().isInvalid())
7707     return;
7708 
7709   DS.setTypeArgumentRange(T.getRange());
7710   DS.SetRangeEnd(T.getCloseLocation());
7711 
7712   const char *PrevSpec = nullptr;
7713   unsigned DiagID;
7714   if (DS.SetTypeSpecType(DeclSpec::TST_atomic, StartLoc, PrevSpec,
7715                          DiagID, Result.get(),
7716                          Actions.getASTContext().getPrintingPolicy()))
7717     Diag(StartLoc, DiagID) << PrevSpec;
7718 }
7719 
7720 /// TryAltiVecVectorTokenOutOfLine - Out of line body that should only be called
7721 /// from TryAltiVecVectorToken.
TryAltiVecVectorTokenOutOfLine()7722 bool Parser::TryAltiVecVectorTokenOutOfLine() {
7723   Token Next = NextToken();
7724   switch (Next.getKind()) {
7725   default: return false;
7726   case tok::kw_short:
7727   case tok::kw_long:
7728   case tok::kw_signed:
7729   case tok::kw_unsigned:
7730   case tok::kw_void:
7731   case tok::kw_char:
7732   case tok::kw_int:
7733   case tok::kw_float:
7734   case tok::kw_double:
7735   case tok::kw_bool:
7736   case tok::kw__Bool:
7737   case tok::kw___bool:
7738   case tok::kw___pixel:
7739     Tok.setKind(tok::kw___vector);
7740     return true;
7741   case tok::identifier:
7742     if (Next.getIdentifierInfo() == Ident_pixel) {
7743       Tok.setKind(tok::kw___vector);
7744       return true;
7745     }
7746     if (Next.getIdentifierInfo() == Ident_bool ||
7747         Next.getIdentifierInfo() == Ident_Bool) {
7748       Tok.setKind(tok::kw___vector);
7749       return true;
7750     }
7751     return false;
7752   }
7753 }
7754 
TryAltiVecTokenOutOfLine(DeclSpec & DS,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,bool & isInvalid)7755 bool Parser::TryAltiVecTokenOutOfLine(DeclSpec &DS, SourceLocation Loc,
7756                                       const char *&PrevSpec, unsigned &DiagID,
7757                                       bool &isInvalid) {
7758   const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy();
7759   if (Tok.getIdentifierInfo() == Ident_vector) {
7760     Token Next = NextToken();
7761     switch (Next.getKind()) {
7762     case tok::kw_short:
7763     case tok::kw_long:
7764     case tok::kw_signed:
7765     case tok::kw_unsigned:
7766     case tok::kw_void:
7767     case tok::kw_char:
7768     case tok::kw_int:
7769     case tok::kw_float:
7770     case tok::kw_double:
7771     case tok::kw_bool:
7772     case tok::kw__Bool:
7773     case tok::kw___bool:
7774     case tok::kw___pixel:
7775       isInvalid = DS.SetTypeAltiVecVector(true, Loc, PrevSpec, DiagID, Policy);
7776       return true;
7777     case tok::identifier:
7778       if (Next.getIdentifierInfo() == Ident_pixel) {
7779         isInvalid = DS.SetTypeAltiVecVector(true, Loc, PrevSpec, DiagID,Policy);
7780         return true;
7781       }
7782       if (Next.getIdentifierInfo() == Ident_bool ||
7783           Next.getIdentifierInfo() == Ident_Bool) {
7784         isInvalid =
7785             DS.SetTypeAltiVecVector(true, Loc, PrevSpec, DiagID, Policy);
7786         return true;
7787       }
7788       break;
7789     default:
7790       break;
7791     }
7792   } else if ((Tok.getIdentifierInfo() == Ident_pixel) &&
7793              DS.isTypeAltiVecVector()) {
7794     isInvalid = DS.SetTypeAltiVecPixel(true, Loc, PrevSpec, DiagID, Policy);
7795     return true;
7796   } else if ((Tok.getIdentifierInfo() == Ident_bool) &&
7797              DS.isTypeAltiVecVector()) {
7798     isInvalid = DS.SetTypeAltiVecBool(true, Loc, PrevSpec, DiagID, Policy);
7799     return true;
7800   }
7801   return false;
7802 }
7803 
DiagnoseBitIntUse(const Token & Tok)7804 void Parser::DiagnoseBitIntUse(const Token &Tok) {
7805   // If the token is for _ExtInt, diagnose it as being deprecated. Otherwise,
7806   // the token is about _BitInt and gets (potentially) diagnosed as use of an
7807   // extension.
7808   assert(Tok.isOneOf(tok::kw__ExtInt, tok::kw__BitInt) &&
7809          "expected either an _ExtInt or _BitInt token!");
7810 
7811   SourceLocation Loc = Tok.getLocation();
7812   if (Tok.is(tok::kw__ExtInt)) {
7813     Diag(Loc, diag::warn_ext_int_deprecated)
7814         << FixItHint::CreateReplacement(Loc, "_BitInt");
7815   } else {
7816     // In C2x mode, diagnose that the use is not compatible with pre-C2x modes.
7817     // Otherwise, diagnose that the use is a Clang extension.
7818     if (getLangOpts().C2x)
7819       Diag(Loc, diag::warn_c17_compat_bit_int);
7820     else
7821       Diag(Loc, diag::ext_bit_int) << getLangOpts().CPlusPlus;
7822   }
7823 }
7824