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