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