1 //===--- ParseDecl.cpp - Declaration Parsing ------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the Declaration portions of the Parser interfaces. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/Parse/Parser.h" 15 #include "clang/Parse/ParseDiagnostic.h" 16 #include "clang/Basic/OpenCL.h" 17 #include "clang/Sema/Lookup.h" 18 #include "clang/Sema/Scope.h" 19 #include "clang/Sema/ParsedTemplate.h" 20 #include "clang/Sema/PrettyDeclStackTrace.h" 21 #include "RAIIObjectsForParser.h" 22 #include "llvm/ADT/SmallSet.h" 23 #include "llvm/ADT/SmallString.h" 24 #include "llvm/ADT/StringSwitch.h" 25 using namespace clang; 26 27 //===----------------------------------------------------------------------===// 28 // C99 6.7: Declarations. 29 //===----------------------------------------------------------------------===// 30 31 /// ParseTypeName 32 /// type-name: [C99 6.7.6] 33 /// specifier-qualifier-list abstract-declarator[opt] 34 /// 35 /// Called type-id in C++. 36 TypeResult Parser::ParseTypeName(SourceRange *Range, 37 Declarator::TheContext Context, 38 AccessSpecifier AS, 39 Decl **OwnedType) { 40 DeclSpecContext DSC = getDeclSpecContextFromDeclaratorContext(Context); 41 if (DSC == DSC_normal) 42 DSC = DSC_type_specifier; 43 44 // Parse the common declaration-specifiers piece. 45 DeclSpec DS(AttrFactory); 46 ParseSpecifierQualifierList(DS, AS, DSC); 47 if (OwnedType) 48 *OwnedType = DS.isTypeSpecOwned() ? DS.getRepAsDecl() : 0; 49 50 // Parse the abstract-declarator, if present. 51 Declarator DeclaratorInfo(DS, Context); 52 ParseDeclarator(DeclaratorInfo); 53 if (Range) 54 *Range = DeclaratorInfo.getSourceRange(); 55 56 if (DeclaratorInfo.isInvalidType()) 57 return true; 58 59 return Actions.ActOnTypeName(getCurScope(), DeclaratorInfo); 60 } 61 62 63 /// isAttributeLateParsed - Return true if the attribute has arguments that 64 /// require late parsing. 65 static bool isAttributeLateParsed(const IdentifierInfo &II) { 66 return llvm::StringSwitch<bool>(II.getName()) 67 #include "clang/Parse/AttrLateParsed.inc" 68 .Default(false); 69 } 70 71 /// ParseGNUAttributes - Parse a non-empty attributes list. 72 /// 73 /// [GNU] attributes: 74 /// attribute 75 /// attributes attribute 76 /// 77 /// [GNU] attribute: 78 /// '__attribute__' '(' '(' attribute-list ')' ')' 79 /// 80 /// [GNU] attribute-list: 81 /// attrib 82 /// attribute_list ',' attrib 83 /// 84 /// [GNU] attrib: 85 /// empty 86 /// attrib-name 87 /// attrib-name '(' identifier ')' 88 /// attrib-name '(' identifier ',' nonempty-expr-list ')' 89 /// attrib-name '(' argument-expression-list [C99 6.5.2] ')' 90 /// 91 /// [GNU] attrib-name: 92 /// identifier 93 /// typespec 94 /// typequal 95 /// storageclass 96 /// 97 /// FIXME: The GCC grammar/code for this construct implies we need two 98 /// token lookahead. Comment from gcc: "If they start with an identifier 99 /// which is followed by a comma or close parenthesis, then the arguments 100 /// start with that identifier; otherwise they are an expression list." 101 /// 102 /// GCC does not require the ',' between attribs in an attribute-list. 103 /// 104 /// At the moment, I am not doing 2 token lookahead. I am also unaware of 105 /// any attributes that don't work (based on my limited testing). Most 106 /// attributes are very simple in practice. Until we find a bug, I don't see 107 /// a pressing need to implement the 2 token lookahead. 108 109 void Parser::ParseGNUAttributes(ParsedAttributes &attrs, 110 SourceLocation *endLoc, 111 LateParsedAttrList *LateAttrs) { 112 assert(Tok.is(tok::kw___attribute) && "Not a GNU attribute list!"); 113 114 while (Tok.is(tok::kw___attribute)) { 115 ConsumeToken(); 116 if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after, 117 "attribute")) { 118 SkipUntil(tok::r_paren, true); // skip until ) or ; 119 return; 120 } 121 if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after, "(")) { 122 SkipUntil(tok::r_paren, true); // skip until ) or ; 123 return; 124 } 125 // Parse the attribute-list. e.g. __attribute__(( weak, alias("__f") )) 126 while (Tok.is(tok::identifier) || isDeclarationSpecifier() || 127 Tok.is(tok::comma)) { 128 if (Tok.is(tok::comma)) { 129 // allows for empty/non-empty attributes. ((__vector_size__(16),,,,)) 130 ConsumeToken(); 131 continue; 132 } 133 // we have an identifier or declaration specifier (const, int, etc.) 134 IdentifierInfo *AttrName = Tok.getIdentifierInfo(); 135 SourceLocation AttrNameLoc = ConsumeToken(); 136 137 if (Tok.is(tok::l_paren)) { 138 // handle "parameterized" attributes 139 if (LateAttrs && isAttributeLateParsed(*AttrName)) { 140 LateParsedAttribute *LA = 141 new LateParsedAttribute(this, *AttrName, AttrNameLoc); 142 LateAttrs->push_back(LA); 143 144 // Attributes in a class are parsed at the end of the class, along 145 // with other late-parsed declarations. 146 if (!ClassStack.empty()) 147 getCurrentClass().LateParsedDeclarations.push_back(LA); 148 149 // consume everything up to and including the matching right parens 150 ConsumeAndStoreUntil(tok::r_paren, LA->Toks, true, false); 151 152 Token Eof; 153 Eof.startToken(); 154 Eof.setLocation(Tok.getLocation()); 155 LA->Toks.push_back(Eof); 156 } else { 157 ParseGNUAttributeArgs(AttrName, AttrNameLoc, attrs, endLoc); 158 } 159 } else { 160 attrs.addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 161 0, SourceLocation(), 0, 0, AttributeList::AS_GNU); 162 } 163 } 164 if (ExpectAndConsume(tok::r_paren, diag::err_expected_rparen)) 165 SkipUntil(tok::r_paren, false); 166 SourceLocation Loc = Tok.getLocation(); 167 if (ExpectAndConsume(tok::r_paren, diag::err_expected_rparen)) { 168 SkipUntil(tok::r_paren, false); 169 } 170 if (endLoc) 171 *endLoc = Loc; 172 } 173 } 174 175 176 /// Parse the arguments to a parameterized GNU attribute 177 void Parser::ParseGNUAttributeArgs(IdentifierInfo *AttrName, 178 SourceLocation AttrNameLoc, 179 ParsedAttributes &Attrs, 180 SourceLocation *EndLoc) { 181 182 assert(Tok.is(tok::l_paren) && "Attribute arg list not starting with '('"); 183 184 // Availability attributes have their own grammar. 185 if (AttrName->isStr("availability")) { 186 ParseAvailabilityAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc); 187 return; 188 } 189 // Thread safety attributes fit into the FIXME case above, so we 190 // just parse the arguments as a list of expressions 191 if (IsThreadSafetyAttribute(AttrName->getName())) { 192 ParseThreadSafetyAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc); 193 return; 194 } 195 // Type safety attributes have their own grammar. 196 if (AttrName->isStr("type_tag_for_datatype")) { 197 ParseTypeTagForDatatypeAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc); 198 return; 199 } 200 201 ConsumeParen(); // ignore the left paren loc for now 202 203 IdentifierInfo *ParmName = 0; 204 SourceLocation ParmLoc; 205 bool BuiltinType = false; 206 207 switch (Tok.getKind()) { 208 case tok::kw_char: 209 case tok::kw_wchar_t: 210 case tok::kw_char16_t: 211 case tok::kw_char32_t: 212 case tok::kw_bool: 213 case tok::kw_short: 214 case tok::kw_int: 215 case tok::kw_long: 216 case tok::kw___int64: 217 case tok::kw___int128: 218 case tok::kw_signed: 219 case tok::kw_unsigned: 220 case tok::kw_float: 221 case tok::kw_double: 222 case tok::kw_void: 223 case tok::kw_typeof: 224 // __attribute__(( vec_type_hint(char) )) 225 // FIXME: Don't just discard the builtin type token. 226 ConsumeToken(); 227 BuiltinType = true; 228 break; 229 230 case tok::identifier: 231 ParmName = Tok.getIdentifierInfo(); 232 ParmLoc = ConsumeToken(); 233 break; 234 235 default: 236 break; 237 } 238 239 ExprVector ArgExprs; 240 241 if (!BuiltinType && 242 (ParmLoc.isValid() ? Tok.is(tok::comma) : Tok.isNot(tok::r_paren))) { 243 // Eat the comma. 244 if (ParmLoc.isValid()) 245 ConsumeToken(); 246 247 // Parse the non-empty comma-separated list of expressions. 248 while (1) { 249 ExprResult ArgExpr(ParseAssignmentExpression()); 250 if (ArgExpr.isInvalid()) { 251 SkipUntil(tok::r_paren); 252 return; 253 } 254 ArgExprs.push_back(ArgExpr.release()); 255 if (Tok.isNot(tok::comma)) 256 break; 257 ConsumeToken(); // Eat the comma, move to the next argument 258 } 259 } 260 else if (Tok.is(tok::less) && AttrName->isStr("iboutletcollection")) { 261 if (!ExpectAndConsume(tok::less, diag::err_expected_less_after, "<", 262 tok::greater)) { 263 while (Tok.is(tok::identifier)) { 264 ConsumeToken(); 265 if (Tok.is(tok::greater)) 266 break; 267 if (Tok.is(tok::comma)) { 268 ConsumeToken(); 269 continue; 270 } 271 } 272 if (Tok.isNot(tok::greater)) 273 Diag(Tok, diag::err_iboutletcollection_with_protocol); 274 SkipUntil(tok::r_paren, false, true); // skip until ')' 275 } 276 } 277 278 SourceLocation RParen = Tok.getLocation(); 279 if (!ExpectAndConsume(tok::r_paren, diag::err_expected_rparen)) { 280 AttributeList *attr = 281 Attrs.addNew(AttrName, SourceRange(AttrNameLoc, RParen), 0, AttrNameLoc, 282 ParmName, ParmLoc, ArgExprs.data(), ArgExprs.size(), 283 AttributeList::AS_GNU); 284 if (BuiltinType && attr->getKind() == AttributeList::AT_IBOutletCollection) 285 Diag(Tok, diag::err_iboutletcollection_builtintype); 286 } 287 } 288 289 /// \brief Parses a single argument for a declspec, including the 290 /// surrounding parens. 291 void Parser::ParseMicrosoftDeclSpecWithSingleArg(IdentifierInfo *AttrName, 292 SourceLocation AttrNameLoc, 293 ParsedAttributes &Attrs) 294 { 295 BalancedDelimiterTracker T(*this, tok::l_paren); 296 if (T.expectAndConsume(diag::err_expected_lparen_after, 297 AttrName->getNameStart(), tok::r_paren)) 298 return; 299 300 ExprResult ArgExpr(ParseConstantExpression()); 301 if (ArgExpr.isInvalid()) { 302 T.skipToEnd(); 303 return; 304 } 305 Expr *ExprList = ArgExpr.take(); 306 Attrs.addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0, SourceLocation(), 307 &ExprList, 1, AttributeList::AS_Declspec); 308 309 T.consumeClose(); 310 } 311 312 /// \brief Determines whether a declspec is a "simple" one requiring no 313 /// arguments. 314 bool Parser::IsSimpleMicrosoftDeclSpec(IdentifierInfo *Ident) { 315 return llvm::StringSwitch<bool>(Ident->getName()) 316 .Case("dllimport", true) 317 .Case("dllexport", true) 318 .Case("noreturn", true) 319 .Case("nothrow", true) 320 .Case("noinline", true) 321 .Case("naked", true) 322 .Case("appdomain", true) 323 .Case("process", true) 324 .Case("jitintrinsic", true) 325 .Case("noalias", true) 326 .Case("restrict", true) 327 .Case("novtable", true) 328 .Case("selectany", true) 329 .Case("thread", true) 330 .Default(false); 331 } 332 333 /// \brief Attempts to parse a declspec which is not simple (one that takes 334 /// parameters). Will return false if we properly handled the declspec, or 335 /// true if it is an unknown declspec. 336 void Parser::ParseComplexMicrosoftDeclSpec(IdentifierInfo *Ident, 337 SourceLocation Loc, 338 ParsedAttributes &Attrs) { 339 // Try to handle the easy case first -- these declspecs all take a single 340 // parameter as their argument. 341 if (llvm::StringSwitch<bool>(Ident->getName()) 342 .Case("uuid", true) 343 .Case("align", true) 344 .Case("allocate", true) 345 .Default(false)) { 346 ParseMicrosoftDeclSpecWithSingleArg(Ident, Loc, Attrs); 347 } else if (Ident->getName() == "deprecated") { 348 // The deprecated declspec has an optional single argument, so we will 349 // check for a l-paren to decide whether we should parse an argument or 350 // not. 351 if (Tok.getKind() == tok::l_paren) 352 ParseMicrosoftDeclSpecWithSingleArg(Ident, Loc, Attrs); 353 else 354 Attrs.addNew(Ident, Loc, 0, Loc, 0, SourceLocation(), 0, 0, 355 AttributeList::AS_Declspec); 356 } else if (Ident->getName() == "property") { 357 // The property declspec is more complex in that it can take one or two 358 // assignment expressions as a parameter, but the lhs of the assignment 359 // must be named get or put. 360 // 361 // For right now, we will just skip to the closing right paren of the 362 // property expression. 363 // 364 // FIXME: we should deal with __declspec(property) at some point because it 365 // is used in the platform SDK headers for the Parallel Patterns Library 366 // and ATL. 367 BalancedDelimiterTracker T(*this, tok::l_paren); 368 if (T.expectAndConsume(diag::err_expected_lparen_after, 369 Ident->getNameStart(), tok::r_paren)) 370 return; 371 T.skipToEnd(); 372 } else { 373 // We don't recognize this as a valid declspec, but instead of creating the 374 // attribute and allowing sema to warn about it, we will warn here instead. 375 // This is because some attributes have multiple spellings, but we need to 376 // disallow that for declspecs (such as align vs aligned). If we made the 377 // attribute, we'd have to split the valid declspec spelling logic into 378 // both locations. 379 Diag(Loc, diag::warn_ms_declspec_unknown) << Ident; 380 381 // If there's an open paren, we should eat the open and close parens under 382 // the assumption that this unknown declspec has parameters. 383 BalancedDelimiterTracker T(*this, tok::l_paren); 384 if (!T.consumeOpen()) 385 T.skipToEnd(); 386 } 387 } 388 389 /// [MS] decl-specifier: 390 /// __declspec ( extended-decl-modifier-seq ) 391 /// 392 /// [MS] extended-decl-modifier-seq: 393 /// extended-decl-modifier[opt] 394 /// extended-decl-modifier extended-decl-modifier-seq 395 void Parser::ParseMicrosoftDeclSpec(ParsedAttributes &Attrs) { 396 assert(Tok.is(tok::kw___declspec) && "Not a declspec!"); 397 398 ConsumeToken(); 399 BalancedDelimiterTracker T(*this, tok::l_paren); 400 if (T.expectAndConsume(diag::err_expected_lparen_after, "__declspec", 401 tok::r_paren)) 402 return; 403 404 // An empty declspec is perfectly legal and should not warn. Additionally, 405 // you can specify multiple attributes per declspec. 406 while (Tok.getKind() != tok::r_paren) { 407 // We expect either a well-known identifier or a generic string. Anything 408 // else is a malformed declspec. 409 bool IsString = Tok.getKind() == tok::string_literal ? true : false; 410 if (!IsString && Tok.getKind() != tok::identifier && 411 Tok.getKind() != tok::kw_restrict) { 412 Diag(Tok, diag::err_ms_declspec_type); 413 T.skipToEnd(); 414 return; 415 } 416 417 IdentifierInfo *AttrName; 418 SourceLocation AttrNameLoc; 419 if (IsString) { 420 SmallString<8> StrBuffer; 421 bool Invalid = false; 422 StringRef Str = PP.getSpelling(Tok, StrBuffer, &Invalid); 423 if (Invalid) { 424 T.skipToEnd(); 425 return; 426 } 427 AttrName = PP.getIdentifierInfo(Str); 428 AttrNameLoc = ConsumeStringToken(); 429 } else { 430 AttrName = Tok.getIdentifierInfo(); 431 AttrNameLoc = ConsumeToken(); 432 } 433 434 if (IsString || IsSimpleMicrosoftDeclSpec(AttrName)) 435 // If we have a generic string, we will allow it because there is no 436 // documented list of allowable string declspecs, but we know they exist 437 // (for instance, SAL declspecs in older versions of MSVC). 438 // 439 // Alternatively, if the identifier is a simple one, then it requires no 440 // arguments and can be turned into an attribute directly. 441 Attrs.addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0, SourceLocation(), 442 0, 0, AttributeList::AS_Declspec); 443 else 444 ParseComplexMicrosoftDeclSpec(AttrName, AttrNameLoc, Attrs); 445 } 446 T.consumeClose(); 447 } 448 449 void Parser::ParseMicrosoftTypeAttributes(ParsedAttributes &attrs) { 450 // Treat these like attributes 451 while (Tok.is(tok::kw___fastcall) || Tok.is(tok::kw___stdcall) || 452 Tok.is(tok::kw___thiscall) || Tok.is(tok::kw___cdecl) || 453 Tok.is(tok::kw___ptr64) || Tok.is(tok::kw___w64) || 454 Tok.is(tok::kw___ptr32) || 455 Tok.is(tok::kw___unaligned)) { 456 IdentifierInfo *AttrName = Tok.getIdentifierInfo(); 457 SourceLocation AttrNameLoc = ConsumeToken(); 458 attrs.addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0, 459 SourceLocation(), 0, 0, AttributeList::AS_MSTypespec); 460 } 461 } 462 463 void Parser::ParseBorlandTypeAttributes(ParsedAttributes &attrs) { 464 // Treat these like attributes 465 while (Tok.is(tok::kw___pascal)) { 466 IdentifierInfo *AttrName = Tok.getIdentifierInfo(); 467 SourceLocation AttrNameLoc = ConsumeToken(); 468 attrs.addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0, 469 SourceLocation(), 0, 0, AttributeList::AS_MSTypespec); 470 } 471 } 472 473 void Parser::ParseOpenCLAttributes(ParsedAttributes &attrs) { 474 // Treat these like attributes 475 while (Tok.is(tok::kw___kernel)) { 476 SourceLocation AttrNameLoc = ConsumeToken(); 477 attrs.addNew(PP.getIdentifierInfo("opencl_kernel_function"), 478 AttrNameLoc, 0, AttrNameLoc, 0, 479 SourceLocation(), 0, 0, AttributeList::AS_GNU); 480 } 481 } 482 483 void Parser::ParseOpenCLQualifiers(DeclSpec &DS) { 484 SourceLocation Loc = Tok.getLocation(); 485 switch(Tok.getKind()) { 486 // OpenCL qualifiers: 487 case tok::kw___private: 488 case tok::kw_private: 489 DS.getAttributes().addNewInteger( 490 Actions.getASTContext(), 491 PP.getIdentifierInfo("address_space"), Loc, 0); 492 break; 493 494 case tok::kw___global: 495 DS.getAttributes().addNewInteger( 496 Actions.getASTContext(), 497 PP.getIdentifierInfo("address_space"), Loc, LangAS::opencl_global); 498 break; 499 500 case tok::kw___local: 501 DS.getAttributes().addNewInteger( 502 Actions.getASTContext(), 503 PP.getIdentifierInfo("address_space"), Loc, LangAS::opencl_local); 504 break; 505 506 case tok::kw___constant: 507 DS.getAttributes().addNewInteger( 508 Actions.getASTContext(), 509 PP.getIdentifierInfo("address_space"), Loc, LangAS::opencl_constant); 510 break; 511 512 case tok::kw___read_only: 513 DS.getAttributes().addNewInteger( 514 Actions.getASTContext(), 515 PP.getIdentifierInfo("opencl_image_access"), Loc, CLIA_read_only); 516 break; 517 518 case tok::kw___write_only: 519 DS.getAttributes().addNewInteger( 520 Actions.getASTContext(), 521 PP.getIdentifierInfo("opencl_image_access"), Loc, CLIA_write_only); 522 break; 523 524 case tok::kw___read_write: 525 DS.getAttributes().addNewInteger( 526 Actions.getASTContext(), 527 PP.getIdentifierInfo("opencl_image_access"), Loc, CLIA_read_write); 528 break; 529 default: break; 530 } 531 } 532 533 /// \brief Parse a version number. 534 /// 535 /// version: 536 /// simple-integer 537 /// simple-integer ',' simple-integer 538 /// simple-integer ',' simple-integer ',' simple-integer 539 VersionTuple Parser::ParseVersionTuple(SourceRange &Range) { 540 Range = Tok.getLocation(); 541 542 if (!Tok.is(tok::numeric_constant)) { 543 Diag(Tok, diag::err_expected_version); 544 SkipUntil(tok::comma, tok::r_paren, true, true, true); 545 return VersionTuple(); 546 } 547 548 // Parse the major (and possibly minor and subminor) versions, which 549 // are stored in the numeric constant. We utilize a quirk of the 550 // lexer, which is that it handles something like 1.2.3 as a single 551 // numeric constant, rather than two separate tokens. 552 SmallString<512> Buffer; 553 Buffer.resize(Tok.getLength()+1); 554 const char *ThisTokBegin = &Buffer[0]; 555 556 // Get the spelling of the token, which eliminates trigraphs, etc. 557 bool Invalid = false; 558 unsigned ActualLength = PP.getSpelling(Tok, ThisTokBegin, &Invalid); 559 if (Invalid) 560 return VersionTuple(); 561 562 // Parse the major version. 563 unsigned AfterMajor = 0; 564 unsigned Major = 0; 565 while (AfterMajor < ActualLength && isdigit(ThisTokBegin[AfterMajor])) { 566 Major = Major * 10 + ThisTokBegin[AfterMajor] - '0'; 567 ++AfterMajor; 568 } 569 570 if (AfterMajor == 0) { 571 Diag(Tok, diag::err_expected_version); 572 SkipUntil(tok::comma, tok::r_paren, true, true, true); 573 return VersionTuple(); 574 } 575 576 if (AfterMajor == ActualLength) { 577 ConsumeToken(); 578 579 // We only had a single version component. 580 if (Major == 0) { 581 Diag(Tok, diag::err_zero_version); 582 return VersionTuple(); 583 } 584 585 return VersionTuple(Major); 586 } 587 588 if (ThisTokBegin[AfterMajor] != '.' || (AfterMajor + 1 == ActualLength)) { 589 Diag(Tok, diag::err_expected_version); 590 SkipUntil(tok::comma, tok::r_paren, true, true, true); 591 return VersionTuple(); 592 } 593 594 // Parse the minor version. 595 unsigned AfterMinor = AfterMajor + 1; 596 unsigned Minor = 0; 597 while (AfterMinor < ActualLength && isdigit(ThisTokBegin[AfterMinor])) { 598 Minor = Minor * 10 + ThisTokBegin[AfterMinor] - '0'; 599 ++AfterMinor; 600 } 601 602 if (AfterMinor == ActualLength) { 603 ConsumeToken(); 604 605 // We had major.minor. 606 if (Major == 0 && Minor == 0) { 607 Diag(Tok, diag::err_zero_version); 608 return VersionTuple(); 609 } 610 611 return VersionTuple(Major, Minor); 612 } 613 614 // If what follows is not a '.', we have a problem. 615 if (ThisTokBegin[AfterMinor] != '.') { 616 Diag(Tok, diag::err_expected_version); 617 SkipUntil(tok::comma, tok::r_paren, true, true, true); 618 return VersionTuple(); 619 } 620 621 // Parse the subminor version. 622 unsigned AfterSubminor = AfterMinor + 1; 623 unsigned Subminor = 0; 624 while (AfterSubminor < ActualLength && isdigit(ThisTokBegin[AfterSubminor])) { 625 Subminor = Subminor * 10 + ThisTokBegin[AfterSubminor] - '0'; 626 ++AfterSubminor; 627 } 628 629 if (AfterSubminor != ActualLength) { 630 Diag(Tok, diag::err_expected_version); 631 SkipUntil(tok::comma, tok::r_paren, true, true, true); 632 return VersionTuple(); 633 } 634 ConsumeToken(); 635 return VersionTuple(Major, Minor, Subminor); 636 } 637 638 /// \brief Parse the contents of the "availability" attribute. 639 /// 640 /// availability-attribute: 641 /// 'availability' '(' platform ',' version-arg-list, opt-message')' 642 /// 643 /// platform: 644 /// identifier 645 /// 646 /// version-arg-list: 647 /// version-arg 648 /// version-arg ',' version-arg-list 649 /// 650 /// version-arg: 651 /// 'introduced' '=' version 652 /// 'deprecated' '=' version 653 /// 'obsoleted' = version 654 /// 'unavailable' 655 /// opt-message: 656 /// 'message' '=' <string> 657 void Parser::ParseAvailabilityAttribute(IdentifierInfo &Availability, 658 SourceLocation AvailabilityLoc, 659 ParsedAttributes &attrs, 660 SourceLocation *endLoc) { 661 SourceLocation PlatformLoc; 662 IdentifierInfo *Platform = 0; 663 664 enum { Introduced, Deprecated, Obsoleted, Unknown }; 665 AvailabilityChange Changes[Unknown]; 666 ExprResult MessageExpr; 667 668 // Opening '('. 669 BalancedDelimiterTracker T(*this, tok::l_paren); 670 if (T.consumeOpen()) { 671 Diag(Tok, diag::err_expected_lparen); 672 return; 673 } 674 675 // Parse the platform name, 676 if (Tok.isNot(tok::identifier)) { 677 Diag(Tok, diag::err_availability_expected_platform); 678 SkipUntil(tok::r_paren); 679 return; 680 } 681 Platform = Tok.getIdentifierInfo(); 682 PlatformLoc = ConsumeToken(); 683 684 // Parse the ',' following the platform name. 685 if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "", tok::r_paren)) 686 return; 687 688 // If we haven't grabbed the pointers for the identifiers 689 // "introduced", "deprecated", and "obsoleted", do so now. 690 if (!Ident_introduced) { 691 Ident_introduced = PP.getIdentifierInfo("introduced"); 692 Ident_deprecated = PP.getIdentifierInfo("deprecated"); 693 Ident_obsoleted = PP.getIdentifierInfo("obsoleted"); 694 Ident_unavailable = PP.getIdentifierInfo("unavailable"); 695 Ident_message = PP.getIdentifierInfo("message"); 696 } 697 698 // Parse the set of introductions/deprecations/removals. 699 SourceLocation UnavailableLoc; 700 do { 701 if (Tok.isNot(tok::identifier)) { 702 Diag(Tok, diag::err_availability_expected_change); 703 SkipUntil(tok::r_paren); 704 return; 705 } 706 IdentifierInfo *Keyword = Tok.getIdentifierInfo(); 707 SourceLocation KeywordLoc = ConsumeToken(); 708 709 if (Keyword == Ident_unavailable) { 710 if (UnavailableLoc.isValid()) { 711 Diag(KeywordLoc, diag::err_availability_redundant) 712 << Keyword << SourceRange(UnavailableLoc); 713 } 714 UnavailableLoc = KeywordLoc; 715 716 if (Tok.isNot(tok::comma)) 717 break; 718 719 ConsumeToken(); 720 continue; 721 } 722 723 if (Tok.isNot(tok::equal)) { 724 Diag(Tok, diag::err_expected_equal_after) 725 << Keyword; 726 SkipUntil(tok::r_paren); 727 return; 728 } 729 ConsumeToken(); 730 if (Keyword == Ident_message) { 731 if (!isTokenStringLiteral()) { 732 Diag(Tok, diag::err_expected_string_literal); 733 SkipUntil(tok::r_paren); 734 return; 735 } 736 MessageExpr = ParseStringLiteralExpression(); 737 break; 738 } 739 740 SourceRange VersionRange; 741 VersionTuple Version = ParseVersionTuple(VersionRange); 742 743 if (Version.empty()) { 744 SkipUntil(tok::r_paren); 745 return; 746 } 747 748 unsigned Index; 749 if (Keyword == Ident_introduced) 750 Index = Introduced; 751 else if (Keyword == Ident_deprecated) 752 Index = Deprecated; 753 else if (Keyword == Ident_obsoleted) 754 Index = Obsoleted; 755 else 756 Index = Unknown; 757 758 if (Index < Unknown) { 759 if (!Changes[Index].KeywordLoc.isInvalid()) { 760 Diag(KeywordLoc, diag::err_availability_redundant) 761 << Keyword 762 << SourceRange(Changes[Index].KeywordLoc, 763 Changes[Index].VersionRange.getEnd()); 764 } 765 766 Changes[Index].KeywordLoc = KeywordLoc; 767 Changes[Index].Version = Version; 768 Changes[Index].VersionRange = VersionRange; 769 } else { 770 Diag(KeywordLoc, diag::err_availability_unknown_change) 771 << Keyword << VersionRange; 772 } 773 774 if (Tok.isNot(tok::comma)) 775 break; 776 777 ConsumeToken(); 778 } while (true); 779 780 // Closing ')'. 781 if (T.consumeClose()) 782 return; 783 784 if (endLoc) 785 *endLoc = T.getCloseLocation(); 786 787 // The 'unavailable' availability cannot be combined with any other 788 // availability changes. Make sure that hasn't happened. 789 if (UnavailableLoc.isValid()) { 790 bool Complained = false; 791 for (unsigned Index = Introduced; Index != Unknown; ++Index) { 792 if (Changes[Index].KeywordLoc.isValid()) { 793 if (!Complained) { 794 Diag(UnavailableLoc, diag::warn_availability_and_unavailable) 795 << SourceRange(Changes[Index].KeywordLoc, 796 Changes[Index].VersionRange.getEnd()); 797 Complained = true; 798 } 799 800 // Clear out the availability. 801 Changes[Index] = AvailabilityChange(); 802 } 803 } 804 } 805 806 // Record this attribute 807 attrs.addNew(&Availability, 808 SourceRange(AvailabilityLoc, T.getCloseLocation()), 809 0, AvailabilityLoc, 810 Platform, PlatformLoc, 811 Changes[Introduced], 812 Changes[Deprecated], 813 Changes[Obsoleted], 814 UnavailableLoc, MessageExpr.take(), 815 AttributeList::AS_GNU); 816 } 817 818 819 // Late Parsed Attributes: 820 // See other examples of late parsing in lib/Parse/ParseCXXInlineMethods 821 822 void Parser::LateParsedDeclaration::ParseLexedAttributes() {} 823 824 void Parser::LateParsedClass::ParseLexedAttributes() { 825 Self->ParseLexedAttributes(*Class); 826 } 827 828 void Parser::LateParsedAttribute::ParseLexedAttributes() { 829 Self->ParseLexedAttribute(*this, true, false); 830 } 831 832 /// Wrapper class which calls ParseLexedAttribute, after setting up the 833 /// scope appropriately. 834 void Parser::ParseLexedAttributes(ParsingClass &Class) { 835 // Deal with templates 836 // FIXME: Test cases to make sure this does the right thing for templates. 837 bool HasTemplateScope = !Class.TopLevelClass && Class.TemplateScope; 838 ParseScope ClassTemplateScope(this, Scope::TemplateParamScope, 839 HasTemplateScope); 840 if (HasTemplateScope) 841 Actions.ActOnReenterTemplateScope(getCurScope(), Class.TagOrTemplate); 842 843 // Set or update the scope flags. 844 bool AlreadyHasClassScope = Class.TopLevelClass; 845 unsigned ScopeFlags = Scope::ClassScope|Scope::DeclScope; 846 ParseScope ClassScope(this, ScopeFlags, !AlreadyHasClassScope); 847 ParseScopeFlags ClassScopeFlags(this, ScopeFlags, AlreadyHasClassScope); 848 849 // Enter the scope of nested classes 850 if (!AlreadyHasClassScope) 851 Actions.ActOnStartDelayedMemberDeclarations(getCurScope(), 852 Class.TagOrTemplate); 853 if (!Class.LateParsedDeclarations.empty()) { 854 for (unsigned i = 0, ni = Class.LateParsedDeclarations.size(); i < ni; ++i){ 855 Class.LateParsedDeclarations[i]->ParseLexedAttributes(); 856 } 857 } 858 859 if (!AlreadyHasClassScope) 860 Actions.ActOnFinishDelayedMemberDeclarations(getCurScope(), 861 Class.TagOrTemplate); 862 } 863 864 865 /// \brief Parse all attributes in LAs, and attach them to Decl D. 866 void Parser::ParseLexedAttributeList(LateParsedAttrList &LAs, Decl *D, 867 bool EnterScope, bool OnDefinition) { 868 for (unsigned i = 0, ni = LAs.size(); i < ni; ++i) { 869 if (D) 870 LAs[i]->addDecl(D); 871 ParseLexedAttribute(*LAs[i], EnterScope, OnDefinition); 872 delete LAs[i]; 873 } 874 LAs.clear(); 875 } 876 877 878 /// \brief Finish parsing an attribute for which parsing was delayed. 879 /// This will be called at the end of parsing a class declaration 880 /// for each LateParsedAttribute. We consume the saved tokens and 881 /// create an attribute with the arguments filled in. We add this 882 /// to the Attribute list for the decl. 883 void Parser::ParseLexedAttribute(LateParsedAttribute &LA, 884 bool EnterScope, bool OnDefinition) { 885 // Save the current token position. 886 SourceLocation OrigLoc = Tok.getLocation(); 887 888 // Append the current token at the end of the new token stream so that it 889 // doesn't get lost. 890 LA.Toks.push_back(Tok); 891 PP.EnterTokenStream(LA.Toks.data(), LA.Toks.size(), true, false); 892 // Consume the previously pushed token. 893 ConsumeAnyToken(); 894 895 if (OnDefinition && !IsThreadSafetyAttribute(LA.AttrName.getName())) { 896 Diag(Tok, diag::warn_attribute_on_function_definition) 897 << LA.AttrName.getName(); 898 } 899 900 ParsedAttributes Attrs(AttrFactory); 901 SourceLocation endLoc; 902 903 if (LA.Decls.size() > 0) { 904 Decl *D = LA.Decls[0]; 905 NamedDecl *ND = dyn_cast<NamedDecl>(D); 906 RecordDecl *RD = dyn_cast_or_null<RecordDecl>(D->getDeclContext()); 907 908 // Allow 'this' within late-parsed attributes. 909 Sema::CXXThisScopeRAII ThisScope(Actions, RD, 910 /*TypeQuals=*/0, 911 ND && RD && ND->isCXXInstanceMember()); 912 913 if (LA.Decls.size() == 1) { 914 // If the Decl is templatized, add template parameters to scope. 915 bool HasTemplateScope = EnterScope && D->isTemplateDecl(); 916 ParseScope TempScope(this, Scope::TemplateParamScope, HasTemplateScope); 917 if (HasTemplateScope) 918 Actions.ActOnReenterTemplateScope(Actions.CurScope, D); 919 920 // If the Decl is on a function, add function parameters to the scope. 921 bool HasFunScope = EnterScope && D->isFunctionOrFunctionTemplate(); 922 ParseScope FnScope(this, Scope::FnScope|Scope::DeclScope, HasFunScope); 923 if (HasFunScope) 924 Actions.ActOnReenterFunctionContext(Actions.CurScope, D); 925 926 ParseGNUAttributeArgs(&LA.AttrName, LA.AttrNameLoc, Attrs, &endLoc); 927 928 if (HasFunScope) { 929 Actions.ActOnExitFunctionContext(); 930 FnScope.Exit(); // Pop scope, and remove Decls from IdResolver 931 } 932 if (HasTemplateScope) { 933 TempScope.Exit(); 934 } 935 } else { 936 // If there are multiple decls, then the decl cannot be within the 937 // function scope. 938 ParseGNUAttributeArgs(&LA.AttrName, LA.AttrNameLoc, Attrs, &endLoc); 939 } 940 } else { 941 Diag(Tok, diag::warn_attribute_no_decl) << LA.AttrName.getName(); 942 } 943 944 for (unsigned i = 0, ni = LA.Decls.size(); i < ni; ++i) { 945 Actions.ActOnFinishDelayedAttribute(getCurScope(), LA.Decls[i], Attrs); 946 } 947 948 if (Tok.getLocation() != OrigLoc) { 949 // Due to a parsing error, we either went over the cached tokens or 950 // there are still cached tokens left, so we skip the leftover tokens. 951 // Since this is an uncommon situation that should be avoided, use the 952 // expensive isBeforeInTranslationUnit call. 953 if (PP.getSourceManager().isBeforeInTranslationUnit(Tok.getLocation(), 954 OrigLoc)) 955 while (Tok.getLocation() != OrigLoc && Tok.isNot(tok::eof)) 956 ConsumeAnyToken(); 957 } 958 } 959 960 /// \brief Wrapper around a case statement checking if AttrName is 961 /// one of the thread safety attributes 962 bool Parser::IsThreadSafetyAttribute(llvm::StringRef AttrName){ 963 return llvm::StringSwitch<bool>(AttrName) 964 .Case("guarded_by", true) 965 .Case("guarded_var", true) 966 .Case("pt_guarded_by", true) 967 .Case("pt_guarded_var", true) 968 .Case("lockable", true) 969 .Case("scoped_lockable", true) 970 .Case("no_thread_safety_analysis", true) 971 .Case("acquired_after", true) 972 .Case("acquired_before", true) 973 .Case("exclusive_lock_function", true) 974 .Case("shared_lock_function", true) 975 .Case("exclusive_trylock_function", true) 976 .Case("shared_trylock_function", true) 977 .Case("unlock_function", true) 978 .Case("lock_returned", true) 979 .Case("locks_excluded", true) 980 .Case("exclusive_locks_required", true) 981 .Case("shared_locks_required", true) 982 .Default(false); 983 } 984 985 /// \brief Parse the contents of thread safety attributes. These 986 /// should always be parsed as an expression list. 987 /// 988 /// We need to special case the parsing due to the fact that if the first token 989 /// of the first argument is an identifier, the main parse loop will store 990 /// that token as a "parameter" and the rest of 991 /// the arguments will be added to a list of "arguments". However, 992 /// subsequent tokens in the first argument are lost. We instead parse each 993 /// argument as an expression and add all arguments to the list of "arguments". 994 /// In future, we will take advantage of this special case to also 995 /// deal with some argument scoping issues here (for example, referring to a 996 /// function parameter in the attribute on that function). 997 void Parser::ParseThreadSafetyAttribute(IdentifierInfo &AttrName, 998 SourceLocation AttrNameLoc, 999 ParsedAttributes &Attrs, 1000 SourceLocation *EndLoc) { 1001 assert(Tok.is(tok::l_paren) && "Attribute arg list not starting with '('"); 1002 1003 BalancedDelimiterTracker T(*this, tok::l_paren); 1004 T.consumeOpen(); 1005 1006 ExprVector ArgExprs; 1007 bool ArgExprsOk = true; 1008 1009 // now parse the list of expressions 1010 while (Tok.isNot(tok::r_paren)) { 1011 ExprResult ArgExpr(ParseAssignmentExpression()); 1012 if (ArgExpr.isInvalid()) { 1013 ArgExprsOk = false; 1014 T.consumeClose(); 1015 break; 1016 } else { 1017 ArgExprs.push_back(ArgExpr.release()); 1018 } 1019 if (Tok.isNot(tok::comma)) 1020 break; 1021 ConsumeToken(); // Eat the comma, move to the next argument 1022 } 1023 // Match the ')'. 1024 if (ArgExprsOk && !T.consumeClose()) { 1025 Attrs.addNew(&AttrName, AttrNameLoc, 0, AttrNameLoc, 0, SourceLocation(), 1026 ArgExprs.data(), ArgExprs.size(), AttributeList::AS_GNU); 1027 } 1028 if (EndLoc) 1029 *EndLoc = T.getCloseLocation(); 1030 } 1031 1032 void Parser::ParseTypeTagForDatatypeAttribute(IdentifierInfo &AttrName, 1033 SourceLocation AttrNameLoc, 1034 ParsedAttributes &Attrs, 1035 SourceLocation *EndLoc) { 1036 assert(Tok.is(tok::l_paren) && "Attribute arg list not starting with '('"); 1037 1038 BalancedDelimiterTracker T(*this, tok::l_paren); 1039 T.consumeOpen(); 1040 1041 if (Tok.isNot(tok::identifier)) { 1042 Diag(Tok, diag::err_expected_ident); 1043 T.skipToEnd(); 1044 return; 1045 } 1046 IdentifierInfo *ArgumentKind = Tok.getIdentifierInfo(); 1047 SourceLocation ArgumentKindLoc = ConsumeToken(); 1048 1049 if (Tok.isNot(tok::comma)) { 1050 Diag(Tok, diag::err_expected_comma); 1051 T.skipToEnd(); 1052 return; 1053 } 1054 ConsumeToken(); 1055 1056 SourceRange MatchingCTypeRange; 1057 TypeResult MatchingCType = ParseTypeName(&MatchingCTypeRange); 1058 if (MatchingCType.isInvalid()) { 1059 T.skipToEnd(); 1060 return; 1061 } 1062 1063 bool LayoutCompatible = false; 1064 bool MustBeNull = false; 1065 while (Tok.is(tok::comma)) { 1066 ConsumeToken(); 1067 if (Tok.isNot(tok::identifier)) { 1068 Diag(Tok, diag::err_expected_ident); 1069 T.skipToEnd(); 1070 return; 1071 } 1072 IdentifierInfo *Flag = Tok.getIdentifierInfo(); 1073 if (Flag->isStr("layout_compatible")) 1074 LayoutCompatible = true; 1075 else if (Flag->isStr("must_be_null")) 1076 MustBeNull = true; 1077 else { 1078 Diag(Tok, diag::err_type_safety_unknown_flag) << Flag; 1079 T.skipToEnd(); 1080 return; 1081 } 1082 ConsumeToken(); // consume flag 1083 } 1084 1085 if (!T.consumeClose()) { 1086 Attrs.addNewTypeTagForDatatype(&AttrName, AttrNameLoc, 0, AttrNameLoc, 1087 ArgumentKind, ArgumentKindLoc, 1088 MatchingCType.release(), LayoutCompatible, 1089 MustBeNull, AttributeList::AS_GNU); 1090 } 1091 1092 if (EndLoc) 1093 *EndLoc = T.getCloseLocation(); 1094 } 1095 1096 /// DiagnoseProhibitedCXX11Attribute - We have found the opening square brackets 1097 /// of a C++11 attribute-specifier in a location where an attribute is not 1098 /// permitted. By C++11 [dcl.attr.grammar]p6, this is ill-formed. Diagnose this 1099 /// situation. 1100 /// 1101 /// \return \c true if we skipped an attribute-like chunk of tokens, \c false if 1102 /// this doesn't appear to actually be an attribute-specifier, and the caller 1103 /// should try to parse it. 1104 bool Parser::DiagnoseProhibitedCXX11Attribute() { 1105 assert(Tok.is(tok::l_square) && NextToken().is(tok::l_square)); 1106 1107 switch (isCXX11AttributeSpecifier(/*Disambiguate*/true)) { 1108 case CAK_NotAttributeSpecifier: 1109 // No diagnostic: we're in Obj-C++11 and this is not actually an attribute. 1110 return false; 1111 1112 case CAK_InvalidAttributeSpecifier: 1113 Diag(Tok.getLocation(), diag::err_l_square_l_square_not_attribute); 1114 return false; 1115 1116 case CAK_AttributeSpecifier: 1117 // Parse and discard the attributes. 1118 SourceLocation BeginLoc = ConsumeBracket(); 1119 ConsumeBracket(); 1120 SkipUntil(tok::r_square, /*StopAtSemi*/ false); 1121 assert(Tok.is(tok::r_square) && "isCXX11AttributeSpecifier lied"); 1122 SourceLocation EndLoc = ConsumeBracket(); 1123 Diag(BeginLoc, diag::err_attributes_not_allowed) 1124 << SourceRange(BeginLoc, EndLoc); 1125 return true; 1126 } 1127 llvm_unreachable("All cases handled above."); 1128 } 1129 1130 void Parser::DiagnoseProhibitedAttributes(ParsedAttributesWithRange &attrs) { 1131 Diag(attrs.Range.getBegin(), diag::err_attributes_not_allowed) 1132 << attrs.Range; 1133 } 1134 1135 /// ParseDeclaration - Parse a full 'declaration', which consists of 1136 /// declaration-specifiers, some number of declarators, and a semicolon. 1137 /// 'Context' should be a Declarator::TheContext value. This returns the 1138 /// location of the semicolon in DeclEnd. 1139 /// 1140 /// declaration: [C99 6.7] 1141 /// block-declaration -> 1142 /// simple-declaration 1143 /// others [FIXME] 1144 /// [C++] template-declaration 1145 /// [C++] namespace-definition 1146 /// [C++] using-directive 1147 /// [C++] using-declaration 1148 /// [C++11/C11] static_assert-declaration 1149 /// others... [FIXME] 1150 /// 1151 Parser::DeclGroupPtrTy Parser::ParseDeclaration(StmtVector &Stmts, 1152 unsigned Context, 1153 SourceLocation &DeclEnd, 1154 ParsedAttributesWithRange &attrs) { 1155 ParenBraceBracketBalancer BalancerRAIIObj(*this); 1156 // Must temporarily exit the objective-c container scope for 1157 // parsing c none objective-c decls. 1158 ObjCDeclContextSwitch ObjCDC(*this); 1159 1160 Decl *SingleDecl = 0; 1161 Decl *OwnedType = 0; 1162 switch (Tok.getKind()) { 1163 case tok::kw_template: 1164 case tok::kw_export: 1165 ProhibitAttributes(attrs); 1166 SingleDecl = ParseDeclarationStartingWithTemplate(Context, DeclEnd); 1167 break; 1168 case tok::kw_inline: 1169 // Could be the start of an inline namespace. Allowed as an ext in C++03. 1170 if (getLangOpts().CPlusPlus && NextToken().is(tok::kw_namespace)) { 1171 ProhibitAttributes(attrs); 1172 SourceLocation InlineLoc = ConsumeToken(); 1173 SingleDecl = ParseNamespace(Context, DeclEnd, InlineLoc); 1174 break; 1175 } 1176 return ParseSimpleDeclaration(Stmts, Context, DeclEnd, attrs, 1177 true); 1178 case tok::kw_namespace: 1179 ProhibitAttributes(attrs); 1180 SingleDecl = ParseNamespace(Context, DeclEnd); 1181 break; 1182 case tok::kw_using: 1183 SingleDecl = ParseUsingDirectiveOrDeclaration(Context, ParsedTemplateInfo(), 1184 DeclEnd, attrs, &OwnedType); 1185 break; 1186 case tok::kw_static_assert: 1187 case tok::kw__Static_assert: 1188 ProhibitAttributes(attrs); 1189 SingleDecl = ParseStaticAssertDeclaration(DeclEnd); 1190 break; 1191 default: 1192 return ParseSimpleDeclaration(Stmts, Context, DeclEnd, attrs, true); 1193 } 1194 1195 // This routine returns a DeclGroup, if the thing we parsed only contains a 1196 // single decl, convert it now. Alias declarations can also declare a type; 1197 // include that too if it is present. 1198 return Actions.ConvertDeclToDeclGroup(SingleDecl, OwnedType); 1199 } 1200 1201 /// simple-declaration: [C99 6.7: declaration] [C++ 7p1: dcl.dcl] 1202 /// declaration-specifiers init-declarator-list[opt] ';' 1203 /// [C++11] attribute-specifier-seq decl-specifier-seq[opt] 1204 /// init-declarator-list ';' 1205 ///[C90/C++]init-declarator-list ';' [TODO] 1206 /// [OMP] threadprivate-directive [TODO] 1207 /// 1208 /// for-range-declaration: [C++11 6.5p1: stmt.ranged] 1209 /// attribute-specifier-seq[opt] type-specifier-seq declarator 1210 /// 1211 /// If RequireSemi is false, this does not check for a ';' at the end of the 1212 /// declaration. If it is true, it checks for and eats it. 1213 /// 1214 /// If FRI is non-null, we might be parsing a for-range-declaration instead 1215 /// of a simple-declaration. If we find that we are, we also parse the 1216 /// for-range-initializer, and place it here. 1217 Parser::DeclGroupPtrTy 1218 Parser::ParseSimpleDeclaration(StmtVector &Stmts, unsigned Context, 1219 SourceLocation &DeclEnd, 1220 ParsedAttributesWithRange &attrs, 1221 bool RequireSemi, ForRangeInit *FRI) { 1222 // Parse the common declaration-specifiers piece. 1223 ParsingDeclSpec DS(*this); 1224 DS.takeAttributesFrom(attrs); 1225 1226 ParseDeclarationSpecifiers(DS, ParsedTemplateInfo(), AS_none, 1227 getDeclSpecContextFromDeclaratorContext(Context)); 1228 1229 // C99 6.7.2.3p6: Handle "struct-or-union identifier;", "enum { X };" 1230 // declaration-specifiers init-declarator-list[opt] ';' 1231 if (Tok.is(tok::semi)) { 1232 DeclEnd = Tok.getLocation(); 1233 if (RequireSemi) ConsumeToken(); 1234 Decl *TheDecl = Actions.ParsedFreeStandingDeclSpec(getCurScope(), AS_none, 1235 DS); 1236 DS.complete(TheDecl); 1237 return Actions.ConvertDeclToDeclGroup(TheDecl); 1238 } 1239 1240 return ParseDeclGroup(DS, Context, /*FunctionDefs=*/ false, &DeclEnd, FRI); 1241 } 1242 1243 /// Returns true if this might be the start of a declarator, or a common typo 1244 /// for a declarator. 1245 bool Parser::MightBeDeclarator(unsigned Context) { 1246 switch (Tok.getKind()) { 1247 case tok::annot_cxxscope: 1248 case tok::annot_template_id: 1249 case tok::caret: 1250 case tok::code_completion: 1251 case tok::coloncolon: 1252 case tok::ellipsis: 1253 case tok::kw___attribute: 1254 case tok::kw_operator: 1255 case tok::l_paren: 1256 case tok::star: 1257 return true; 1258 1259 case tok::amp: 1260 case tok::ampamp: 1261 return getLangOpts().CPlusPlus; 1262 1263 case tok::l_square: // Might be an attribute on an unnamed bit-field. 1264 return Context == Declarator::MemberContext && getLangOpts().CPlusPlus0x && 1265 NextToken().is(tok::l_square); 1266 1267 case tok::colon: // Might be a typo for '::' or an unnamed bit-field. 1268 return Context == Declarator::MemberContext || getLangOpts().CPlusPlus; 1269 1270 case tok::identifier: 1271 switch (NextToken().getKind()) { 1272 case tok::code_completion: 1273 case tok::coloncolon: 1274 case tok::comma: 1275 case tok::equal: 1276 case tok::equalequal: // Might be a typo for '='. 1277 case tok::kw_alignas: 1278 case tok::kw_asm: 1279 case tok::kw___attribute: 1280 case tok::l_brace: 1281 case tok::l_paren: 1282 case tok::l_square: 1283 case tok::less: 1284 case tok::r_brace: 1285 case tok::r_paren: 1286 case tok::r_square: 1287 case tok::semi: 1288 return true; 1289 1290 case tok::colon: 1291 // At namespace scope, 'identifier:' is probably a typo for 'identifier::' 1292 // and in block scope it's probably a label. Inside a class definition, 1293 // this is a bit-field. 1294 return Context == Declarator::MemberContext || 1295 (getLangOpts().CPlusPlus && Context == Declarator::FileContext); 1296 1297 case tok::identifier: // Possible virt-specifier. 1298 return getLangOpts().CPlusPlus0x && isCXX0XVirtSpecifier(NextToken()); 1299 1300 default: 1301 return false; 1302 } 1303 1304 default: 1305 return false; 1306 } 1307 } 1308 1309 /// Skip until we reach something which seems like a sensible place to pick 1310 /// up parsing after a malformed declaration. This will sometimes stop sooner 1311 /// than SkipUntil(tok::r_brace) would, but will never stop later. 1312 void Parser::SkipMalformedDecl() { 1313 while (true) { 1314 switch (Tok.getKind()) { 1315 case tok::l_brace: 1316 // Skip until matching }, then stop. We've probably skipped over 1317 // a malformed class or function definition or similar. 1318 ConsumeBrace(); 1319 SkipUntil(tok::r_brace, /*StopAtSemi*/false); 1320 if (Tok.is(tok::comma) || Tok.is(tok::l_brace) || Tok.is(tok::kw_try)) { 1321 // This declaration isn't over yet. Keep skipping. 1322 continue; 1323 } 1324 if (Tok.is(tok::semi)) 1325 ConsumeToken(); 1326 return; 1327 1328 case tok::l_square: 1329 ConsumeBracket(); 1330 SkipUntil(tok::r_square, /*StopAtSemi*/false); 1331 continue; 1332 1333 case tok::l_paren: 1334 ConsumeParen(); 1335 SkipUntil(tok::r_paren, /*StopAtSemi*/false); 1336 continue; 1337 1338 case tok::r_brace: 1339 return; 1340 1341 case tok::semi: 1342 ConsumeToken(); 1343 return; 1344 1345 case tok::kw_inline: 1346 // 'inline namespace' at the start of a line is almost certainly 1347 // a good place to pick back up parsing, except in an Objective-C 1348 // @interface context. 1349 if (Tok.isAtStartOfLine() && NextToken().is(tok::kw_namespace) && 1350 (!ParsingInObjCContainer || CurParsedObjCImpl)) 1351 return; 1352 break; 1353 1354 case tok::kw_namespace: 1355 // 'namespace' at the start of a line is almost certainly a good 1356 // place to pick back up parsing, except in an Objective-C 1357 // @interface context. 1358 if (Tok.isAtStartOfLine() && 1359 (!ParsingInObjCContainer || CurParsedObjCImpl)) 1360 return; 1361 break; 1362 1363 case tok::at: 1364 // @end is very much like } in Objective-C contexts. 1365 if (NextToken().isObjCAtKeyword(tok::objc_end) && 1366 ParsingInObjCContainer) 1367 return; 1368 break; 1369 1370 case tok::minus: 1371 case tok::plus: 1372 // - and + probably start new method declarations in Objective-C contexts. 1373 if (Tok.isAtStartOfLine() && ParsingInObjCContainer) 1374 return; 1375 break; 1376 1377 case tok::eof: 1378 return; 1379 1380 default: 1381 break; 1382 } 1383 1384 ConsumeAnyToken(); 1385 } 1386 } 1387 1388 /// ParseDeclGroup - Having concluded that this is either a function 1389 /// definition or a group of object declarations, actually parse the 1390 /// result. 1391 Parser::DeclGroupPtrTy Parser::ParseDeclGroup(ParsingDeclSpec &DS, 1392 unsigned Context, 1393 bool AllowFunctionDefinitions, 1394 SourceLocation *DeclEnd, 1395 ForRangeInit *FRI) { 1396 // Parse the first declarator. 1397 ParsingDeclarator D(*this, DS, static_cast<Declarator::TheContext>(Context)); 1398 ParseDeclarator(D); 1399 1400 // Bail out if the first declarator didn't seem well-formed. 1401 if (!D.hasName() && !D.mayOmitIdentifier()) { 1402 SkipMalformedDecl(); 1403 return DeclGroupPtrTy(); 1404 } 1405 1406 // Save late-parsed attributes for now; they need to be parsed in the 1407 // appropriate function scope after the function Decl has been constructed. 1408 LateParsedAttrList LateParsedAttrs; 1409 if (D.isFunctionDeclarator()) 1410 MaybeParseGNUAttributes(D, &LateParsedAttrs); 1411 1412 // Check to see if we have a function *definition* which must have a body. 1413 if (AllowFunctionDefinitions && D.isFunctionDeclarator() && 1414 // Look at the next token to make sure that this isn't a function 1415 // declaration. We have to check this because __attribute__ might be the 1416 // start of a function definition in GCC-extended K&R C. 1417 !isDeclarationAfterDeclarator()) { 1418 1419 if (isStartOfFunctionDefinition(D)) { 1420 if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef) { 1421 Diag(Tok, diag::err_function_declared_typedef); 1422 1423 // Recover by treating the 'typedef' as spurious. 1424 DS.ClearStorageClassSpecs(); 1425 } 1426 1427 Decl *TheDecl = 1428 ParseFunctionDefinition(D, ParsedTemplateInfo(), &LateParsedAttrs); 1429 return Actions.ConvertDeclToDeclGroup(TheDecl); 1430 } 1431 1432 if (isDeclarationSpecifier()) { 1433 // If there is an invalid declaration specifier right after the function 1434 // prototype, then we must be in a missing semicolon case where this isn't 1435 // actually a body. Just fall through into the code that handles it as a 1436 // prototype, and let the top-level code handle the erroneous declspec 1437 // where it would otherwise expect a comma or semicolon. 1438 } else { 1439 Diag(Tok, diag::err_expected_fn_body); 1440 SkipUntil(tok::semi); 1441 return DeclGroupPtrTy(); 1442 } 1443 } 1444 1445 if (ParseAsmAttributesAfterDeclarator(D)) 1446 return DeclGroupPtrTy(); 1447 1448 // C++0x [stmt.iter]p1: Check if we have a for-range-declarator. If so, we 1449 // must parse and analyze the for-range-initializer before the declaration is 1450 // analyzed. 1451 if (FRI && Tok.is(tok::colon)) { 1452 FRI->ColonLoc = ConsumeToken(); 1453 if (Tok.is(tok::l_brace)) 1454 FRI->RangeExpr = ParseBraceInitializer(); 1455 else 1456 FRI->RangeExpr = ParseExpression(); 1457 Decl *ThisDecl = Actions.ActOnDeclarator(getCurScope(), D); 1458 Actions.ActOnCXXForRangeDecl(ThisDecl); 1459 Actions.FinalizeDeclaration(ThisDecl); 1460 D.complete(ThisDecl); 1461 return Actions.FinalizeDeclaratorGroup(getCurScope(), DS, &ThisDecl, 1); 1462 } 1463 1464 SmallVector<Decl *, 8> DeclsInGroup; 1465 Decl *FirstDecl = ParseDeclarationAfterDeclaratorAndAttributes(D); 1466 if (LateParsedAttrs.size() > 0) 1467 ParseLexedAttributeList(LateParsedAttrs, FirstDecl, true, false); 1468 D.complete(FirstDecl); 1469 if (FirstDecl) 1470 DeclsInGroup.push_back(FirstDecl); 1471 1472 bool ExpectSemi = Context != Declarator::ForContext; 1473 1474 // If we don't have a comma, it is either the end of the list (a ';') or an 1475 // error, bail out. 1476 while (Tok.is(tok::comma)) { 1477 SourceLocation CommaLoc = ConsumeToken(); 1478 1479 if (Tok.isAtStartOfLine() && ExpectSemi && !MightBeDeclarator(Context)) { 1480 // This comma was followed by a line-break and something which can't be 1481 // the start of a declarator. The comma was probably a typo for a 1482 // semicolon. 1483 Diag(CommaLoc, diag::err_expected_semi_declaration) 1484 << FixItHint::CreateReplacement(CommaLoc, ";"); 1485 ExpectSemi = false; 1486 break; 1487 } 1488 1489 // Parse the next declarator. 1490 D.clear(); 1491 D.setCommaLoc(CommaLoc); 1492 1493 // Accept attributes in an init-declarator. In the first declarator in a 1494 // declaration, these would be part of the declspec. In subsequent 1495 // declarators, they become part of the declarator itself, so that they 1496 // don't apply to declarators after *this* one. Examples: 1497 // short __attribute__((common)) var; -> declspec 1498 // short var __attribute__((common)); -> declarator 1499 // short x, __attribute__((common)) var; -> declarator 1500 MaybeParseGNUAttributes(D); 1501 1502 ParseDeclarator(D); 1503 if (!D.isInvalidType()) { 1504 Decl *ThisDecl = ParseDeclarationAfterDeclarator(D); 1505 D.complete(ThisDecl); 1506 if (ThisDecl) 1507 DeclsInGroup.push_back(ThisDecl); 1508 } 1509 } 1510 1511 if (DeclEnd) 1512 *DeclEnd = Tok.getLocation(); 1513 1514 if (ExpectSemi && 1515 ExpectAndConsumeSemi(Context == Declarator::FileContext 1516 ? diag::err_invalid_token_after_toplevel_declarator 1517 : diag::err_expected_semi_declaration)) { 1518 // Okay, there was no semicolon and one was expected. If we see a 1519 // declaration specifier, just assume it was missing and continue parsing. 1520 // Otherwise things are very confused and we skip to recover. 1521 if (!isDeclarationSpecifier()) { 1522 SkipUntil(tok::r_brace, true, true); 1523 if (Tok.is(tok::semi)) 1524 ConsumeToken(); 1525 } 1526 } 1527 1528 return Actions.FinalizeDeclaratorGroup(getCurScope(), DS, 1529 DeclsInGroup.data(), 1530 DeclsInGroup.size()); 1531 } 1532 1533 /// Parse an optional simple-asm-expr and attributes, and attach them to a 1534 /// declarator. Returns true on an error. 1535 bool Parser::ParseAsmAttributesAfterDeclarator(Declarator &D) { 1536 // If a simple-asm-expr is present, parse it. 1537 if (Tok.is(tok::kw_asm)) { 1538 SourceLocation Loc; 1539 ExprResult AsmLabel(ParseSimpleAsm(&Loc)); 1540 if (AsmLabel.isInvalid()) { 1541 SkipUntil(tok::semi, true, true); 1542 return true; 1543 } 1544 1545 D.setAsmLabel(AsmLabel.release()); 1546 D.SetRangeEnd(Loc); 1547 } 1548 1549 MaybeParseGNUAttributes(D); 1550 return false; 1551 } 1552 1553 /// \brief Parse 'declaration' after parsing 'declaration-specifiers 1554 /// declarator'. This method parses the remainder of the declaration 1555 /// (including any attributes or initializer, among other things) and 1556 /// finalizes the declaration. 1557 /// 1558 /// init-declarator: [C99 6.7] 1559 /// declarator 1560 /// declarator '=' initializer 1561 /// [GNU] declarator simple-asm-expr[opt] attributes[opt] 1562 /// [GNU] declarator simple-asm-expr[opt] attributes[opt] '=' initializer 1563 /// [C++] declarator initializer[opt] 1564 /// 1565 /// [C++] initializer: 1566 /// [C++] '=' initializer-clause 1567 /// [C++] '(' expression-list ')' 1568 /// [C++0x] '=' 'default' [TODO] 1569 /// [C++0x] '=' 'delete' 1570 /// [C++0x] braced-init-list 1571 /// 1572 /// According to the standard grammar, =default and =delete are function 1573 /// definitions, but that definitely doesn't fit with the parser here. 1574 /// 1575 Decl *Parser::ParseDeclarationAfterDeclarator(Declarator &D, 1576 const ParsedTemplateInfo &TemplateInfo) { 1577 if (ParseAsmAttributesAfterDeclarator(D)) 1578 return 0; 1579 1580 return ParseDeclarationAfterDeclaratorAndAttributes(D, TemplateInfo); 1581 } 1582 1583 Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(Declarator &D, 1584 const ParsedTemplateInfo &TemplateInfo) { 1585 // Inform the current actions module that we just parsed this declarator. 1586 Decl *ThisDecl = 0; 1587 switch (TemplateInfo.Kind) { 1588 case ParsedTemplateInfo::NonTemplate: 1589 ThisDecl = Actions.ActOnDeclarator(getCurScope(), D); 1590 break; 1591 1592 case ParsedTemplateInfo::Template: 1593 case ParsedTemplateInfo::ExplicitSpecialization: 1594 ThisDecl = Actions.ActOnTemplateDeclarator(getCurScope(), 1595 *TemplateInfo.TemplateParams, 1596 D); 1597 break; 1598 1599 case ParsedTemplateInfo::ExplicitInstantiation: { 1600 DeclResult ThisRes 1601 = Actions.ActOnExplicitInstantiation(getCurScope(), 1602 TemplateInfo.ExternLoc, 1603 TemplateInfo.TemplateLoc, 1604 D); 1605 if (ThisRes.isInvalid()) { 1606 SkipUntil(tok::semi, true, true); 1607 return 0; 1608 } 1609 1610 ThisDecl = ThisRes.get(); 1611 break; 1612 } 1613 } 1614 1615 bool TypeContainsAuto = 1616 D.getDeclSpec().getTypeSpecType() == DeclSpec::TST_auto; 1617 1618 // Parse declarator '=' initializer. 1619 // If a '==' or '+=' is found, suggest a fixit to '='. 1620 if (isTokenEqualOrEqualTypo()) { 1621 ConsumeToken(); 1622 if (Tok.is(tok::kw_delete)) { 1623 if (D.isFunctionDeclarator()) 1624 Diag(ConsumeToken(), diag::err_default_delete_in_multiple_declaration) 1625 << 1 /* delete */; 1626 else 1627 Diag(ConsumeToken(), diag::err_deleted_non_function); 1628 } else if (Tok.is(tok::kw_default)) { 1629 if (D.isFunctionDeclarator()) 1630 Diag(ConsumeToken(), diag::err_default_delete_in_multiple_declaration) 1631 << 0 /* default */; 1632 else 1633 Diag(ConsumeToken(), diag::err_default_special_members); 1634 } else { 1635 if (getLangOpts().CPlusPlus && D.getCXXScopeSpec().isSet()) { 1636 EnterScope(0); 1637 Actions.ActOnCXXEnterDeclInitializer(getCurScope(), ThisDecl); 1638 } 1639 1640 if (Tok.is(tok::code_completion)) { 1641 Actions.CodeCompleteInitializer(getCurScope(), ThisDecl); 1642 Actions.FinalizeDeclaration(ThisDecl); 1643 cutOffParsing(); 1644 return 0; 1645 } 1646 1647 ExprResult Init(ParseInitializer()); 1648 1649 if (getLangOpts().CPlusPlus && D.getCXXScopeSpec().isSet()) { 1650 Actions.ActOnCXXExitDeclInitializer(getCurScope(), ThisDecl); 1651 ExitScope(); 1652 } 1653 1654 if (Init.isInvalid()) { 1655 SkipUntil(tok::comma, true, true); 1656 Actions.ActOnInitializerError(ThisDecl); 1657 } else 1658 Actions.AddInitializerToDecl(ThisDecl, Init.take(), 1659 /*DirectInit=*/false, TypeContainsAuto); 1660 } 1661 } else if (Tok.is(tok::l_paren)) { 1662 // Parse C++ direct initializer: '(' expression-list ')' 1663 BalancedDelimiterTracker T(*this, tok::l_paren); 1664 T.consumeOpen(); 1665 1666 ExprVector Exprs; 1667 CommaLocsTy CommaLocs; 1668 1669 if (getLangOpts().CPlusPlus && D.getCXXScopeSpec().isSet()) { 1670 EnterScope(0); 1671 Actions.ActOnCXXEnterDeclInitializer(getCurScope(), ThisDecl); 1672 } 1673 1674 if (ParseExpressionList(Exprs, CommaLocs)) { 1675 SkipUntil(tok::r_paren); 1676 1677 if (getLangOpts().CPlusPlus && D.getCXXScopeSpec().isSet()) { 1678 Actions.ActOnCXXExitDeclInitializer(getCurScope(), ThisDecl); 1679 ExitScope(); 1680 } 1681 } else { 1682 // Match the ')'. 1683 T.consumeClose(); 1684 1685 assert(!Exprs.empty() && Exprs.size()-1 == CommaLocs.size() && 1686 "Unexpected number of commas!"); 1687 1688 if (getLangOpts().CPlusPlus && D.getCXXScopeSpec().isSet()) { 1689 Actions.ActOnCXXExitDeclInitializer(getCurScope(), ThisDecl); 1690 ExitScope(); 1691 } 1692 1693 ExprResult Initializer = Actions.ActOnParenListExpr(T.getOpenLocation(), 1694 T.getCloseLocation(), 1695 Exprs); 1696 Actions.AddInitializerToDecl(ThisDecl, Initializer.take(), 1697 /*DirectInit=*/true, TypeContainsAuto); 1698 } 1699 } else if (getLangOpts().CPlusPlus0x && Tok.is(tok::l_brace) && 1700 (!CurParsedObjCImpl || !D.isFunctionDeclarator())) { 1701 // Parse C++0x braced-init-list. 1702 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists); 1703 1704 if (D.getCXXScopeSpec().isSet()) { 1705 EnterScope(0); 1706 Actions.ActOnCXXEnterDeclInitializer(getCurScope(), ThisDecl); 1707 } 1708 1709 ExprResult Init(ParseBraceInitializer()); 1710 1711 if (D.getCXXScopeSpec().isSet()) { 1712 Actions.ActOnCXXExitDeclInitializer(getCurScope(), ThisDecl); 1713 ExitScope(); 1714 } 1715 1716 if (Init.isInvalid()) { 1717 Actions.ActOnInitializerError(ThisDecl); 1718 } else 1719 Actions.AddInitializerToDecl(ThisDecl, Init.take(), 1720 /*DirectInit=*/true, TypeContainsAuto); 1721 1722 } else { 1723 Actions.ActOnUninitializedDecl(ThisDecl, TypeContainsAuto); 1724 } 1725 1726 Actions.FinalizeDeclaration(ThisDecl); 1727 1728 return ThisDecl; 1729 } 1730 1731 /// ParseSpecifierQualifierList 1732 /// specifier-qualifier-list: 1733 /// type-specifier specifier-qualifier-list[opt] 1734 /// type-qualifier specifier-qualifier-list[opt] 1735 /// [GNU] attributes specifier-qualifier-list[opt] 1736 /// 1737 void Parser::ParseSpecifierQualifierList(DeclSpec &DS, AccessSpecifier AS, 1738 DeclSpecContext DSC) { 1739 /// specifier-qualifier-list is a subset of declaration-specifiers. Just 1740 /// parse declaration-specifiers and complain about extra stuff. 1741 /// TODO: diagnose attribute-specifiers and alignment-specifiers. 1742 ParseDeclarationSpecifiers(DS, ParsedTemplateInfo(), AS, DSC); 1743 1744 // Validate declspec for type-name. 1745 unsigned Specs = DS.getParsedSpecifiers(); 1746 if ((DSC == DSC_type_specifier || DSC == DSC_trailing) && 1747 !DS.hasTypeSpecifier()) { 1748 Diag(Tok, diag::err_expected_type); 1749 DS.SetTypeSpecError(); 1750 } else if (Specs == DeclSpec::PQ_None && !DS.getNumProtocolQualifiers() && 1751 !DS.hasAttributes()) { 1752 Diag(Tok, diag::err_typename_requires_specqual); 1753 if (!DS.hasTypeSpecifier()) 1754 DS.SetTypeSpecError(); 1755 } 1756 1757 // Issue diagnostic and remove storage class if present. 1758 if (Specs & DeclSpec::PQ_StorageClassSpecifier) { 1759 if (DS.getStorageClassSpecLoc().isValid()) 1760 Diag(DS.getStorageClassSpecLoc(),diag::err_typename_invalid_storageclass); 1761 else 1762 Diag(DS.getThreadSpecLoc(), diag::err_typename_invalid_storageclass); 1763 DS.ClearStorageClassSpecs(); 1764 } 1765 1766 // Issue diagnostic and remove function specfier if present. 1767 if (Specs & DeclSpec::PQ_FunctionSpecifier) { 1768 if (DS.isInlineSpecified()) 1769 Diag(DS.getInlineSpecLoc(), diag::err_typename_invalid_functionspec); 1770 if (DS.isVirtualSpecified()) 1771 Diag(DS.getVirtualSpecLoc(), diag::err_typename_invalid_functionspec); 1772 if (DS.isExplicitSpecified()) 1773 Diag(DS.getExplicitSpecLoc(), diag::err_typename_invalid_functionspec); 1774 DS.ClearFunctionSpecs(); 1775 } 1776 1777 // Issue diagnostic and remove constexpr specfier if present. 1778 if (DS.isConstexprSpecified()) { 1779 Diag(DS.getConstexprSpecLoc(), diag::err_typename_invalid_constexpr); 1780 DS.ClearConstexprSpec(); 1781 } 1782 } 1783 1784 /// isValidAfterIdentifierInDeclaratorAfterDeclSpec - Return true if the 1785 /// specified token is valid after the identifier in a declarator which 1786 /// immediately follows the declspec. For example, these things are valid: 1787 /// 1788 /// int x [ 4]; // direct-declarator 1789 /// int x ( int y); // direct-declarator 1790 /// int(int x ) // direct-declarator 1791 /// int x ; // simple-declaration 1792 /// int x = 17; // init-declarator-list 1793 /// int x , y; // init-declarator-list 1794 /// int x __asm__ ("foo"); // init-declarator-list 1795 /// int x : 4; // struct-declarator 1796 /// int x { 5}; // C++'0x unified initializers 1797 /// 1798 /// This is not, because 'x' does not immediately follow the declspec (though 1799 /// ')' happens to be valid anyway). 1800 /// int (x) 1801 /// 1802 static bool isValidAfterIdentifierInDeclarator(const Token &T) { 1803 return T.is(tok::l_square) || T.is(tok::l_paren) || T.is(tok::r_paren) || 1804 T.is(tok::semi) || T.is(tok::comma) || T.is(tok::equal) || 1805 T.is(tok::kw_asm) || T.is(tok::l_brace) || T.is(tok::colon); 1806 } 1807 1808 1809 /// ParseImplicitInt - This method is called when we have an non-typename 1810 /// identifier in a declspec (which normally terminates the decl spec) when 1811 /// the declspec has no type specifier. In this case, the declspec is either 1812 /// malformed or is "implicit int" (in K&R and C89). 1813 /// 1814 /// This method handles diagnosing this prettily and returns false if the 1815 /// declspec is done being processed. If it recovers and thinks there may be 1816 /// other pieces of declspec after it, it returns true. 1817 /// 1818 bool Parser::ParseImplicitInt(DeclSpec &DS, CXXScopeSpec *SS, 1819 const ParsedTemplateInfo &TemplateInfo, 1820 AccessSpecifier AS, DeclSpecContext DSC) { 1821 assert(Tok.is(tok::identifier) && "should have identifier"); 1822 1823 SourceLocation Loc = Tok.getLocation(); 1824 // If we see an identifier that is not a type name, we normally would 1825 // parse it as the identifer being declared. However, when a typename 1826 // is typo'd or the definition is not included, this will incorrectly 1827 // parse the typename as the identifier name and fall over misparsing 1828 // later parts of the diagnostic. 1829 // 1830 // As such, we try to do some look-ahead in cases where this would 1831 // otherwise be an "implicit-int" case to see if this is invalid. For 1832 // example: "static foo_t x = 4;" In this case, if we parsed foo_t as 1833 // an identifier with implicit int, we'd get a parse error because the 1834 // next token is obviously invalid for a type. Parse these as a case 1835 // with an invalid type specifier. 1836 assert(!DS.hasTypeSpecifier() && "Type specifier checked above"); 1837 1838 // Since we know that this either implicit int (which is rare) or an 1839 // error, do lookahead to try to do better recovery. This never applies 1840 // within a type specifier. Outside of C++, we allow this even if the 1841 // language doesn't "officially" support implicit int -- we support 1842 // implicit int as an extension in C99 and C11. Allegedly, MS also 1843 // supports implicit int in C++ mode. 1844 if (DSC != DSC_type_specifier && DSC != DSC_trailing && 1845 (!getLangOpts().CPlusPlus || getLangOpts().MicrosoftExt) && 1846 isValidAfterIdentifierInDeclarator(NextToken())) { 1847 // If this token is valid for implicit int, e.g. "static x = 4", then 1848 // we just avoid eating the identifier, so it will be parsed as the 1849 // identifier in the declarator. 1850 return false; 1851 } 1852 1853 if (getLangOpts().CPlusPlus && 1854 DS.getStorageClassSpec() == DeclSpec::SCS_auto) { 1855 // Don't require a type specifier if we have the 'auto' storage class 1856 // specifier in C++98 -- we'll promote it to a type specifier. 1857 return false; 1858 } 1859 1860 // Otherwise, if we don't consume this token, we are going to emit an 1861 // error anyway. Try to recover from various common problems. Check 1862 // to see if this was a reference to a tag name without a tag specified. 1863 // This is a common problem in C (saying 'foo' instead of 'struct foo'). 1864 // 1865 // C++ doesn't need this, and isTagName doesn't take SS. 1866 if (SS == 0) { 1867 const char *TagName = 0, *FixitTagName = 0; 1868 tok::TokenKind TagKind = tok::unknown; 1869 1870 switch (Actions.isTagName(*Tok.getIdentifierInfo(), getCurScope())) { 1871 default: break; 1872 case DeclSpec::TST_enum: 1873 TagName="enum" ; FixitTagName = "enum " ; TagKind=tok::kw_enum ;break; 1874 case DeclSpec::TST_union: 1875 TagName="union" ; FixitTagName = "union " ;TagKind=tok::kw_union ;break; 1876 case DeclSpec::TST_struct: 1877 TagName="struct"; FixitTagName = "struct ";TagKind=tok::kw_struct;break; 1878 case DeclSpec::TST_interface: 1879 TagName="__interface"; FixitTagName = "__interface "; 1880 TagKind=tok::kw___interface;break; 1881 case DeclSpec::TST_class: 1882 TagName="class" ; FixitTagName = "class " ;TagKind=tok::kw_class ;break; 1883 } 1884 1885 if (TagName) { 1886 IdentifierInfo *TokenName = Tok.getIdentifierInfo(); 1887 LookupResult R(Actions, TokenName, SourceLocation(), 1888 Sema::LookupOrdinaryName); 1889 1890 Diag(Loc, diag::err_use_of_tag_name_without_tag) 1891 << TokenName << TagName << getLangOpts().CPlusPlus 1892 << FixItHint::CreateInsertion(Tok.getLocation(), FixitTagName); 1893 1894 if (Actions.LookupParsedName(R, getCurScope(), SS)) { 1895 for (LookupResult::iterator I = R.begin(), IEnd = R.end(); 1896 I != IEnd; ++I) 1897 Diag((*I)->getLocation(), diag::note_decl_hiding_tag_type) 1898 << TokenName << TagName; 1899 } 1900 1901 // Parse this as a tag as if the missing tag were present. 1902 if (TagKind == tok::kw_enum) 1903 ParseEnumSpecifier(Loc, DS, TemplateInfo, AS, DSC_normal); 1904 else 1905 ParseClassSpecifier(TagKind, Loc, DS, TemplateInfo, AS, 1906 /*EnteringContext*/ false, DSC_normal); 1907 return true; 1908 } 1909 } 1910 1911 // Determine whether this identifier could plausibly be the name of something 1912 // being declared (with a missing type). 1913 if (DSC != DSC_type_specifier && DSC != DSC_trailing && 1914 (!SS || DSC == DSC_top_level || DSC == DSC_class)) { 1915 // Look ahead to the next token to try to figure out what this declaration 1916 // was supposed to be. 1917 switch (NextToken().getKind()) { 1918 case tok::comma: 1919 case tok::equal: 1920 case tok::kw_asm: 1921 case tok::l_brace: 1922 case tok::l_square: 1923 case tok::semi: 1924 // This looks like a variable declaration. The type is probably missing. 1925 // We're done parsing decl-specifiers. 1926 return false; 1927 1928 case tok::l_paren: { 1929 // static x(4); // 'x' is not a type 1930 // x(int n); // 'x' is not a type 1931 // x (*p)[]; // 'x' is a type 1932 // 1933 // Since we're in an error case (or the rare 'implicit int in C++' MS 1934 // extension), we can afford to perform a tentative parse to determine 1935 // which case we're in. 1936 TentativeParsingAction PA(*this); 1937 ConsumeToken(); 1938 TPResult TPR = TryParseDeclarator(/*mayBeAbstract*/false); 1939 PA.Revert(); 1940 if (TPR == TPResult::False()) 1941 return false; 1942 // The identifier is followed by a parenthesized declarator. 1943 // It's supposed to be a type. 1944 break; 1945 } 1946 1947 default: 1948 // This is probably supposed to be a type. This includes cases like: 1949 // int f(itn); 1950 // struct S { unsinged : 4; }; 1951 break; 1952 } 1953 } 1954 1955 // This is almost certainly an invalid type name. Let the action emit a 1956 // diagnostic and attempt to recover. 1957 ParsedType T; 1958 IdentifierInfo *II = Tok.getIdentifierInfo(); 1959 if (Actions.DiagnoseUnknownTypeName(II, Loc, getCurScope(), SS, T)) { 1960 // The action emitted a diagnostic, so we don't have to. 1961 if (T) { 1962 // The action has suggested that the type T could be used. Set that as 1963 // the type in the declaration specifiers, consume the would-be type 1964 // name token, and we're done. 1965 const char *PrevSpec; 1966 unsigned DiagID; 1967 DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec, DiagID, T); 1968 DS.SetRangeEnd(Tok.getLocation()); 1969 ConsumeToken(); 1970 // There may be other declaration specifiers after this. 1971 return true; 1972 } else if (II != Tok.getIdentifierInfo()) { 1973 // If no type was suggested, the correction is to a keyword 1974 Tok.setKind(II->getTokenID()); 1975 // There may be other declaration specifiers after this. 1976 return true; 1977 } 1978 1979 // Fall through; the action had no suggestion for us. 1980 } else { 1981 // The action did not emit a diagnostic, so emit one now. 1982 SourceRange R; 1983 if (SS) R = SS->getRange(); 1984 Diag(Loc, diag::err_unknown_typename) << Tok.getIdentifierInfo() << R; 1985 } 1986 1987 // Mark this as an error. 1988 DS.SetTypeSpecError(); 1989 DS.SetRangeEnd(Tok.getLocation()); 1990 ConsumeToken(); 1991 1992 // TODO: Could inject an invalid typedef decl in an enclosing scope to 1993 // avoid rippling error messages on subsequent uses of the same type, 1994 // could be useful if #include was forgotten. 1995 return false; 1996 } 1997 1998 /// \brief Determine the declaration specifier context from the declarator 1999 /// context. 2000 /// 2001 /// \param Context the declarator context, which is one of the 2002 /// Declarator::TheContext enumerator values. 2003 Parser::DeclSpecContext 2004 Parser::getDeclSpecContextFromDeclaratorContext(unsigned Context) { 2005 if (Context == Declarator::MemberContext) 2006 return DSC_class; 2007 if (Context == Declarator::FileContext) 2008 return DSC_top_level; 2009 if (Context == Declarator::TrailingReturnContext) 2010 return DSC_trailing; 2011 return DSC_normal; 2012 } 2013 2014 /// ParseAlignArgument - Parse the argument to an alignment-specifier. 2015 /// 2016 /// FIXME: Simply returns an alignof() expression if the argument is a 2017 /// type. Ideally, the type should be propagated directly into Sema. 2018 /// 2019 /// [C11] type-id 2020 /// [C11] constant-expression 2021 /// [C++0x] type-id ...[opt] 2022 /// [C++0x] assignment-expression ...[opt] 2023 ExprResult Parser::ParseAlignArgument(SourceLocation Start, 2024 SourceLocation &EllipsisLoc) { 2025 ExprResult ER; 2026 if (isTypeIdInParens()) { 2027 SourceLocation TypeLoc = Tok.getLocation(); 2028 ParsedType Ty = ParseTypeName().get(); 2029 SourceRange TypeRange(Start, Tok.getLocation()); 2030 ER = Actions.ActOnUnaryExprOrTypeTraitExpr(TypeLoc, UETT_AlignOf, true, 2031 Ty.getAsOpaquePtr(), TypeRange); 2032 } else 2033 ER = ParseConstantExpression(); 2034 2035 if (getLangOpts().CPlusPlus0x && Tok.is(tok::ellipsis)) 2036 EllipsisLoc = ConsumeToken(); 2037 2038 return ER; 2039 } 2040 2041 /// ParseAlignmentSpecifier - Parse an alignment-specifier, and add the 2042 /// attribute to Attrs. 2043 /// 2044 /// alignment-specifier: 2045 /// [C11] '_Alignas' '(' type-id ')' 2046 /// [C11] '_Alignas' '(' constant-expression ')' 2047 /// [C++0x] 'alignas' '(' type-id ...[opt] ')' 2048 /// [C++0x] 'alignas' '(' assignment-expression ...[opt] ')' 2049 void Parser::ParseAlignmentSpecifier(ParsedAttributes &Attrs, 2050 SourceLocation *endLoc) { 2051 assert((Tok.is(tok::kw_alignas) || Tok.is(tok::kw__Alignas)) && 2052 "Not an alignment-specifier!"); 2053 2054 SourceLocation KWLoc = Tok.getLocation(); 2055 ConsumeToken(); 2056 2057 BalancedDelimiterTracker T(*this, tok::l_paren); 2058 if (T.expectAndConsume(diag::err_expected_lparen)) 2059 return; 2060 2061 SourceLocation EllipsisLoc; 2062 ExprResult ArgExpr = ParseAlignArgument(T.getOpenLocation(), EllipsisLoc); 2063 if (ArgExpr.isInvalid()) { 2064 SkipUntil(tok::r_paren); 2065 return; 2066 } 2067 2068 T.consumeClose(); 2069 if (endLoc) 2070 *endLoc = T.getCloseLocation(); 2071 2072 // FIXME: Handle pack-expansions here. 2073 if (EllipsisLoc.isValid()) { 2074 Diag(EllipsisLoc, diag::err_alignas_pack_exp_unsupported); 2075 return; 2076 } 2077 2078 ExprVector ArgExprs; 2079 ArgExprs.push_back(ArgExpr.release()); 2080 // FIXME: This should not be GNU, but we since the attribute used is 2081 // based on the spelling, and there is no true spelling for 2082 // C++11 attributes, this isn't accepted. 2083 Attrs.addNew(PP.getIdentifierInfo("aligned"), KWLoc, 0, KWLoc, 2084 0, T.getOpenLocation(), ArgExprs.data(), 1, 2085 AttributeList::AS_GNU); 2086 } 2087 2088 /// ParseDeclarationSpecifiers 2089 /// declaration-specifiers: [C99 6.7] 2090 /// storage-class-specifier declaration-specifiers[opt] 2091 /// type-specifier declaration-specifiers[opt] 2092 /// [C99] function-specifier declaration-specifiers[opt] 2093 /// [C11] alignment-specifier declaration-specifiers[opt] 2094 /// [GNU] attributes declaration-specifiers[opt] 2095 /// [Clang] '__module_private__' declaration-specifiers[opt] 2096 /// 2097 /// storage-class-specifier: [C99 6.7.1] 2098 /// 'typedef' 2099 /// 'extern' 2100 /// 'static' 2101 /// 'auto' 2102 /// 'register' 2103 /// [C++] 'mutable' 2104 /// [GNU] '__thread' 2105 /// function-specifier: [C99 6.7.4] 2106 /// [C99] 'inline' 2107 /// [C++] 'virtual' 2108 /// [C++] 'explicit' 2109 /// [OpenCL] '__kernel' 2110 /// 'friend': [C++ dcl.friend] 2111 /// 'constexpr': [C++0x dcl.constexpr] 2112 2113 /// 2114 void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, 2115 const ParsedTemplateInfo &TemplateInfo, 2116 AccessSpecifier AS, 2117 DeclSpecContext DSContext, 2118 LateParsedAttrList *LateAttrs) { 2119 if (DS.getSourceRange().isInvalid()) { 2120 DS.SetRangeStart(Tok.getLocation()); 2121 DS.SetRangeEnd(Tok.getLocation()); 2122 } 2123 2124 bool EnteringContext = (DSContext == DSC_class || DSContext == DSC_top_level); 2125 bool AttrsLastTime = false; 2126 ParsedAttributesWithRange attrs(AttrFactory); 2127 while (1) { 2128 bool isInvalid = false; 2129 const char *PrevSpec = 0; 2130 unsigned DiagID = 0; 2131 2132 SourceLocation Loc = Tok.getLocation(); 2133 2134 switch (Tok.getKind()) { 2135 default: 2136 DoneWithDeclSpec: 2137 if (!AttrsLastTime) 2138 ProhibitAttributes(attrs); 2139 else 2140 DS.takeAttributesFrom(attrs); 2141 2142 // If this is not a declaration specifier token, we're done reading decl 2143 // specifiers. First verify that DeclSpec's are consistent. 2144 DS.Finish(Diags, PP); 2145 return; 2146 2147 case tok::l_square: 2148 case tok::kw_alignas: 2149 if (!isCXX11AttributeSpecifier()) 2150 goto DoneWithDeclSpec; 2151 2152 ProhibitAttributes(attrs); 2153 // FIXME: It would be good to recover by accepting the attributes, 2154 // but attempting to do that now would cause serious 2155 // madness in terms of diagnostics. 2156 attrs.clear(); 2157 attrs.Range = SourceRange(); 2158 2159 ParseCXX11Attributes(attrs); 2160 AttrsLastTime = true; 2161 continue; 2162 2163 case tok::code_completion: { 2164 Sema::ParserCompletionContext CCC = Sema::PCC_Namespace; 2165 if (DS.hasTypeSpecifier()) { 2166 bool AllowNonIdentifiers 2167 = (getCurScope()->getFlags() & (Scope::ControlScope | 2168 Scope::BlockScope | 2169 Scope::TemplateParamScope | 2170 Scope::FunctionPrototypeScope | 2171 Scope::AtCatchScope)) == 0; 2172 bool AllowNestedNameSpecifiers 2173 = DSContext == DSC_top_level || 2174 (DSContext == DSC_class && DS.isFriendSpecified()); 2175 2176 Actions.CodeCompleteDeclSpec(getCurScope(), DS, 2177 AllowNonIdentifiers, 2178 AllowNestedNameSpecifiers); 2179 return cutOffParsing(); 2180 } 2181 2182 if (getCurScope()->getFnParent() || getCurScope()->getBlockParent()) 2183 CCC = Sema::PCC_LocalDeclarationSpecifiers; 2184 else if (TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate) 2185 CCC = DSContext == DSC_class? Sema::PCC_MemberTemplate 2186 : Sema::PCC_Template; 2187 else if (DSContext == DSC_class) 2188 CCC = Sema::PCC_Class; 2189 else if (CurParsedObjCImpl) 2190 CCC = Sema::PCC_ObjCImplementation; 2191 2192 Actions.CodeCompleteOrdinaryName(getCurScope(), CCC); 2193 return cutOffParsing(); 2194 } 2195 2196 case tok::coloncolon: // ::foo::bar 2197 // C++ scope specifier. Annotate and loop, or bail out on error. 2198 if (TryAnnotateCXXScopeToken(true)) { 2199 if (!DS.hasTypeSpecifier()) 2200 DS.SetTypeSpecError(); 2201 goto DoneWithDeclSpec; 2202 } 2203 if (Tok.is(tok::coloncolon)) // ::new or ::delete 2204 goto DoneWithDeclSpec; 2205 continue; 2206 2207 case tok::annot_cxxscope: { 2208 if (DS.hasTypeSpecifier() || DS.isTypeAltiVecVector()) 2209 goto DoneWithDeclSpec; 2210 2211 CXXScopeSpec SS; 2212 Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(), 2213 Tok.getAnnotationRange(), 2214 SS); 2215 2216 // We are looking for a qualified typename. 2217 Token Next = NextToken(); 2218 if (Next.is(tok::annot_template_id) && 2219 static_cast<TemplateIdAnnotation *>(Next.getAnnotationValue()) 2220 ->Kind == TNK_Type_template) { 2221 // We have a qualified template-id, e.g., N::A<int> 2222 2223 // C++ [class.qual]p2: 2224 // In a lookup in which the constructor is an acceptable lookup 2225 // result and the nested-name-specifier nominates a class C: 2226 // 2227 // - if the name specified after the 2228 // nested-name-specifier, when looked up in C, is the 2229 // injected-class-name of C (Clause 9), or 2230 // 2231 // - if the name specified after the nested-name-specifier 2232 // is the same as the identifier or the 2233 // simple-template-id's template-name in the last 2234 // component of the nested-name-specifier, 2235 // 2236 // the name is instead considered to name the constructor of 2237 // class C. 2238 // 2239 // Thus, if the template-name is actually the constructor 2240 // name, then the code is ill-formed; this interpretation is 2241 // reinforced by the NAD status of core issue 635. 2242 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Next); 2243 if ((DSContext == DSC_top_level || 2244 (DSContext == DSC_class && DS.isFriendSpecified())) && 2245 TemplateId->Name && 2246 Actions.isCurrentClassName(*TemplateId->Name, getCurScope(), &SS)) { 2247 if (isConstructorDeclarator()) { 2248 // The user meant this to be an out-of-line constructor 2249 // definition, but template arguments are not allowed 2250 // there. Just allow this as a constructor; we'll 2251 // complain about it later. 2252 goto DoneWithDeclSpec; 2253 } 2254 2255 // The user meant this to name a type, but it actually names 2256 // a constructor with some extraneous template 2257 // arguments. Complain, then parse it as a type as the user 2258 // intended. 2259 Diag(TemplateId->TemplateNameLoc, 2260 diag::err_out_of_line_template_id_names_constructor) 2261 << TemplateId->Name; 2262 } 2263 2264 DS.getTypeSpecScope() = SS; 2265 ConsumeToken(); // The C++ scope. 2266 assert(Tok.is(tok::annot_template_id) && 2267 "ParseOptionalCXXScopeSpecifier not working"); 2268 AnnotateTemplateIdTokenAsType(); 2269 continue; 2270 } 2271 2272 if (Next.is(tok::annot_typename)) { 2273 DS.getTypeSpecScope() = SS; 2274 ConsumeToken(); // The C++ scope. 2275 if (Tok.getAnnotationValue()) { 2276 ParsedType T = getTypeAnnotation(Tok); 2277 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename, 2278 Tok.getAnnotationEndLoc(), 2279 PrevSpec, DiagID, T); 2280 } 2281 else 2282 DS.SetTypeSpecError(); 2283 DS.SetRangeEnd(Tok.getAnnotationEndLoc()); 2284 ConsumeToken(); // The typename 2285 } 2286 2287 if (Next.isNot(tok::identifier)) 2288 goto DoneWithDeclSpec; 2289 2290 // If we're in a context where the identifier could be a class name, 2291 // check whether this is a constructor declaration. 2292 if ((DSContext == DSC_top_level || 2293 (DSContext == DSC_class && DS.isFriendSpecified())) && 2294 Actions.isCurrentClassName(*Next.getIdentifierInfo(), getCurScope(), 2295 &SS)) { 2296 if (isConstructorDeclarator()) 2297 goto DoneWithDeclSpec; 2298 2299 // As noted in C++ [class.qual]p2 (cited above), when the name 2300 // of the class is qualified in a context where it could name 2301 // a constructor, its a constructor name. However, we've 2302 // looked at the declarator, and the user probably meant this 2303 // to be a type. Complain that it isn't supposed to be treated 2304 // as a type, then proceed to parse it as a type. 2305 Diag(Next.getLocation(), diag::err_out_of_line_type_names_constructor) 2306 << Next.getIdentifierInfo(); 2307 } 2308 2309 ParsedType TypeRep = Actions.getTypeName(*Next.getIdentifierInfo(), 2310 Next.getLocation(), 2311 getCurScope(), &SS, 2312 false, false, ParsedType(), 2313 /*IsCtorOrDtorName=*/false, 2314 /*NonTrivialSourceInfo=*/true); 2315 2316 // If the referenced identifier is not a type, then this declspec is 2317 // erroneous: We already checked about that it has no type specifier, and 2318 // C++ doesn't have implicit int. Diagnose it as a typo w.r.t. to the 2319 // typename. 2320 if (TypeRep == 0) { 2321 ConsumeToken(); // Eat the scope spec so the identifier is current. 2322 if (ParseImplicitInt(DS, &SS, TemplateInfo, AS, DSContext)) continue; 2323 goto DoneWithDeclSpec; 2324 } 2325 2326 DS.getTypeSpecScope() = SS; 2327 ConsumeToken(); // The C++ scope. 2328 2329 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec, 2330 DiagID, TypeRep); 2331 if (isInvalid) 2332 break; 2333 2334 DS.SetRangeEnd(Tok.getLocation()); 2335 ConsumeToken(); // The typename. 2336 2337 continue; 2338 } 2339 2340 case tok::annot_typename: { 2341 if (Tok.getAnnotationValue()) { 2342 ParsedType T = getTypeAnnotation(Tok); 2343 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec, 2344 DiagID, T); 2345 } else 2346 DS.SetTypeSpecError(); 2347 2348 if (isInvalid) 2349 break; 2350 2351 DS.SetRangeEnd(Tok.getAnnotationEndLoc()); 2352 ConsumeToken(); // The typename 2353 2354 // Objective-C supports syntax of the form 'id<proto1,proto2>' where 'id' 2355 // is a specific typedef and 'itf<proto1,proto2>' where 'itf' is an 2356 // Objective-C interface. 2357 if (Tok.is(tok::less) && getLangOpts().ObjC1) 2358 ParseObjCProtocolQualifiers(DS); 2359 2360 continue; 2361 } 2362 2363 case tok::kw___is_signed: 2364 // GNU libstdc++ 4.4 uses __is_signed as an identifier, but Clang 2365 // typically treats it as a trait. If we see __is_signed as it appears 2366 // in libstdc++, e.g., 2367 // 2368 // static const bool __is_signed; 2369 // 2370 // then treat __is_signed as an identifier rather than as a keyword. 2371 if (DS.getTypeSpecType() == TST_bool && 2372 DS.getTypeQualifiers() == DeclSpec::TQ_const && 2373 DS.getStorageClassSpec() == DeclSpec::SCS_static) { 2374 Tok.getIdentifierInfo()->RevertTokenIDToIdentifier(); 2375 Tok.setKind(tok::identifier); 2376 } 2377 2378 // We're done with the declaration-specifiers. 2379 goto DoneWithDeclSpec; 2380 2381 // typedef-name 2382 case tok::kw_decltype: 2383 case tok::identifier: { 2384 // In C++, check to see if this is a scope specifier like foo::bar::, if 2385 // so handle it as such. This is important for ctor parsing. 2386 if (getLangOpts().CPlusPlus) { 2387 if (TryAnnotateCXXScopeToken(true)) { 2388 if (!DS.hasTypeSpecifier()) 2389 DS.SetTypeSpecError(); 2390 goto DoneWithDeclSpec; 2391 } 2392 if (!Tok.is(tok::identifier)) 2393 continue; 2394 } 2395 2396 // This identifier can only be a typedef name if we haven't already seen 2397 // a type-specifier. Without this check we misparse: 2398 // typedef int X; struct Y { short X; }; as 'short int'. 2399 if (DS.hasTypeSpecifier()) 2400 goto DoneWithDeclSpec; 2401 2402 // Check for need to substitute AltiVec keyword tokens. 2403 if (TryAltiVecToken(DS, Loc, PrevSpec, DiagID, isInvalid)) 2404 break; 2405 2406 // [AltiVec] 2.2: [If the 'vector' specifier is used] The syntax does not 2407 // allow the use of a typedef name as a type specifier. 2408 if (DS.isTypeAltiVecVector()) 2409 goto DoneWithDeclSpec; 2410 2411 ParsedType TypeRep = 2412 Actions.getTypeName(*Tok.getIdentifierInfo(), 2413 Tok.getLocation(), getCurScope()); 2414 2415 // If this is not a typedef name, don't parse it as part of the declspec, 2416 // it must be an implicit int or an error. 2417 if (!TypeRep) { 2418 if (ParseImplicitInt(DS, 0, TemplateInfo, AS, DSContext)) continue; 2419 goto DoneWithDeclSpec; 2420 } 2421 2422 // If we're in a context where the identifier could be a class name, 2423 // check whether this is a constructor declaration. 2424 if (getLangOpts().CPlusPlus && DSContext == DSC_class && 2425 Actions.isCurrentClassName(*Tok.getIdentifierInfo(), getCurScope()) && 2426 isConstructorDeclarator()) 2427 goto DoneWithDeclSpec; 2428 2429 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec, 2430 DiagID, TypeRep); 2431 if (isInvalid) 2432 break; 2433 2434 DS.SetRangeEnd(Tok.getLocation()); 2435 ConsumeToken(); // The identifier 2436 2437 // Objective-C supports syntax of the form 'id<proto1,proto2>' where 'id' 2438 // is a specific typedef and 'itf<proto1,proto2>' where 'itf' is an 2439 // Objective-C interface. 2440 if (Tok.is(tok::less) && getLangOpts().ObjC1) 2441 ParseObjCProtocolQualifiers(DS); 2442 2443 // Need to support trailing type qualifiers (e.g. "id<p> const"). 2444 // If a type specifier follows, it will be diagnosed elsewhere. 2445 continue; 2446 } 2447 2448 // type-name 2449 case tok::annot_template_id: { 2450 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); 2451 if (TemplateId->Kind != TNK_Type_template) { 2452 // This template-id does not refer to a type name, so we're 2453 // done with the type-specifiers. 2454 goto DoneWithDeclSpec; 2455 } 2456 2457 // If we're in a context where the template-id could be a 2458 // constructor name or specialization, check whether this is a 2459 // constructor declaration. 2460 if (getLangOpts().CPlusPlus && DSContext == DSC_class && 2461 Actions.isCurrentClassName(*TemplateId->Name, getCurScope()) && 2462 isConstructorDeclarator()) 2463 goto DoneWithDeclSpec; 2464 2465 // Turn the template-id annotation token into a type annotation 2466 // token, then try again to parse it as a type-specifier. 2467 AnnotateTemplateIdTokenAsType(); 2468 continue; 2469 } 2470 2471 // GNU attributes support. 2472 case tok::kw___attribute: 2473 ParseGNUAttributes(DS.getAttributes(), 0, LateAttrs); 2474 continue; 2475 2476 // Microsoft declspec support. 2477 case tok::kw___declspec: 2478 ParseMicrosoftDeclSpec(DS.getAttributes()); 2479 continue; 2480 2481 // Microsoft single token adornments. 2482 case tok::kw___forceinline: { 2483 isInvalid = DS.SetFunctionSpecInline(Loc, PrevSpec, DiagID); 2484 IdentifierInfo *AttrName = Tok.getIdentifierInfo(); 2485 SourceLocation AttrNameLoc = ConsumeToken(); 2486 // FIXME: This does not work correctly if it is set to be a declspec 2487 // attribute, and a GNU attribute is simply incorrect. 2488 DS.getAttributes().addNew(AttrName, AttrNameLoc, 0, AttrNameLoc, 0, 2489 SourceLocation(), 0, 0, AttributeList::AS_GNU); 2490 continue; 2491 } 2492 2493 case tok::kw___ptr64: 2494 case tok::kw___ptr32: 2495 case tok::kw___w64: 2496 case tok::kw___cdecl: 2497 case tok::kw___stdcall: 2498 case tok::kw___fastcall: 2499 case tok::kw___thiscall: 2500 case tok::kw___unaligned: 2501 ParseMicrosoftTypeAttributes(DS.getAttributes()); 2502 continue; 2503 2504 // Borland single token adornments. 2505 case tok::kw___pascal: 2506 ParseBorlandTypeAttributes(DS.getAttributes()); 2507 continue; 2508 2509 // OpenCL single token adornments. 2510 case tok::kw___kernel: 2511 ParseOpenCLAttributes(DS.getAttributes()); 2512 continue; 2513 2514 // storage-class-specifier 2515 case tok::kw_typedef: 2516 isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_typedef, Loc, 2517 PrevSpec, DiagID); 2518 break; 2519 case tok::kw_extern: 2520 if (DS.isThreadSpecified()) 2521 Diag(Tok, diag::ext_thread_before) << "extern"; 2522 isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_extern, Loc, 2523 PrevSpec, DiagID); 2524 break; 2525 case tok::kw___private_extern__: 2526 isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_private_extern, 2527 Loc, PrevSpec, DiagID); 2528 break; 2529 case tok::kw_static: 2530 if (DS.isThreadSpecified()) 2531 Diag(Tok, diag::ext_thread_before) << "static"; 2532 isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_static, Loc, 2533 PrevSpec, DiagID); 2534 break; 2535 case tok::kw_auto: 2536 if (getLangOpts().CPlusPlus0x) { 2537 if (isKnownToBeTypeSpecifier(GetLookAheadToken(1))) { 2538 isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_auto, Loc, 2539 PrevSpec, DiagID); 2540 if (!isInvalid) 2541 Diag(Tok, diag::ext_auto_storage_class) 2542 << FixItHint::CreateRemoval(DS.getStorageClassSpecLoc()); 2543 } else 2544 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_auto, Loc, PrevSpec, 2545 DiagID); 2546 } else 2547 isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_auto, Loc, 2548 PrevSpec, DiagID); 2549 break; 2550 case tok::kw_register: 2551 isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_register, Loc, 2552 PrevSpec, DiagID); 2553 break; 2554 case tok::kw_mutable: 2555 isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_mutable, Loc, 2556 PrevSpec, DiagID); 2557 break; 2558 case tok::kw___thread: 2559 isInvalid = DS.SetStorageClassSpecThread(Loc, PrevSpec, DiagID); 2560 break; 2561 2562 // function-specifier 2563 case tok::kw_inline: 2564 isInvalid = DS.SetFunctionSpecInline(Loc, PrevSpec, DiagID); 2565 break; 2566 case tok::kw_virtual: 2567 isInvalid = DS.SetFunctionSpecVirtual(Loc, PrevSpec, DiagID); 2568 break; 2569 case tok::kw_explicit: 2570 isInvalid = DS.SetFunctionSpecExplicit(Loc, PrevSpec, DiagID); 2571 break; 2572 2573 // alignment-specifier 2574 case tok::kw__Alignas: 2575 if (!getLangOpts().C11) 2576 Diag(Tok, diag::ext_c11_alignment) << Tok.getName(); 2577 ParseAlignmentSpecifier(DS.getAttributes()); 2578 continue; 2579 2580 // friend 2581 case tok::kw_friend: 2582 if (DSContext == DSC_class) 2583 isInvalid = DS.SetFriendSpec(Loc, PrevSpec, DiagID); 2584 else { 2585 PrevSpec = ""; // not actually used by the diagnostic 2586 DiagID = diag::err_friend_invalid_in_context; 2587 isInvalid = true; 2588 } 2589 break; 2590 2591 // Modules 2592 case tok::kw___module_private__: 2593 isInvalid = DS.setModulePrivateSpec(Loc, PrevSpec, DiagID); 2594 break; 2595 2596 // constexpr 2597 case tok::kw_constexpr: 2598 isInvalid = DS.SetConstexprSpec(Loc, PrevSpec, DiagID); 2599 break; 2600 2601 // type-specifier 2602 case tok::kw_short: 2603 isInvalid = DS.SetTypeSpecWidth(DeclSpec::TSW_short, Loc, PrevSpec, 2604 DiagID); 2605 break; 2606 case tok::kw_long: 2607 if (DS.getTypeSpecWidth() != DeclSpec::TSW_long) 2608 isInvalid = DS.SetTypeSpecWidth(DeclSpec::TSW_long, Loc, PrevSpec, 2609 DiagID); 2610 else 2611 isInvalid = DS.SetTypeSpecWidth(DeclSpec::TSW_longlong, Loc, PrevSpec, 2612 DiagID); 2613 break; 2614 case tok::kw___int64: 2615 isInvalid = DS.SetTypeSpecWidth(DeclSpec::TSW_longlong, Loc, PrevSpec, 2616 DiagID); 2617 break; 2618 case tok::kw_signed: 2619 isInvalid = DS.SetTypeSpecSign(DeclSpec::TSS_signed, Loc, PrevSpec, 2620 DiagID); 2621 break; 2622 case tok::kw_unsigned: 2623 isInvalid = DS.SetTypeSpecSign(DeclSpec::TSS_unsigned, Loc, PrevSpec, 2624 DiagID); 2625 break; 2626 case tok::kw__Complex: 2627 isInvalid = DS.SetTypeSpecComplex(DeclSpec::TSC_complex, Loc, PrevSpec, 2628 DiagID); 2629 break; 2630 case tok::kw__Imaginary: 2631 isInvalid = DS.SetTypeSpecComplex(DeclSpec::TSC_imaginary, Loc, PrevSpec, 2632 DiagID); 2633 break; 2634 case tok::kw_void: 2635 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_void, Loc, PrevSpec, 2636 DiagID); 2637 break; 2638 case tok::kw_char: 2639 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_char, Loc, PrevSpec, 2640 DiagID); 2641 break; 2642 case tok::kw_int: 2643 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_int, Loc, PrevSpec, 2644 DiagID); 2645 break; 2646 case tok::kw___int128: 2647 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_int128, Loc, PrevSpec, 2648 DiagID); 2649 break; 2650 case tok::kw_half: 2651 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_half, Loc, PrevSpec, 2652 DiagID); 2653 break; 2654 case tok::kw_float: 2655 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_float, Loc, PrevSpec, 2656 DiagID); 2657 break; 2658 case tok::kw_double: 2659 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_double, Loc, PrevSpec, 2660 DiagID); 2661 break; 2662 case tok::kw_wchar_t: 2663 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_wchar, Loc, PrevSpec, 2664 DiagID); 2665 break; 2666 case tok::kw_char16_t: 2667 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_char16, Loc, PrevSpec, 2668 DiagID); 2669 break; 2670 case tok::kw_char32_t: 2671 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_char32, Loc, PrevSpec, 2672 DiagID); 2673 break; 2674 case tok::kw_bool: 2675 case tok::kw__Bool: 2676 if (Tok.is(tok::kw_bool) && 2677 DS.getTypeSpecType() != DeclSpec::TST_unspecified && 2678 DS.getStorageClassSpec() == DeclSpec::SCS_typedef) { 2679 PrevSpec = ""; // Not used by the diagnostic. 2680 DiagID = diag::err_bool_redeclaration; 2681 // For better error recovery. 2682 Tok.setKind(tok::identifier); 2683 isInvalid = true; 2684 } else { 2685 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_bool, Loc, PrevSpec, 2686 DiagID); 2687 } 2688 break; 2689 case tok::kw__Decimal32: 2690 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_decimal32, Loc, PrevSpec, 2691 DiagID); 2692 break; 2693 case tok::kw__Decimal64: 2694 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_decimal64, Loc, PrevSpec, 2695 DiagID); 2696 break; 2697 case tok::kw__Decimal128: 2698 isInvalid = DS.SetTypeSpecType(DeclSpec::TST_decimal128, Loc, PrevSpec, 2699 DiagID); 2700 break; 2701 case tok::kw___vector: 2702 isInvalid = DS.SetTypeAltiVecVector(true, Loc, PrevSpec, DiagID); 2703 break; 2704 case tok::kw___pixel: 2705 isInvalid = DS.SetTypeAltiVecPixel(true, Loc, PrevSpec, DiagID); 2706 break; 2707 case tok::kw___unknown_anytype: 2708 isInvalid = DS.SetTypeSpecType(TST_unknown_anytype, Loc, 2709 PrevSpec, DiagID); 2710 break; 2711 2712 // class-specifier: 2713 case tok::kw_class: 2714 case tok::kw_struct: 2715 case tok::kw___interface: 2716 case tok::kw_union: { 2717 tok::TokenKind Kind = Tok.getKind(); 2718 ConsumeToken(); 2719 ParseClassSpecifier(Kind, Loc, DS, TemplateInfo, AS, 2720 EnteringContext, DSContext); 2721 continue; 2722 } 2723 2724 // enum-specifier: 2725 case tok::kw_enum: 2726 ConsumeToken(); 2727 ParseEnumSpecifier(Loc, DS, TemplateInfo, AS, DSContext); 2728 continue; 2729 2730 // cv-qualifier: 2731 case tok::kw_const: 2732 isInvalid = DS.SetTypeQual(DeclSpec::TQ_const, Loc, PrevSpec, DiagID, 2733 getLangOpts(), /*IsTypeSpec*/true); 2734 break; 2735 case tok::kw_volatile: 2736 isInvalid = DS.SetTypeQual(DeclSpec::TQ_volatile, Loc, PrevSpec, DiagID, 2737 getLangOpts(), /*IsTypeSpec*/true); 2738 break; 2739 case tok::kw_restrict: 2740 isInvalid = DS.SetTypeQual(DeclSpec::TQ_restrict, Loc, PrevSpec, DiagID, 2741 getLangOpts(), /*IsTypeSpec*/true); 2742 break; 2743 2744 // C++ typename-specifier: 2745 case tok::kw_typename: 2746 if (TryAnnotateTypeOrScopeToken()) { 2747 DS.SetTypeSpecError(); 2748 goto DoneWithDeclSpec; 2749 } 2750 if (!Tok.is(tok::kw_typename)) 2751 continue; 2752 break; 2753 2754 // GNU typeof support. 2755 case tok::kw_typeof: 2756 ParseTypeofSpecifier(DS); 2757 continue; 2758 2759 case tok::annot_decltype: 2760 ParseDecltypeSpecifier(DS); 2761 continue; 2762 2763 case tok::kw___underlying_type: 2764 ParseUnderlyingTypeSpecifier(DS); 2765 continue; 2766 2767 case tok::kw__Atomic: 2768 ParseAtomicSpecifier(DS); 2769 continue; 2770 2771 // OpenCL qualifiers: 2772 case tok::kw_private: 2773 if (!getLangOpts().OpenCL) 2774 goto DoneWithDeclSpec; 2775 case tok::kw___private: 2776 case tok::kw___global: 2777 case tok::kw___local: 2778 case tok::kw___constant: 2779 case tok::kw___read_only: 2780 case tok::kw___write_only: 2781 case tok::kw___read_write: 2782 ParseOpenCLQualifiers(DS); 2783 break; 2784 2785 case tok::less: 2786 // GCC ObjC supports types like "<SomeProtocol>" as a synonym for 2787 // "id<SomeProtocol>". This is hopelessly old fashioned and dangerous, 2788 // but we support it. 2789 if (DS.hasTypeSpecifier() || !getLangOpts().ObjC1) 2790 goto DoneWithDeclSpec; 2791 2792 if (!ParseObjCProtocolQualifiers(DS)) 2793 Diag(Loc, diag::warn_objc_protocol_qualifier_missing_id) 2794 << FixItHint::CreateInsertion(Loc, "id") 2795 << SourceRange(Loc, DS.getSourceRange().getEnd()); 2796 2797 // Need to support trailing type qualifiers (e.g. "id<p> const"). 2798 // If a type specifier follows, it will be diagnosed elsewhere. 2799 continue; 2800 } 2801 // If the specifier wasn't legal, issue a diagnostic. 2802 if (isInvalid) { 2803 assert(PrevSpec && "Method did not return previous specifier!"); 2804 assert(DiagID); 2805 2806 if (DiagID == diag::ext_duplicate_declspec) 2807 Diag(Tok, DiagID) 2808 << PrevSpec << FixItHint::CreateRemoval(Tok.getLocation()); 2809 else 2810 Diag(Tok, DiagID) << PrevSpec; 2811 } 2812 2813 DS.SetRangeEnd(Tok.getLocation()); 2814 if (DiagID != diag::err_bool_redeclaration) 2815 ConsumeToken(); 2816 2817 AttrsLastTime = false; 2818 } 2819 } 2820 2821 /// ParseStructDeclaration - Parse a struct declaration without the terminating 2822 /// semicolon. 2823 /// 2824 /// struct-declaration: 2825 /// specifier-qualifier-list struct-declarator-list 2826 /// [GNU] __extension__ struct-declaration 2827 /// [GNU] specifier-qualifier-list 2828 /// struct-declarator-list: 2829 /// struct-declarator 2830 /// struct-declarator-list ',' struct-declarator 2831 /// [GNU] struct-declarator-list ',' attributes[opt] struct-declarator 2832 /// struct-declarator: 2833 /// declarator 2834 /// [GNU] declarator attributes[opt] 2835 /// declarator[opt] ':' constant-expression 2836 /// [GNU] declarator[opt] ':' constant-expression attributes[opt] 2837 /// 2838 void Parser:: 2839 ParseStructDeclaration(ParsingDeclSpec &DS, FieldCallback &Fields) { 2840 2841 if (Tok.is(tok::kw___extension__)) { 2842 // __extension__ silences extension warnings in the subexpression. 2843 ExtensionRAIIObject O(Diags); // Use RAII to do this. 2844 ConsumeToken(); 2845 return ParseStructDeclaration(DS, Fields); 2846 } 2847 2848 // Parse the common specifier-qualifiers-list piece. 2849 ParseSpecifierQualifierList(DS); 2850 2851 // If there are no declarators, this is a free-standing declaration 2852 // specifier. Let the actions module cope with it. 2853 if (Tok.is(tok::semi)) { 2854 Decl *TheDecl = Actions.ParsedFreeStandingDeclSpec(getCurScope(), AS_none, 2855 DS); 2856 DS.complete(TheDecl); 2857 return; 2858 } 2859 2860 // Read struct-declarators until we find the semicolon. 2861 bool FirstDeclarator = true; 2862 SourceLocation CommaLoc; 2863 while (1) { 2864 ParsingFieldDeclarator DeclaratorInfo(*this, DS); 2865 DeclaratorInfo.D.setCommaLoc(CommaLoc); 2866 2867 // Attributes are only allowed here on successive declarators. 2868 if (!FirstDeclarator) 2869 MaybeParseGNUAttributes(DeclaratorInfo.D); 2870 2871 /// struct-declarator: declarator 2872 /// struct-declarator: declarator[opt] ':' constant-expression 2873 if (Tok.isNot(tok::colon)) { 2874 // Don't parse FOO:BAR as if it were a typo for FOO::BAR. 2875 ColonProtectionRAIIObject X(*this); 2876 ParseDeclarator(DeclaratorInfo.D); 2877 } 2878 2879 if (Tok.is(tok::colon)) { 2880 ConsumeToken(); 2881 ExprResult Res(ParseConstantExpression()); 2882 if (Res.isInvalid()) 2883 SkipUntil(tok::semi, true, true); 2884 else 2885 DeclaratorInfo.BitfieldSize = Res.release(); 2886 } 2887 2888 // If attributes exist after the declarator, parse them. 2889 MaybeParseGNUAttributes(DeclaratorInfo.D); 2890 2891 // We're done with this declarator; invoke the callback. 2892 Fields.invoke(DeclaratorInfo); 2893 2894 // If we don't have a comma, it is either the end of the list (a ';') 2895 // or an error, bail out. 2896 if (Tok.isNot(tok::comma)) 2897 return; 2898 2899 // Consume the comma. 2900 CommaLoc = ConsumeToken(); 2901 2902 FirstDeclarator = false; 2903 } 2904 } 2905 2906 /// ParseStructUnionBody 2907 /// struct-contents: 2908 /// struct-declaration-list 2909 /// [EXT] empty 2910 /// [GNU] "struct-declaration-list" without terminatoring ';' 2911 /// struct-declaration-list: 2912 /// struct-declaration 2913 /// struct-declaration-list struct-declaration 2914 /// [OBC] '@' 'defs' '(' class-name ')' 2915 /// 2916 void Parser::ParseStructUnionBody(SourceLocation RecordLoc, 2917 unsigned TagType, Decl *TagDecl) { 2918 PrettyDeclStackTraceEntry CrashInfo(Actions, TagDecl, RecordLoc, 2919 "parsing struct/union body"); 2920 2921 BalancedDelimiterTracker T(*this, tok::l_brace); 2922 if (T.consumeOpen()) 2923 return; 2924 2925 ParseScope StructScope(this, Scope::ClassScope|Scope::DeclScope); 2926 Actions.ActOnTagStartDefinition(getCurScope(), TagDecl); 2927 2928 // Empty structs are an extension in C (C99 6.7.2.1p7), but are allowed in 2929 // C++. 2930 if (Tok.is(tok::r_brace) && !getLangOpts().CPlusPlus) { 2931 Diag(Tok, diag::ext_empty_struct_union) << (TagType == TST_union); 2932 Diag(Tok, diag::warn_empty_struct_union_compat) << (TagType == TST_union); 2933 } 2934 2935 SmallVector<Decl *, 32> FieldDecls; 2936 2937 // While we still have something to read, read the declarations in the struct. 2938 while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) { 2939 // Each iteration of this loop reads one struct-declaration. 2940 2941 // Check for extraneous top-level semicolon. 2942 if (Tok.is(tok::semi)) { 2943 ConsumeExtraSemi(InsideStruct, TagType); 2944 continue; 2945 } 2946 2947 if (!Tok.is(tok::at)) { 2948 struct CFieldCallback : FieldCallback { 2949 Parser &P; 2950 Decl *TagDecl; 2951 SmallVectorImpl<Decl *> &FieldDecls; 2952 2953 CFieldCallback(Parser &P, Decl *TagDecl, 2954 SmallVectorImpl<Decl *> &FieldDecls) : 2955 P(P), TagDecl(TagDecl), FieldDecls(FieldDecls) {} 2956 2957 void invoke(ParsingFieldDeclarator &FD) { 2958 // Install the declarator into the current TagDecl. 2959 Decl *Field = P.Actions.ActOnField(P.getCurScope(), TagDecl, 2960 FD.D.getDeclSpec().getSourceRange().getBegin(), 2961 FD.D, FD.BitfieldSize); 2962 FieldDecls.push_back(Field); 2963 FD.complete(Field); 2964 } 2965 } Callback(*this, TagDecl, FieldDecls); 2966 2967 // Parse all the comma separated declarators. 2968 ParsingDeclSpec DS(*this); 2969 ParseStructDeclaration(DS, Callback); 2970 } else { // Handle @defs 2971 ConsumeToken(); 2972 if (!Tok.isObjCAtKeyword(tok::objc_defs)) { 2973 Diag(Tok, diag::err_unexpected_at); 2974 SkipUntil(tok::semi, true); 2975 continue; 2976 } 2977 ConsumeToken(); 2978 ExpectAndConsume(tok::l_paren, diag::err_expected_lparen); 2979 if (!Tok.is(tok::identifier)) { 2980 Diag(Tok, diag::err_expected_ident); 2981 SkipUntil(tok::semi, true); 2982 continue; 2983 } 2984 SmallVector<Decl *, 16> Fields; 2985 Actions.ActOnDefs(getCurScope(), TagDecl, Tok.getLocation(), 2986 Tok.getIdentifierInfo(), Fields); 2987 FieldDecls.insert(FieldDecls.end(), Fields.begin(), Fields.end()); 2988 ConsumeToken(); 2989 ExpectAndConsume(tok::r_paren, diag::err_expected_rparen); 2990 } 2991 2992 if (Tok.is(tok::semi)) { 2993 ConsumeToken(); 2994 } else if (Tok.is(tok::r_brace)) { 2995 ExpectAndConsume(tok::semi, diag::ext_expected_semi_decl_list); 2996 break; 2997 } else { 2998 ExpectAndConsume(tok::semi, diag::err_expected_semi_decl_list); 2999 // Skip to end of block or statement to avoid ext-warning on extra ';'. 3000 SkipUntil(tok::r_brace, true, true); 3001 // If we stopped at a ';', eat it. 3002 if (Tok.is(tok::semi)) ConsumeToken(); 3003 } 3004 } 3005 3006 T.consumeClose(); 3007 3008 ParsedAttributes attrs(AttrFactory); 3009 // If attributes exist after struct contents, parse them. 3010 MaybeParseGNUAttributes(attrs); 3011 3012 Actions.ActOnFields(getCurScope(), 3013 RecordLoc, TagDecl, FieldDecls, 3014 T.getOpenLocation(), T.getCloseLocation(), 3015 attrs.getList()); 3016 StructScope.Exit(); 3017 Actions.ActOnTagFinishDefinition(getCurScope(), TagDecl, 3018 T.getCloseLocation()); 3019 } 3020 3021 /// ParseEnumSpecifier 3022 /// enum-specifier: [C99 6.7.2.2] 3023 /// 'enum' identifier[opt] '{' enumerator-list '}' 3024 ///[C99/C++]'enum' identifier[opt] '{' enumerator-list ',' '}' 3025 /// [GNU] 'enum' attributes[opt] identifier[opt] '{' enumerator-list ',' [opt] 3026 /// '}' attributes[opt] 3027 /// [MS] 'enum' __declspec[opt] identifier[opt] '{' enumerator-list ',' [opt] 3028 /// '}' 3029 /// 'enum' identifier 3030 /// [GNU] 'enum' attributes[opt] identifier 3031 /// 3032 /// [C++11] enum-head '{' enumerator-list[opt] '}' 3033 /// [C++11] enum-head '{' enumerator-list ',' '}' 3034 /// 3035 /// enum-head: [C++11] 3036 /// enum-key attribute-specifier-seq[opt] identifier[opt] enum-base[opt] 3037 /// enum-key attribute-specifier-seq[opt] nested-name-specifier 3038 /// identifier enum-base[opt] 3039 /// 3040 /// enum-key: [C++11] 3041 /// 'enum' 3042 /// 'enum' 'class' 3043 /// 'enum' 'struct' 3044 /// 3045 /// enum-base: [C++11] 3046 /// ':' type-specifier-seq 3047 /// 3048 /// [C++] elaborated-type-specifier: 3049 /// [C++] 'enum' '::'[opt] nested-name-specifier[opt] identifier 3050 /// 3051 void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS, 3052 const ParsedTemplateInfo &TemplateInfo, 3053 AccessSpecifier AS, DeclSpecContext DSC) { 3054 // Parse the tag portion of this. 3055 if (Tok.is(tok::code_completion)) { 3056 // Code completion for an enum name. 3057 Actions.CodeCompleteTag(getCurScope(), DeclSpec::TST_enum); 3058 return cutOffParsing(); 3059 } 3060 3061 // If attributes exist after tag, parse them. 3062 ParsedAttributesWithRange attrs(AttrFactory); 3063 MaybeParseGNUAttributes(attrs); 3064 MaybeParseCXX0XAttributes(attrs); 3065 3066 // If declspecs exist after tag, parse them. 3067 while (Tok.is(tok::kw___declspec)) 3068 ParseMicrosoftDeclSpec(attrs); 3069 3070 SourceLocation ScopedEnumKWLoc; 3071 bool IsScopedUsingClassTag = false; 3072 3073 // In C++11, recognize 'enum class' and 'enum struct'. 3074 if (getLangOpts().CPlusPlus0x && 3075 (Tok.is(tok::kw_class) || Tok.is(tok::kw_struct))) { 3076 Diag(Tok, diag::warn_cxx98_compat_scoped_enum); 3077 IsScopedUsingClassTag = Tok.is(tok::kw_class); 3078 ScopedEnumKWLoc = ConsumeToken(); 3079 3080 // Attributes are not allowed between these keywords. Diagnose, 3081 // but then just treat them like they appeared in the right place. 3082 ProhibitAttributes(attrs); 3083 3084 // They are allowed afterwards, though. 3085 MaybeParseGNUAttributes(attrs); 3086 MaybeParseCXX0XAttributes(attrs); 3087 while (Tok.is(tok::kw___declspec)) 3088 ParseMicrosoftDeclSpec(attrs); 3089 } 3090 3091 // C++11 [temp.explicit]p12: 3092 // The usual access controls do not apply to names used to specify 3093 // explicit instantiations. 3094 // We extend this to also cover explicit specializations. Note that 3095 // we don't suppress if this turns out to be an elaborated type 3096 // specifier. 3097 bool shouldDelayDiagsInTag = 3098 (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation || 3099 TemplateInfo.Kind == ParsedTemplateInfo::ExplicitSpecialization); 3100 SuppressAccessChecks diagsFromTag(*this, shouldDelayDiagsInTag); 3101 3102 // Enum definitions should not be parsed in a trailing-return-type. 3103 bool AllowDeclaration = DSC != DSC_trailing; 3104 3105 bool AllowFixedUnderlyingType = AllowDeclaration && 3106 (getLangOpts().CPlusPlus0x || getLangOpts().MicrosoftExt || 3107 getLangOpts().ObjC2); 3108 3109 CXXScopeSpec &SS = DS.getTypeSpecScope(); 3110 if (getLangOpts().CPlusPlus) { 3111 // "enum foo : bar;" is not a potential typo for "enum foo::bar;" 3112 // if a fixed underlying type is allowed. 3113 ColonProtectionRAIIObject X(*this, AllowFixedUnderlyingType); 3114 3115 if (ParseOptionalCXXScopeSpecifier(SS, ParsedType(), 3116 /*EnteringContext=*/false)) 3117 return; 3118 3119 if (SS.isSet() && Tok.isNot(tok::identifier)) { 3120 Diag(Tok, diag::err_expected_ident); 3121 if (Tok.isNot(tok::l_brace)) { 3122 // Has no name and is not a definition. 3123 // Skip the rest of this declarator, up until the comma or semicolon. 3124 SkipUntil(tok::comma, true); 3125 return; 3126 } 3127 } 3128 } 3129 3130 // Must have either 'enum name' or 'enum {...}'. 3131 if (Tok.isNot(tok::identifier) && Tok.isNot(tok::l_brace) && 3132 !(AllowFixedUnderlyingType && Tok.is(tok::colon))) { 3133 Diag(Tok, diag::err_expected_ident_lbrace); 3134 3135 // Skip the rest of this declarator, up until the comma or semicolon. 3136 SkipUntil(tok::comma, true); 3137 return; 3138 } 3139 3140 // If an identifier is present, consume and remember it. 3141 IdentifierInfo *Name = 0; 3142 SourceLocation NameLoc; 3143 if (Tok.is(tok::identifier)) { 3144 Name = Tok.getIdentifierInfo(); 3145 NameLoc = ConsumeToken(); 3146 } 3147 3148 if (!Name && ScopedEnumKWLoc.isValid()) { 3149 // C++0x 7.2p2: The optional identifier shall not be omitted in the 3150 // declaration of a scoped enumeration. 3151 Diag(Tok, diag::err_scoped_enum_missing_identifier); 3152 ScopedEnumKWLoc = SourceLocation(); 3153 IsScopedUsingClassTag = false; 3154 } 3155 3156 // Okay, end the suppression area. We'll decide whether to emit the 3157 // diagnostics in a second. 3158 if (shouldDelayDiagsInTag) 3159 diagsFromTag.done(); 3160 3161 TypeResult BaseType; 3162 3163 // Parse the fixed underlying type. 3164 bool CanBeBitfield = getCurScope()->getFlags() & Scope::ClassScope; 3165 if (AllowFixedUnderlyingType && Tok.is(tok::colon)) { 3166 bool PossibleBitfield = false; 3167 if (CanBeBitfield) { 3168 // If we're in class scope, this can either be an enum declaration with 3169 // an underlying type, or a declaration of a bitfield member. We try to 3170 // use a simple disambiguation scheme first to catch the common cases 3171 // (integer literal, sizeof); if it's still ambiguous, we then consider 3172 // anything that's a simple-type-specifier followed by '(' as an 3173 // expression. This suffices because function types are not valid 3174 // underlying types anyway. 3175 EnterExpressionEvaluationContext Unevaluated(Actions, 3176 Sema::ConstantEvaluated); 3177 TPResult TPR = isExpressionOrTypeSpecifierSimple(NextToken().getKind()); 3178 // If the next token starts an expression, we know we're parsing a 3179 // bit-field. This is the common case. 3180 if (TPR == TPResult::True()) 3181 PossibleBitfield = true; 3182 // If the next token starts a type-specifier-seq, it may be either a 3183 // a fixed underlying type or the start of a function-style cast in C++; 3184 // lookahead one more token to see if it's obvious that we have a 3185 // fixed underlying type. 3186 else if (TPR == TPResult::False() && 3187 GetLookAheadToken(2).getKind() == tok::semi) { 3188 // Consume the ':'. 3189 ConsumeToken(); 3190 } else { 3191 // We have the start of a type-specifier-seq, so we have to perform 3192 // tentative parsing to determine whether we have an expression or a 3193 // type. 3194 TentativeParsingAction TPA(*this); 3195 3196 // Consume the ':'. 3197 ConsumeToken(); 3198 3199 // If we see a type specifier followed by an open-brace, we have an 3200 // ambiguity between an underlying type and a C++11 braced 3201 // function-style cast. Resolve this by always treating it as an 3202 // underlying type. 3203 // FIXME: The standard is not entirely clear on how to disambiguate in 3204 // this case. 3205 if ((getLangOpts().CPlusPlus && 3206 isCXXDeclarationSpecifier(TPResult::True()) != TPResult::True()) || 3207 (!getLangOpts().CPlusPlus && !isDeclarationSpecifier(true))) { 3208 // We'll parse this as a bitfield later. 3209 PossibleBitfield = true; 3210 TPA.Revert(); 3211 } else { 3212 // We have a type-specifier-seq. 3213 TPA.Commit(); 3214 } 3215 } 3216 } else { 3217 // Consume the ':'. 3218 ConsumeToken(); 3219 } 3220 3221 if (!PossibleBitfield) { 3222 SourceRange Range; 3223 BaseType = ParseTypeName(&Range); 3224 3225 if (!getLangOpts().CPlusPlus0x && !getLangOpts().ObjC2) 3226 Diag(StartLoc, diag::ext_ms_enum_fixed_underlying_type) 3227 << Range; 3228 if (getLangOpts().CPlusPlus0x) 3229 Diag(StartLoc, diag::warn_cxx98_compat_enum_fixed_underlying_type); 3230 } 3231 } 3232 3233 // There are four options here. If we have 'friend enum foo;' then this is a 3234 // friend declaration, and cannot have an accompanying definition. If we have 3235 // 'enum foo;', then this is a forward declaration. If we have 3236 // 'enum foo {...' then this is a definition. Otherwise we have something 3237 // like 'enum foo xyz', a reference. 3238 // 3239 // This is needed to handle stuff like this right (C99 6.7.2.3p11): 3240 // enum foo {..}; void bar() { enum foo; } <- new foo in bar. 3241 // enum foo {..}; void bar() { enum foo x; } <- use of old foo. 3242 // 3243 Sema::TagUseKind TUK; 3244 if (!AllowDeclaration) { 3245 TUK = Sema::TUK_Reference; 3246 } else if (Tok.is(tok::l_brace)) { 3247 if (DS.isFriendSpecified()) { 3248 Diag(Tok.getLocation(), diag::err_friend_decl_defines_type) 3249 << SourceRange(DS.getFriendSpecLoc()); 3250 ConsumeBrace(); 3251 SkipUntil(tok::r_brace); 3252 TUK = Sema::TUK_Friend; 3253 } else { 3254 TUK = Sema::TUK_Definition; 3255 } 3256 } else if (DSC != DSC_type_specifier && 3257 (Tok.is(tok::semi) || 3258 (Tok.isAtStartOfLine() && 3259 !isValidAfterTypeSpecifier(CanBeBitfield)))) { 3260 TUK = DS.isFriendSpecified() ? Sema::TUK_Friend : Sema::TUK_Declaration; 3261 if (Tok.isNot(tok::semi)) { 3262 // A semicolon was missing after this declaration. Diagnose and recover. 3263 ExpectAndConsume(tok::semi, diag::err_expected_semi_after_tagdecl, 3264 "enum"); 3265 PP.EnterToken(Tok); 3266 Tok.setKind(tok::semi); 3267 } 3268 } else { 3269 TUK = Sema::TUK_Reference; 3270 } 3271 3272 // If this is an elaborated type specifier, and we delayed 3273 // diagnostics before, just merge them into the current pool. 3274 if (TUK == Sema::TUK_Reference && shouldDelayDiagsInTag) { 3275 diagsFromTag.redelay(); 3276 } 3277 3278 MultiTemplateParamsArg TParams; 3279 if (TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate && 3280 TUK != Sema::TUK_Reference) { 3281 if (!getLangOpts().CPlusPlus0x || !SS.isSet()) { 3282 // Skip the rest of this declarator, up until the comma or semicolon. 3283 Diag(Tok, diag::err_enum_template); 3284 SkipUntil(tok::comma, true); 3285 return; 3286 } 3287 3288 if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) { 3289 // Enumerations can't be explicitly instantiated. 3290 DS.SetTypeSpecError(); 3291 Diag(StartLoc, diag::err_explicit_instantiation_enum); 3292 return; 3293 } 3294 3295 assert(TemplateInfo.TemplateParams && "no template parameters"); 3296 TParams = MultiTemplateParamsArg(TemplateInfo.TemplateParams->data(), 3297 TemplateInfo.TemplateParams->size()); 3298 } 3299 3300 if (TUK == Sema::TUK_Reference) 3301 ProhibitAttributes(attrs); 3302 3303 if (!Name && TUK != Sema::TUK_Definition) { 3304 Diag(Tok, diag::err_enumerator_unnamed_no_def); 3305 3306 // Skip the rest of this declarator, up until the comma or semicolon. 3307 SkipUntil(tok::comma, true); 3308 return; 3309 } 3310 3311 bool Owned = false; 3312 bool IsDependent = false; 3313 const char *PrevSpec = 0; 3314 unsigned DiagID; 3315 Decl *TagDecl = Actions.ActOnTag(getCurScope(), DeclSpec::TST_enum, TUK, 3316 StartLoc, SS, Name, NameLoc, attrs.getList(), 3317 AS, DS.getModulePrivateSpecLoc(), TParams, 3318 Owned, IsDependent, ScopedEnumKWLoc, 3319 IsScopedUsingClassTag, BaseType); 3320 3321 if (IsDependent) { 3322 // This enum has a dependent nested-name-specifier. Handle it as a 3323 // dependent tag. 3324 if (!Name) { 3325 DS.SetTypeSpecError(); 3326 Diag(Tok, diag::err_expected_type_name_after_typename); 3327 return; 3328 } 3329 3330 TypeResult Type = Actions.ActOnDependentTag(getCurScope(), DeclSpec::TST_enum, 3331 TUK, SS, Name, StartLoc, 3332 NameLoc); 3333 if (Type.isInvalid()) { 3334 DS.SetTypeSpecError(); 3335 return; 3336 } 3337 3338 if (DS.SetTypeSpecType(DeclSpec::TST_typename, StartLoc, 3339 NameLoc.isValid() ? NameLoc : StartLoc, 3340 PrevSpec, DiagID, Type.get())) 3341 Diag(StartLoc, DiagID) << PrevSpec; 3342 3343 return; 3344 } 3345 3346 if (!TagDecl) { 3347 // The action failed to produce an enumeration tag. If this is a 3348 // definition, consume the entire definition. 3349 if (Tok.is(tok::l_brace) && TUK != Sema::TUK_Reference) { 3350 ConsumeBrace(); 3351 SkipUntil(tok::r_brace); 3352 } 3353 3354 DS.SetTypeSpecError(); 3355 return; 3356 } 3357 3358 if (Tok.is(tok::l_brace) && TUK != Sema::TUK_Reference) 3359 ParseEnumBody(StartLoc, TagDecl); 3360 3361 if (DS.SetTypeSpecType(DeclSpec::TST_enum, StartLoc, 3362 NameLoc.isValid() ? NameLoc : StartLoc, 3363 PrevSpec, DiagID, TagDecl, Owned)) 3364 Diag(StartLoc, DiagID) << PrevSpec; 3365 } 3366 3367 /// ParseEnumBody - Parse a {} enclosed enumerator-list. 3368 /// enumerator-list: 3369 /// enumerator 3370 /// enumerator-list ',' enumerator 3371 /// enumerator: 3372 /// enumeration-constant 3373 /// enumeration-constant '=' constant-expression 3374 /// enumeration-constant: 3375 /// identifier 3376 /// 3377 void Parser::ParseEnumBody(SourceLocation StartLoc, Decl *EnumDecl) { 3378 // Enter the scope of the enum body and start the definition. 3379 ParseScope EnumScope(this, Scope::DeclScope); 3380 Actions.ActOnTagStartDefinition(getCurScope(), EnumDecl); 3381 3382 BalancedDelimiterTracker T(*this, tok::l_brace); 3383 T.consumeOpen(); 3384 3385 // C does not allow an empty enumerator-list, C++ does [dcl.enum]. 3386 if (Tok.is(tok::r_brace) && !getLangOpts().CPlusPlus) 3387 Diag(Tok, diag::error_empty_enum); 3388 3389 SmallVector<Decl *, 32> EnumConstantDecls; 3390 3391 Decl *LastEnumConstDecl = 0; 3392 3393 // Parse the enumerator-list. 3394 while (Tok.is(tok::identifier)) { 3395 IdentifierInfo *Ident = Tok.getIdentifierInfo(); 3396 SourceLocation IdentLoc = ConsumeToken(); 3397 3398 // If attributes exist after the enumerator, parse them. 3399 ParsedAttributesWithRange attrs(AttrFactory); 3400 MaybeParseGNUAttributes(attrs); 3401 MaybeParseCXX0XAttributes(attrs); 3402 ProhibitAttributes(attrs); 3403 3404 SourceLocation EqualLoc; 3405 ExprResult AssignedVal; 3406 ParsingDeclRAIIObject PD(*this, ParsingDeclRAIIObject::NoParent); 3407 3408 if (Tok.is(tok::equal)) { 3409 EqualLoc = ConsumeToken(); 3410 AssignedVal = ParseConstantExpression(); 3411 if (AssignedVal.isInvalid()) 3412 SkipUntil(tok::comma, tok::r_brace, true, true); 3413 } 3414 3415 // Install the enumerator constant into EnumDecl. 3416 Decl *EnumConstDecl = Actions.ActOnEnumConstant(getCurScope(), EnumDecl, 3417 LastEnumConstDecl, 3418 IdentLoc, Ident, 3419 attrs.getList(), EqualLoc, 3420 AssignedVal.release()); 3421 PD.complete(EnumConstDecl); 3422 3423 EnumConstantDecls.push_back(EnumConstDecl); 3424 LastEnumConstDecl = EnumConstDecl; 3425 3426 if (Tok.is(tok::identifier)) { 3427 // We're missing a comma between enumerators. 3428 SourceLocation Loc = PP.getLocForEndOfToken(PrevTokLocation); 3429 Diag(Loc, diag::err_enumerator_list_missing_comma) 3430 << FixItHint::CreateInsertion(Loc, ", "); 3431 continue; 3432 } 3433 3434 if (Tok.isNot(tok::comma)) 3435 break; 3436 SourceLocation CommaLoc = ConsumeToken(); 3437 3438 if (Tok.isNot(tok::identifier)) { 3439 if (!getLangOpts().C99 && !getLangOpts().CPlusPlus0x) 3440 Diag(CommaLoc, getLangOpts().CPlusPlus ? 3441 diag::ext_enumerator_list_comma_cxx : 3442 diag::ext_enumerator_list_comma_c) 3443 << FixItHint::CreateRemoval(CommaLoc); 3444 else if (getLangOpts().CPlusPlus0x) 3445 Diag(CommaLoc, diag::warn_cxx98_compat_enumerator_list_comma) 3446 << FixItHint::CreateRemoval(CommaLoc); 3447 } 3448 } 3449 3450 // Eat the }. 3451 T.consumeClose(); 3452 3453 // If attributes exist after the identifier list, parse them. 3454 ParsedAttributes attrs(AttrFactory); 3455 MaybeParseGNUAttributes(attrs); 3456 3457 Actions.ActOnEnumBody(StartLoc, T.getOpenLocation(), T.getCloseLocation(), 3458 EnumDecl, EnumConstantDecls.data(), 3459 EnumConstantDecls.size(), getCurScope(), 3460 attrs.getList()); 3461 3462 EnumScope.Exit(); 3463 Actions.ActOnTagFinishDefinition(getCurScope(), EnumDecl, 3464 T.getCloseLocation()); 3465 3466 // The next token must be valid after an enum definition. If not, a ';' 3467 // was probably forgotten. 3468 bool CanBeBitfield = getCurScope()->getFlags() & Scope::ClassScope; 3469 if (!isValidAfterTypeSpecifier(CanBeBitfield)) { 3470 ExpectAndConsume(tok::semi, diag::err_expected_semi_after_tagdecl, "enum"); 3471 // Push this token back into the preprocessor and change our current token 3472 // to ';' so that the rest of the code recovers as though there were an 3473 // ';' after the definition. 3474 PP.EnterToken(Tok); 3475 Tok.setKind(tok::semi); 3476 } 3477 } 3478 3479 /// isTypeSpecifierQualifier - Return true if the current token could be the 3480 /// start of a type-qualifier-list. 3481 bool Parser::isTypeQualifier() const { 3482 switch (Tok.getKind()) { 3483 default: return false; 3484 3485 // type-qualifier only in OpenCL 3486 case tok::kw_private: 3487 return getLangOpts().OpenCL; 3488 3489 // type-qualifier 3490 case tok::kw_const: 3491 case tok::kw_volatile: 3492 case tok::kw_restrict: 3493 case tok::kw___private: 3494 case tok::kw___local: 3495 case tok::kw___global: 3496 case tok::kw___constant: 3497 case tok::kw___read_only: 3498 case tok::kw___read_write: 3499 case tok::kw___write_only: 3500 return true; 3501 } 3502 } 3503 3504 /// isKnownToBeTypeSpecifier - Return true if we know that the specified token 3505 /// is definitely a type-specifier. Return false if it isn't part of a type 3506 /// specifier or if we're not sure. 3507 bool Parser::isKnownToBeTypeSpecifier(const Token &Tok) const { 3508 switch (Tok.getKind()) { 3509 default: return false; 3510 // type-specifiers 3511 case tok::kw_short: 3512 case tok::kw_long: 3513 case tok::kw___int64: 3514 case tok::kw___int128: 3515 case tok::kw_signed: 3516 case tok::kw_unsigned: 3517 case tok::kw__Complex: 3518 case tok::kw__Imaginary: 3519 case tok::kw_void: 3520 case tok::kw_char: 3521 case tok::kw_wchar_t: 3522 case tok::kw_char16_t: 3523 case tok::kw_char32_t: 3524 case tok::kw_int: 3525 case tok::kw_half: 3526 case tok::kw_float: 3527 case tok::kw_double: 3528 case tok::kw_bool: 3529 case tok::kw__Bool: 3530 case tok::kw__Decimal32: 3531 case tok::kw__Decimal64: 3532 case tok::kw__Decimal128: 3533 case tok::kw___vector: 3534 3535 // struct-or-union-specifier (C99) or class-specifier (C++) 3536 case tok::kw_class: 3537 case tok::kw_struct: 3538 case tok::kw___interface: 3539 case tok::kw_union: 3540 // enum-specifier 3541 case tok::kw_enum: 3542 3543 // typedef-name 3544 case tok::annot_typename: 3545 return true; 3546 } 3547 } 3548 3549 /// isTypeSpecifierQualifier - Return true if the current token could be the 3550 /// start of a specifier-qualifier-list. 3551 bool Parser::isTypeSpecifierQualifier() { 3552 switch (Tok.getKind()) { 3553 default: return false; 3554 3555 case tok::identifier: // foo::bar 3556 if (TryAltiVecVectorToken()) 3557 return true; 3558 // Fall through. 3559 case tok::kw_typename: // typename T::type 3560 // Annotate typenames and C++ scope specifiers. If we get one, just 3561 // recurse to handle whatever we get. 3562 if (TryAnnotateTypeOrScopeToken()) 3563 return true; 3564 if (Tok.is(tok::identifier)) 3565 return false; 3566 return isTypeSpecifierQualifier(); 3567 3568 case tok::coloncolon: // ::foo::bar 3569 if (NextToken().is(tok::kw_new) || // ::new 3570 NextToken().is(tok::kw_delete)) // ::delete 3571 return false; 3572 3573 if (TryAnnotateTypeOrScopeToken()) 3574 return true; 3575 return isTypeSpecifierQualifier(); 3576 3577 // GNU attributes support. 3578 case tok::kw___attribute: 3579 // GNU typeof support. 3580 case tok::kw_typeof: 3581 3582 // type-specifiers 3583 case tok::kw_short: 3584 case tok::kw_long: 3585 case tok::kw___int64: 3586 case tok::kw___int128: 3587 case tok::kw_signed: 3588 case tok::kw_unsigned: 3589 case tok::kw__Complex: 3590 case tok::kw__Imaginary: 3591 case tok::kw_void: 3592 case tok::kw_char: 3593 case tok::kw_wchar_t: 3594 case tok::kw_char16_t: 3595 case tok::kw_char32_t: 3596 case tok::kw_int: 3597 case tok::kw_half: 3598 case tok::kw_float: 3599 case tok::kw_double: 3600 case tok::kw_bool: 3601 case tok::kw__Bool: 3602 case tok::kw__Decimal32: 3603 case tok::kw__Decimal64: 3604 case tok::kw__Decimal128: 3605 case tok::kw___vector: 3606 3607 // struct-or-union-specifier (C99) or class-specifier (C++) 3608 case tok::kw_class: 3609 case tok::kw_struct: 3610 case tok::kw___interface: 3611 case tok::kw_union: 3612 // enum-specifier 3613 case tok::kw_enum: 3614 3615 // type-qualifier 3616 case tok::kw_const: 3617 case tok::kw_volatile: 3618 case tok::kw_restrict: 3619 3620 // typedef-name 3621 case tok::annot_typename: 3622 return true; 3623 3624 // GNU ObjC bizarre protocol extension: <proto1,proto2> with implicit 'id'. 3625 case tok::less: 3626 return getLangOpts().ObjC1; 3627 3628 case tok::kw___cdecl: 3629 case tok::kw___stdcall: 3630 case tok::kw___fastcall: 3631 case tok::kw___thiscall: 3632 case tok::kw___w64: 3633 case tok::kw___ptr64: 3634 case tok::kw___ptr32: 3635 case tok::kw___pascal: 3636 case tok::kw___unaligned: 3637 3638 case tok::kw___private: 3639 case tok::kw___local: 3640 case tok::kw___global: 3641 case tok::kw___constant: 3642 case tok::kw___read_only: 3643 case tok::kw___read_write: 3644 case tok::kw___write_only: 3645 3646 return true; 3647 3648 case tok::kw_private: 3649 return getLangOpts().OpenCL; 3650 3651 // C11 _Atomic() 3652 case tok::kw__Atomic: 3653 return true; 3654 } 3655 } 3656 3657 /// isDeclarationSpecifier() - Return true if the current token is part of a 3658 /// declaration specifier. 3659 /// 3660 /// \param DisambiguatingWithExpression True to indicate that the purpose of 3661 /// this check is to disambiguate between an expression and a declaration. 3662 bool Parser::isDeclarationSpecifier(bool DisambiguatingWithExpression) { 3663 switch (Tok.getKind()) { 3664 default: return false; 3665 3666 case tok::kw_private: 3667 return getLangOpts().OpenCL; 3668 3669 case tok::identifier: // foo::bar 3670 // Unfortunate hack to support "Class.factoryMethod" notation. 3671 if (getLangOpts().ObjC1 && NextToken().is(tok::period)) 3672 return false; 3673 if (TryAltiVecVectorToken()) 3674 return true; 3675 // Fall through. 3676 case tok::kw_decltype: // decltype(T())::type 3677 case tok::kw_typename: // typename T::type 3678 // Annotate typenames and C++ scope specifiers. If we get one, just 3679 // recurse to handle whatever we get. 3680 if (TryAnnotateTypeOrScopeToken()) 3681 return true; 3682 if (Tok.is(tok::identifier)) 3683 return false; 3684 3685 // If we're in Objective-C and we have an Objective-C class type followed 3686 // by an identifier and then either ':' or ']', in a place where an 3687 // expression is permitted, then this is probably a class message send 3688 // missing the initial '['. In this case, we won't consider this to be 3689 // the start of a declaration. 3690 if (DisambiguatingWithExpression && 3691 isStartOfObjCClassMessageMissingOpenBracket()) 3692 return false; 3693 3694 return isDeclarationSpecifier(); 3695 3696 case tok::coloncolon: // ::foo::bar 3697 if (NextToken().is(tok::kw_new) || // ::new 3698 NextToken().is(tok::kw_delete)) // ::delete 3699 return false; 3700 3701 // Annotate typenames and C++ scope specifiers. If we get one, just 3702 // recurse to handle whatever we get. 3703 if (TryAnnotateTypeOrScopeToken()) 3704 return true; 3705 return isDeclarationSpecifier(); 3706 3707 // storage-class-specifier 3708 case tok::kw_typedef: 3709 case tok::kw_extern: 3710 case tok::kw___private_extern__: 3711 case tok::kw_static: 3712 case tok::kw_auto: 3713 case tok::kw_register: 3714 case tok::kw___thread: 3715 3716 // Modules 3717 case tok::kw___module_private__: 3718 3719 // type-specifiers 3720 case tok::kw_short: 3721 case tok::kw_long: 3722 case tok::kw___int64: 3723 case tok::kw___int128: 3724 case tok::kw_signed: 3725 case tok::kw_unsigned: 3726 case tok::kw__Complex: 3727 case tok::kw__Imaginary: 3728 case tok::kw_void: 3729 case tok::kw_char: 3730 case tok::kw_wchar_t: 3731 case tok::kw_char16_t: 3732 case tok::kw_char32_t: 3733 3734 case tok::kw_int: 3735 case tok::kw_half: 3736 case tok::kw_float: 3737 case tok::kw_double: 3738 case tok::kw_bool: 3739 case tok::kw__Bool: 3740 case tok::kw__Decimal32: 3741 case tok::kw__Decimal64: 3742 case tok::kw__Decimal128: 3743 case tok::kw___vector: 3744 3745 // struct-or-union-specifier (C99) or class-specifier (C++) 3746 case tok::kw_class: 3747 case tok::kw_struct: 3748 case tok::kw_union: 3749 case tok::kw___interface: 3750 // enum-specifier 3751 case tok::kw_enum: 3752 3753 // type-qualifier 3754 case tok::kw_const: 3755 case tok::kw_volatile: 3756 case tok::kw_restrict: 3757 3758 // function-specifier 3759 case tok::kw_inline: 3760 case tok::kw_virtual: 3761 case tok::kw_explicit: 3762 3763 // static_assert-declaration 3764 case tok::kw__Static_assert: 3765 3766 // GNU typeof support. 3767 case tok::kw_typeof: 3768 3769 // GNU attributes. 3770 case tok::kw___attribute: 3771 return true; 3772 3773 // C++0x decltype. 3774 case tok::annot_decltype: 3775 return true; 3776 3777 // C11 _Atomic() 3778 case tok::kw__Atomic: 3779 return true; 3780 3781 // GNU ObjC bizarre protocol extension: <proto1,proto2> with implicit 'id'. 3782 case tok::less: 3783 return getLangOpts().ObjC1; 3784 3785 // typedef-name 3786 case tok::annot_typename: 3787 return !DisambiguatingWithExpression || 3788 !isStartOfObjCClassMessageMissingOpenBracket(); 3789 3790 case tok::kw___declspec: 3791 case tok::kw___cdecl: 3792 case tok::kw___stdcall: 3793 case tok::kw___fastcall: 3794 case tok::kw___thiscall: 3795 case tok::kw___w64: 3796 case tok::kw___ptr64: 3797 case tok::kw___ptr32: 3798 case tok::kw___forceinline: 3799 case tok::kw___pascal: 3800 case tok::kw___unaligned: 3801 3802 case tok::kw___private: 3803 case tok::kw___local: 3804 case tok::kw___global: 3805 case tok::kw___constant: 3806 case tok::kw___read_only: 3807 case tok::kw___read_write: 3808 case tok::kw___write_only: 3809 3810 return true; 3811 } 3812 } 3813 3814 bool Parser::isConstructorDeclarator() { 3815 TentativeParsingAction TPA(*this); 3816 3817 // Parse the C++ scope specifier. 3818 CXXScopeSpec SS; 3819 if (ParseOptionalCXXScopeSpecifier(SS, ParsedType(), 3820 /*EnteringContext=*/true)) { 3821 TPA.Revert(); 3822 return false; 3823 } 3824 3825 // Parse the constructor name. 3826 if (Tok.is(tok::identifier) || Tok.is(tok::annot_template_id)) { 3827 // We already know that we have a constructor name; just consume 3828 // the token. 3829 ConsumeToken(); 3830 } else { 3831 TPA.Revert(); 3832 return false; 3833 } 3834 3835 // Current class name must be followed by a left parenthesis. 3836 if (Tok.isNot(tok::l_paren)) { 3837 TPA.Revert(); 3838 return false; 3839 } 3840 ConsumeParen(); 3841 3842 // A right parenthesis, or ellipsis followed by a right parenthesis signals 3843 // that we have a constructor. 3844 if (Tok.is(tok::r_paren) || 3845 (Tok.is(tok::ellipsis) && NextToken().is(tok::r_paren))) { 3846 TPA.Revert(); 3847 return true; 3848 } 3849 3850 // If we need to, enter the specified scope. 3851 DeclaratorScopeObj DeclScopeObj(*this, SS); 3852 if (SS.isSet() && Actions.ShouldEnterDeclaratorScope(getCurScope(), SS)) 3853 DeclScopeObj.EnterDeclaratorScope(); 3854 3855 // Optionally skip Microsoft attributes. 3856 ParsedAttributes Attrs(AttrFactory); 3857 MaybeParseMicrosoftAttributes(Attrs); 3858 3859 // Check whether the next token(s) are part of a declaration 3860 // specifier, in which case we have the start of a parameter and, 3861 // therefore, we know that this is a constructor. 3862 bool IsConstructor = false; 3863 if (isDeclarationSpecifier()) 3864 IsConstructor = true; 3865 else if (Tok.is(tok::identifier) || 3866 (Tok.is(tok::annot_cxxscope) && NextToken().is(tok::identifier))) { 3867 // We've seen "C ( X" or "C ( X::Y", but "X" / "X::Y" is not a type. 3868 // This might be a parenthesized member name, but is more likely to 3869 // be a constructor declaration with an invalid argument type. Keep 3870 // looking. 3871 if (Tok.is(tok::annot_cxxscope)) 3872 ConsumeToken(); 3873 ConsumeToken(); 3874 3875 // If this is not a constructor, we must be parsing a declarator, 3876 // which must have one of the following syntactic forms (see the 3877 // grammar extract at the start of ParseDirectDeclarator): 3878 switch (Tok.getKind()) { 3879 case tok::l_paren: 3880 // C(X ( int)); 3881 case tok::l_square: 3882 // C(X [ 5]); 3883 // C(X [ [attribute]]); 3884 case tok::coloncolon: 3885 // C(X :: Y); 3886 // C(X :: *p); 3887 case tok::r_paren: 3888 // C(X ) 3889 // Assume this isn't a constructor, rather than assuming it's a 3890 // constructor with an unnamed parameter of an ill-formed type. 3891 break; 3892 3893 default: 3894 IsConstructor = true; 3895 break; 3896 } 3897 } 3898 3899 TPA.Revert(); 3900 return IsConstructor; 3901 } 3902 3903 /// ParseTypeQualifierListOpt 3904 /// type-qualifier-list: [C99 6.7.5] 3905 /// type-qualifier 3906 /// [vendor] attributes 3907 /// [ only if VendorAttributesAllowed=true ] 3908 /// type-qualifier-list type-qualifier 3909 /// [vendor] type-qualifier-list attributes 3910 /// [ only if VendorAttributesAllowed=true ] 3911 /// [C++0x] attribute-specifier[opt] is allowed before cv-qualifier-seq 3912 /// [ only if CXX0XAttributesAllowed=true ] 3913 /// Note: vendor can be GNU, MS, etc. 3914 /// 3915 void Parser::ParseTypeQualifierListOpt(DeclSpec &DS, 3916 bool VendorAttributesAllowed, 3917 bool CXX11AttributesAllowed) { 3918 if (getLangOpts().CPlusPlus0x && CXX11AttributesAllowed && 3919 isCXX11AttributeSpecifier()) { 3920 ParsedAttributesWithRange attrs(AttrFactory); 3921 ParseCXX11Attributes(attrs); 3922 DS.takeAttributesFrom(attrs); 3923 } 3924 3925 SourceLocation EndLoc; 3926 3927 while (1) { 3928 bool isInvalid = false; 3929 const char *PrevSpec = 0; 3930 unsigned DiagID = 0; 3931 SourceLocation Loc = Tok.getLocation(); 3932 3933 switch (Tok.getKind()) { 3934 case tok::code_completion: 3935 Actions.CodeCompleteTypeQualifiers(DS); 3936 return cutOffParsing(); 3937 3938 case tok::kw_const: 3939 isInvalid = DS.SetTypeQual(DeclSpec::TQ_const , Loc, PrevSpec, DiagID, 3940 getLangOpts(), /*IsTypeSpec*/false); 3941 break; 3942 case tok::kw_volatile: 3943 isInvalid = DS.SetTypeQual(DeclSpec::TQ_volatile, Loc, PrevSpec, DiagID, 3944 getLangOpts(), /*IsTypeSpec*/false); 3945 break; 3946 case tok::kw_restrict: 3947 isInvalid = DS.SetTypeQual(DeclSpec::TQ_restrict, Loc, PrevSpec, DiagID, 3948 getLangOpts(), /*IsTypeSpec*/false); 3949 break; 3950 3951 // OpenCL qualifiers: 3952 case tok::kw_private: 3953 if (!getLangOpts().OpenCL) 3954 goto DoneWithTypeQuals; 3955 case tok::kw___private: 3956 case tok::kw___global: 3957 case tok::kw___local: 3958 case tok::kw___constant: 3959 case tok::kw___read_only: 3960 case tok::kw___write_only: 3961 case tok::kw___read_write: 3962 ParseOpenCLQualifiers(DS); 3963 break; 3964 3965 case tok::kw___w64: 3966 case tok::kw___ptr64: 3967 case tok::kw___ptr32: 3968 case tok::kw___cdecl: 3969 case tok::kw___stdcall: 3970 case tok::kw___fastcall: 3971 case tok::kw___thiscall: 3972 case tok::kw___unaligned: 3973 if (VendorAttributesAllowed) { 3974 ParseMicrosoftTypeAttributes(DS.getAttributes()); 3975 continue; 3976 } 3977 goto DoneWithTypeQuals; 3978 case tok::kw___pascal: 3979 if (VendorAttributesAllowed) { 3980 ParseBorlandTypeAttributes(DS.getAttributes()); 3981 continue; 3982 } 3983 goto DoneWithTypeQuals; 3984 case tok::kw___attribute: 3985 if (VendorAttributesAllowed) { 3986 ParseGNUAttributes(DS.getAttributes()); 3987 continue; // do *not* consume the next token! 3988 } 3989 // otherwise, FALL THROUGH! 3990 default: 3991 DoneWithTypeQuals: 3992 // If this is not a type-qualifier token, we're done reading type 3993 // qualifiers. First verify that DeclSpec's are consistent. 3994 DS.Finish(Diags, PP); 3995 if (EndLoc.isValid()) 3996 DS.SetRangeEnd(EndLoc); 3997 return; 3998 } 3999 4000 // If the specifier combination wasn't legal, issue a diagnostic. 4001 if (isInvalid) { 4002 assert(PrevSpec && "Method did not return previous specifier!"); 4003 Diag(Tok, DiagID) << PrevSpec; 4004 } 4005 EndLoc = ConsumeToken(); 4006 } 4007 } 4008 4009 4010 /// ParseDeclarator - Parse and verify a newly-initialized declarator. 4011 /// 4012 void Parser::ParseDeclarator(Declarator &D) { 4013 /// This implements the 'declarator' production in the C grammar, then checks 4014 /// for well-formedness and issues diagnostics. 4015 ParseDeclaratorInternal(D, &Parser::ParseDirectDeclarator); 4016 } 4017 4018 static bool isPtrOperatorToken(tok::TokenKind Kind, const LangOptions &Lang) { 4019 if (Kind == tok::star || Kind == tok::caret) 4020 return true; 4021 4022 // We parse rvalue refs in C++03, because otherwise the errors are scary. 4023 if (!Lang.CPlusPlus) 4024 return false; 4025 4026 return Kind == tok::amp || Kind == tok::ampamp; 4027 } 4028 4029 /// ParseDeclaratorInternal - Parse a C or C++ declarator. The direct-declarator 4030 /// is parsed by the function passed to it. Pass null, and the direct-declarator 4031 /// isn't parsed at all, making this function effectively parse the C++ 4032 /// ptr-operator production. 4033 /// 4034 /// If the grammar of this construct is extended, matching changes must also be 4035 /// made to TryParseDeclarator and MightBeDeclarator, and possibly to 4036 /// isConstructorDeclarator. 4037 /// 4038 /// declarator: [C99 6.7.5] [C++ 8p4, dcl.decl] 4039 /// [C] pointer[opt] direct-declarator 4040 /// [C++] direct-declarator 4041 /// [C++] ptr-operator declarator 4042 /// 4043 /// pointer: [C99 6.7.5] 4044 /// '*' type-qualifier-list[opt] 4045 /// '*' type-qualifier-list[opt] pointer 4046 /// 4047 /// ptr-operator: 4048 /// '*' cv-qualifier-seq[opt] 4049 /// '&' 4050 /// [C++0x] '&&' 4051 /// [GNU] '&' restrict[opt] attributes[opt] 4052 /// [GNU?] '&&' restrict[opt] attributes[opt] 4053 /// '::'[opt] nested-name-specifier '*' cv-qualifier-seq[opt] 4054 void Parser::ParseDeclaratorInternal(Declarator &D, 4055 DirectDeclParseFunction DirectDeclParser) { 4056 if (Diags.hasAllExtensionsSilenced()) 4057 D.setExtension(); 4058 4059 // C++ member pointers start with a '::' or a nested-name. 4060 // Member pointers get special handling, since there's no place for the 4061 // scope spec in the generic path below. 4062 if (getLangOpts().CPlusPlus && 4063 (Tok.is(tok::coloncolon) || Tok.is(tok::identifier) || 4064 Tok.is(tok::annot_cxxscope))) { 4065 bool EnteringContext = D.getContext() == Declarator::FileContext || 4066 D.getContext() == Declarator::MemberContext; 4067 CXXScopeSpec SS; 4068 ParseOptionalCXXScopeSpecifier(SS, ParsedType(), EnteringContext); 4069 4070 if (SS.isNotEmpty()) { 4071 if (Tok.isNot(tok::star)) { 4072 // The scope spec really belongs to the direct-declarator. 4073 D.getCXXScopeSpec() = SS; 4074 if (DirectDeclParser) 4075 (this->*DirectDeclParser)(D); 4076 return; 4077 } 4078 4079 SourceLocation Loc = ConsumeToken(); 4080 D.SetRangeEnd(Loc); 4081 DeclSpec DS(AttrFactory); 4082 ParseTypeQualifierListOpt(DS); 4083 D.ExtendWithDeclSpec(DS); 4084 4085 // Recurse to parse whatever is left. 4086 ParseDeclaratorInternal(D, DirectDeclParser); 4087 4088 // Sema will have to catch (syntactically invalid) pointers into global 4089 // scope. It has to catch pointers into namespace scope anyway. 4090 D.AddTypeInfo(DeclaratorChunk::getMemberPointer(SS,DS.getTypeQualifiers(), 4091 Loc), 4092 DS.getAttributes(), 4093 /* Don't replace range end. */SourceLocation()); 4094 return; 4095 } 4096 } 4097 4098 tok::TokenKind Kind = Tok.getKind(); 4099 // Not a pointer, C++ reference, or block. 4100 if (!isPtrOperatorToken(Kind, getLangOpts())) { 4101 if (DirectDeclParser) 4102 (this->*DirectDeclParser)(D); 4103 return; 4104 } 4105 4106 // Otherwise, '*' -> pointer, '^' -> block, '&' -> lvalue reference, 4107 // '&&' -> rvalue reference 4108 SourceLocation Loc = ConsumeToken(); // Eat the *, ^, & or &&. 4109 D.SetRangeEnd(Loc); 4110 4111 if (Kind == tok::star || Kind == tok::caret) { 4112 // Is a pointer. 4113 DeclSpec DS(AttrFactory); 4114 4115 // FIXME: GNU attributes are not allowed here in a new-type-id. 4116 ParseTypeQualifierListOpt(DS); 4117 D.ExtendWithDeclSpec(DS); 4118 4119 // Recursively parse the declarator. 4120 ParseDeclaratorInternal(D, DirectDeclParser); 4121 if (Kind == tok::star) 4122 // Remember that we parsed a pointer type, and remember the type-quals. 4123 D.AddTypeInfo(DeclaratorChunk::getPointer(DS.getTypeQualifiers(), Loc, 4124 DS.getConstSpecLoc(), 4125 DS.getVolatileSpecLoc(), 4126 DS.getRestrictSpecLoc()), 4127 DS.getAttributes(), 4128 SourceLocation()); 4129 else 4130 // Remember that we parsed a Block type, and remember the type-quals. 4131 D.AddTypeInfo(DeclaratorChunk::getBlockPointer(DS.getTypeQualifiers(), 4132 Loc), 4133 DS.getAttributes(), 4134 SourceLocation()); 4135 } else { 4136 // Is a reference 4137 DeclSpec DS(AttrFactory); 4138 4139 // Complain about rvalue references in C++03, but then go on and build 4140 // the declarator. 4141 if (Kind == tok::ampamp) 4142 Diag(Loc, getLangOpts().CPlusPlus0x ? 4143 diag::warn_cxx98_compat_rvalue_reference : 4144 diag::ext_rvalue_reference); 4145 4146 // GNU-style and C++11 attributes are allowed here, as is restrict. 4147 ParseTypeQualifierListOpt(DS); 4148 D.ExtendWithDeclSpec(DS); 4149 4150 // C++ 8.3.2p1: cv-qualified references are ill-formed except when the 4151 // cv-qualifiers are introduced through the use of a typedef or of a 4152 // template type argument, in which case the cv-qualifiers are ignored. 4153 if (DS.getTypeQualifiers() != DeclSpec::TQ_unspecified) { 4154 if (DS.getTypeQualifiers() & DeclSpec::TQ_const) 4155 Diag(DS.getConstSpecLoc(), 4156 diag::err_invalid_reference_qualifier_application) << "const"; 4157 if (DS.getTypeQualifiers() & DeclSpec::TQ_volatile) 4158 Diag(DS.getVolatileSpecLoc(), 4159 diag::err_invalid_reference_qualifier_application) << "volatile"; 4160 } 4161 4162 // Recursively parse the declarator. 4163 ParseDeclaratorInternal(D, DirectDeclParser); 4164 4165 if (D.getNumTypeObjects() > 0) { 4166 // C++ [dcl.ref]p4: There shall be no references to references. 4167 DeclaratorChunk& InnerChunk = D.getTypeObject(D.getNumTypeObjects() - 1); 4168 if (InnerChunk.Kind == DeclaratorChunk::Reference) { 4169 if (const IdentifierInfo *II = D.getIdentifier()) 4170 Diag(InnerChunk.Loc, diag::err_illegal_decl_reference_to_reference) 4171 << II; 4172 else 4173 Diag(InnerChunk.Loc, diag::err_illegal_decl_reference_to_reference) 4174 << "type name"; 4175 4176 // Once we've complained about the reference-to-reference, we 4177 // can go ahead and build the (technically ill-formed) 4178 // declarator: reference collapsing will take care of it. 4179 } 4180 } 4181 4182 // Remember that we parsed a reference type. It doesn't have type-quals. 4183 D.AddTypeInfo(DeclaratorChunk::getReference(DS.getTypeQualifiers(), Loc, 4184 Kind == tok::amp), 4185 DS.getAttributes(), 4186 SourceLocation()); 4187 } 4188 } 4189 4190 static void diagnoseMisplacedEllipsis(Parser &P, Declarator &D, 4191 SourceLocation EllipsisLoc) { 4192 if (EllipsisLoc.isValid()) { 4193 FixItHint Insertion; 4194 if (!D.getEllipsisLoc().isValid()) { 4195 Insertion = FixItHint::CreateInsertion(D.getIdentifierLoc(), "..."); 4196 D.setEllipsisLoc(EllipsisLoc); 4197 } 4198 P.Diag(EllipsisLoc, diag::err_misplaced_ellipsis_in_declaration) 4199 << FixItHint::CreateRemoval(EllipsisLoc) << Insertion << !D.hasName(); 4200 } 4201 } 4202 4203 /// ParseDirectDeclarator 4204 /// direct-declarator: [C99 6.7.5] 4205 /// [C99] identifier 4206 /// '(' declarator ')' 4207 /// [GNU] '(' attributes declarator ')' 4208 /// [C90] direct-declarator '[' constant-expression[opt] ']' 4209 /// [C99] direct-declarator '[' type-qual-list[opt] assignment-expr[opt] ']' 4210 /// [C99] direct-declarator '[' 'static' type-qual-list[opt] assign-expr ']' 4211 /// [C99] direct-declarator '[' type-qual-list 'static' assignment-expr ']' 4212 /// [C99] direct-declarator '[' type-qual-list[opt] '*' ']' 4213 /// [C++11] direct-declarator '[' constant-expression[opt] ']' 4214 /// attribute-specifier-seq[opt] 4215 /// direct-declarator '(' parameter-type-list ')' 4216 /// direct-declarator '(' identifier-list[opt] ')' 4217 /// [GNU] direct-declarator '(' parameter-forward-declarations 4218 /// parameter-type-list[opt] ')' 4219 /// [C++] direct-declarator '(' parameter-declaration-clause ')' 4220 /// cv-qualifier-seq[opt] exception-specification[opt] 4221 /// [C++11] direct-declarator '(' parameter-declaration-clause ')' 4222 /// attribute-specifier-seq[opt] cv-qualifier-seq[opt] 4223 /// ref-qualifier[opt] exception-specification[opt] 4224 /// [C++] declarator-id 4225 /// [C++11] declarator-id attribute-specifier-seq[opt] 4226 /// 4227 /// declarator-id: [C++ 8] 4228 /// '...'[opt] id-expression 4229 /// '::'[opt] nested-name-specifier[opt] type-name 4230 /// 4231 /// id-expression: [C++ 5.1] 4232 /// unqualified-id 4233 /// qualified-id 4234 /// 4235 /// unqualified-id: [C++ 5.1] 4236 /// identifier 4237 /// operator-function-id 4238 /// conversion-function-id 4239 /// '~' class-name 4240 /// template-id 4241 /// 4242 /// Note, any additional constructs added here may need corresponding changes 4243 /// in isConstructorDeclarator. 4244 void Parser::ParseDirectDeclarator(Declarator &D) { 4245 DeclaratorScopeObj DeclScopeObj(*this, D.getCXXScopeSpec()); 4246 4247 if (getLangOpts().CPlusPlus && D.mayHaveIdentifier()) { 4248 // ParseDeclaratorInternal might already have parsed the scope. 4249 if (D.getCXXScopeSpec().isEmpty()) { 4250 bool EnteringContext = D.getContext() == Declarator::FileContext || 4251 D.getContext() == Declarator::MemberContext; 4252 ParseOptionalCXXScopeSpecifier(D.getCXXScopeSpec(), ParsedType(), 4253 EnteringContext); 4254 } 4255 4256 if (D.getCXXScopeSpec().isValid()) { 4257 if (Actions.ShouldEnterDeclaratorScope(getCurScope(), D.getCXXScopeSpec())) 4258 // Change the declaration context for name lookup, until this function 4259 // is exited (and the declarator has been parsed). 4260 DeclScopeObj.EnterDeclaratorScope(); 4261 } 4262 4263 // C++0x [dcl.fct]p14: 4264 // There is a syntactic ambiguity when an ellipsis occurs at the end 4265 // of a parameter-declaration-clause without a preceding comma. In 4266 // this case, the ellipsis is parsed as part of the 4267 // abstract-declarator if the type of the parameter names a template 4268 // parameter pack that has not been expanded; otherwise, it is parsed 4269 // as part of the parameter-declaration-clause. 4270 if (Tok.is(tok::ellipsis) && D.getCXXScopeSpec().isEmpty() && 4271 !((D.getContext() == Declarator::PrototypeContext || 4272 D.getContext() == Declarator::BlockLiteralContext) && 4273 NextToken().is(tok::r_paren) && 4274 !Actions.containsUnexpandedParameterPacks(D))) { 4275 SourceLocation EllipsisLoc = ConsumeToken(); 4276 if (isPtrOperatorToken(Tok.getKind(), getLangOpts())) { 4277 // The ellipsis was put in the wrong place. Recover, and explain to 4278 // the user what they should have done. 4279 ParseDeclarator(D); 4280 diagnoseMisplacedEllipsis(*this, D, EllipsisLoc); 4281 return; 4282 } else 4283 D.setEllipsisLoc(EllipsisLoc); 4284 4285 // The ellipsis can't be followed by a parenthesized declarator. We 4286 // check for that in ParseParenDeclarator, after we have disambiguated 4287 // the l_paren token. 4288 } 4289 4290 if (Tok.is(tok::identifier) || Tok.is(tok::kw_operator) || 4291 Tok.is(tok::annot_template_id) || Tok.is(tok::tilde)) { 4292 // We found something that indicates the start of an unqualified-id. 4293 // Parse that unqualified-id. 4294 bool AllowConstructorName; 4295 if (D.getDeclSpec().hasTypeSpecifier()) 4296 AllowConstructorName = false; 4297 else if (D.getCXXScopeSpec().isSet()) 4298 AllowConstructorName = 4299 (D.getContext() == Declarator::FileContext || 4300 (D.getContext() == Declarator::MemberContext && 4301 D.getDeclSpec().isFriendSpecified())); 4302 else 4303 AllowConstructorName = (D.getContext() == Declarator::MemberContext); 4304 4305 SourceLocation TemplateKWLoc; 4306 if (ParseUnqualifiedId(D.getCXXScopeSpec(), 4307 /*EnteringContext=*/true, 4308 /*AllowDestructorName=*/true, 4309 AllowConstructorName, 4310 ParsedType(), 4311 TemplateKWLoc, 4312 D.getName()) || 4313 // Once we're past the identifier, if the scope was bad, mark the 4314 // whole declarator bad. 4315 D.getCXXScopeSpec().isInvalid()) { 4316 D.SetIdentifier(0, Tok.getLocation()); 4317 D.setInvalidType(true); 4318 } else { 4319 // Parsed the unqualified-id; update range information and move along. 4320 if (D.getSourceRange().getBegin().isInvalid()) 4321 D.SetRangeBegin(D.getName().getSourceRange().getBegin()); 4322 D.SetRangeEnd(D.getName().getSourceRange().getEnd()); 4323 } 4324 goto PastIdentifier; 4325 } 4326 } else if (Tok.is(tok::identifier) && D.mayHaveIdentifier()) { 4327 assert(!getLangOpts().CPlusPlus && 4328 "There's a C++-specific check for tok::identifier above"); 4329 assert(Tok.getIdentifierInfo() && "Not an identifier?"); 4330 D.SetIdentifier(Tok.getIdentifierInfo(), Tok.getLocation()); 4331 ConsumeToken(); 4332 goto PastIdentifier; 4333 } 4334 4335 if (Tok.is(tok::l_paren)) { 4336 // direct-declarator: '(' declarator ')' 4337 // direct-declarator: '(' attributes declarator ')' 4338 // Example: 'char (*X)' or 'int (*XX)(void)' 4339 ParseParenDeclarator(D); 4340 4341 // If the declarator was parenthesized, we entered the declarator 4342 // scope when parsing the parenthesized declarator, then exited 4343 // the scope already. Re-enter the scope, if we need to. 4344 if (D.getCXXScopeSpec().isSet()) { 4345 // If there was an error parsing parenthesized declarator, declarator 4346 // scope may have been entered before. Don't do it again. 4347 if (!D.isInvalidType() && 4348 Actions.ShouldEnterDeclaratorScope(getCurScope(), D.getCXXScopeSpec())) 4349 // Change the declaration context for name lookup, until this function 4350 // is exited (and the declarator has been parsed). 4351 DeclScopeObj.EnterDeclaratorScope(); 4352 } 4353 } else if (D.mayOmitIdentifier()) { 4354 // This could be something simple like "int" (in which case the declarator 4355 // portion is empty), if an abstract-declarator is allowed. 4356 D.SetIdentifier(0, Tok.getLocation()); 4357 } else { 4358 if (Tok.getKind() == tok::annot_pragma_parser_crash) 4359 LLVM_BUILTIN_TRAP; 4360 if (D.getContext() == Declarator::MemberContext) 4361 Diag(Tok, diag::err_expected_member_name_or_semi) 4362 << D.getDeclSpec().getSourceRange(); 4363 else if (getLangOpts().CPlusPlus) 4364 Diag(Tok, diag::err_expected_unqualified_id) << getLangOpts().CPlusPlus; 4365 else 4366 Diag(Tok, diag::err_expected_ident_lparen); 4367 D.SetIdentifier(0, Tok.getLocation()); 4368 D.setInvalidType(true); 4369 } 4370 4371 PastIdentifier: 4372 assert(D.isPastIdentifier() && 4373 "Haven't past the location of the identifier yet?"); 4374 4375 // Don't parse attributes unless we have parsed an unparenthesized name. 4376 if (D.hasName() && !D.getNumTypeObjects()) 4377 MaybeParseCXX0XAttributes(D); 4378 4379 while (1) { 4380 if (Tok.is(tok::l_paren)) { 4381 // Enter function-declaration scope, limiting any declarators to the 4382 // function prototype scope, including parameter declarators. 4383 ParseScope PrototypeScope(this, 4384 Scope::FunctionPrototypeScope|Scope::DeclScope); 4385 // The paren may be part of a C++ direct initializer, eg. "int x(1);". 4386 // In such a case, check if we actually have a function declarator; if it 4387 // is not, the declarator has been fully parsed. 4388 bool IsAmbiguous = false; 4389 if (getLangOpts().CPlusPlus && D.mayBeFollowedByCXXDirectInit()) { 4390 // The name of the declarator, if any, is tentatively declared within 4391 // a possible direct initializer. 4392 TentativelyDeclaredIdentifiers.push_back(D.getIdentifier()); 4393 bool IsFunctionDecl = isCXXFunctionDeclarator(&IsAmbiguous); 4394 TentativelyDeclaredIdentifiers.pop_back(); 4395 if (!IsFunctionDecl) 4396 break; 4397 } 4398 ParsedAttributes attrs(AttrFactory); 4399 BalancedDelimiterTracker T(*this, tok::l_paren); 4400 T.consumeOpen(); 4401 ParseFunctionDeclarator(D, attrs, T, IsAmbiguous); 4402 PrototypeScope.Exit(); 4403 } else if (Tok.is(tok::l_square)) { 4404 ParseBracketDeclarator(D); 4405 } else { 4406 break; 4407 } 4408 } 4409 } 4410 4411 /// ParseParenDeclarator - We parsed the declarator D up to a paren. This is 4412 /// only called before the identifier, so these are most likely just grouping 4413 /// parens for precedence. If we find that these are actually function 4414 /// parameter parens in an abstract-declarator, we call ParseFunctionDeclarator. 4415 /// 4416 /// direct-declarator: 4417 /// '(' declarator ')' 4418 /// [GNU] '(' attributes declarator ')' 4419 /// direct-declarator '(' parameter-type-list ')' 4420 /// direct-declarator '(' identifier-list[opt] ')' 4421 /// [GNU] direct-declarator '(' parameter-forward-declarations 4422 /// parameter-type-list[opt] ')' 4423 /// 4424 void Parser::ParseParenDeclarator(Declarator &D) { 4425 BalancedDelimiterTracker T(*this, tok::l_paren); 4426 T.consumeOpen(); 4427 4428 assert(!D.isPastIdentifier() && "Should be called before passing identifier"); 4429 4430 // Eat any attributes before we look at whether this is a grouping or function 4431 // declarator paren. If this is a grouping paren, the attribute applies to 4432 // the type being built up, for example: 4433 // int (__attribute__(()) *x)(long y) 4434 // If this ends up not being a grouping paren, the attribute applies to the 4435 // first argument, for example: 4436 // int (__attribute__(()) int x) 4437 // In either case, we need to eat any attributes to be able to determine what 4438 // sort of paren this is. 4439 // 4440 ParsedAttributes attrs(AttrFactory); 4441 bool RequiresArg = false; 4442 if (Tok.is(tok::kw___attribute)) { 4443 ParseGNUAttributes(attrs); 4444 4445 // We require that the argument list (if this is a non-grouping paren) be 4446 // present even if the attribute list was empty. 4447 RequiresArg = true; 4448 } 4449 // Eat any Microsoft extensions. 4450 if (Tok.is(tok::kw___cdecl) || Tok.is(tok::kw___stdcall) || 4451 Tok.is(tok::kw___thiscall) || Tok.is(tok::kw___fastcall) || 4452 Tok.is(tok::kw___w64) || Tok.is(tok::kw___ptr64) || 4453 Tok.is(tok::kw___ptr32) || Tok.is(tok::kw___unaligned)) { 4454 ParseMicrosoftTypeAttributes(attrs); 4455 } 4456 // Eat any Borland extensions. 4457 if (Tok.is(tok::kw___pascal)) 4458 ParseBorlandTypeAttributes(attrs); 4459 4460 // If we haven't past the identifier yet (or where the identifier would be 4461 // stored, if this is an abstract declarator), then this is probably just 4462 // grouping parens. However, if this could be an abstract-declarator, then 4463 // this could also be the start of function arguments (consider 'void()'). 4464 bool isGrouping; 4465 4466 if (!D.mayOmitIdentifier()) { 4467 // If this can't be an abstract-declarator, this *must* be a grouping 4468 // paren, because we haven't seen the identifier yet. 4469 isGrouping = true; 4470 } else if (Tok.is(tok::r_paren) || // 'int()' is a function. 4471 (getLangOpts().CPlusPlus && Tok.is(tok::ellipsis) && 4472 NextToken().is(tok::r_paren)) || // C++ int(...) 4473 isDeclarationSpecifier() || // 'int(int)' is a function. 4474 isCXX11AttributeSpecifier()) { // 'int([[]]int)' is a function. 4475 // This handles C99 6.7.5.3p11: in "typedef int X; void foo(X)", X is 4476 // considered to be a type, not a K&R identifier-list. 4477 isGrouping = false; 4478 } else { 4479 // Otherwise, this is a grouping paren, e.g. 'int (*X)' or 'int(X)'. 4480 isGrouping = true; 4481 } 4482 4483 // If this is a grouping paren, handle: 4484 // direct-declarator: '(' declarator ')' 4485 // direct-declarator: '(' attributes declarator ')' 4486 if (isGrouping) { 4487 SourceLocation EllipsisLoc = D.getEllipsisLoc(); 4488 D.setEllipsisLoc(SourceLocation()); 4489 4490 bool hadGroupingParens = D.hasGroupingParens(); 4491 D.setGroupingParens(true); 4492 ParseDeclaratorInternal(D, &Parser::ParseDirectDeclarator); 4493 // Match the ')'. 4494 T.consumeClose(); 4495 D.AddTypeInfo(DeclaratorChunk::getParen(T.getOpenLocation(), 4496 T.getCloseLocation()), 4497 attrs, T.getCloseLocation()); 4498 4499 D.setGroupingParens(hadGroupingParens); 4500 4501 // An ellipsis cannot be placed outside parentheses. 4502 if (EllipsisLoc.isValid()) 4503 diagnoseMisplacedEllipsis(*this, D, EllipsisLoc); 4504 4505 return; 4506 } 4507 4508 // Okay, if this wasn't a grouping paren, it must be the start of a function 4509 // argument list. Recognize that this declarator will never have an 4510 // identifier (and remember where it would have been), then call into 4511 // ParseFunctionDeclarator to handle of argument list. 4512 D.SetIdentifier(0, Tok.getLocation()); 4513 4514 // Enter function-declaration scope, limiting any declarators to the 4515 // function prototype scope, including parameter declarators. 4516 ParseScope PrototypeScope(this, 4517 Scope::FunctionPrototypeScope|Scope::DeclScope); 4518 ParseFunctionDeclarator(D, attrs, T, false, RequiresArg); 4519 PrototypeScope.Exit(); 4520 } 4521 4522 /// ParseFunctionDeclarator - We are after the identifier and have parsed the 4523 /// declarator D up to a paren, which indicates that we are parsing function 4524 /// arguments. 4525 /// 4526 /// If FirstArgAttrs is non-null, then the caller parsed those arguments 4527 /// immediately after the open paren - they should be considered to be the 4528 /// first argument of a parameter. 4529 /// 4530 /// If RequiresArg is true, then the first argument of the function is required 4531 /// to be present and required to not be an identifier list. 4532 /// 4533 /// For C++, after the parameter-list, it also parses the cv-qualifier-seq[opt], 4534 /// (C++11) ref-qualifier[opt], exception-specification[opt], 4535 /// (C++11) attribute-specifier-seq[opt], and (C++11) trailing-return-type[opt]. 4536 /// 4537 /// [C++11] exception-specification: 4538 /// dynamic-exception-specification 4539 /// noexcept-specification 4540 /// 4541 void Parser::ParseFunctionDeclarator(Declarator &D, 4542 ParsedAttributes &FirstArgAttrs, 4543 BalancedDelimiterTracker &Tracker, 4544 bool IsAmbiguous, 4545 bool RequiresArg) { 4546 assert(getCurScope()->isFunctionPrototypeScope() && 4547 "Should call from a Function scope"); 4548 // lparen is already consumed! 4549 assert(D.isPastIdentifier() && "Should not call before identifier!"); 4550 4551 // This should be true when the function has typed arguments. 4552 // Otherwise, it is treated as a K&R-style function. 4553 bool HasProto = false; 4554 // Build up an array of information about the parsed arguments. 4555 SmallVector<DeclaratorChunk::ParamInfo, 16> ParamInfo; 4556 // Remember where we see an ellipsis, if any. 4557 SourceLocation EllipsisLoc; 4558 4559 DeclSpec DS(AttrFactory); 4560 bool RefQualifierIsLValueRef = true; 4561 SourceLocation RefQualifierLoc; 4562 SourceLocation ConstQualifierLoc; 4563 SourceLocation VolatileQualifierLoc; 4564 ExceptionSpecificationType ESpecType = EST_None; 4565 SourceRange ESpecRange; 4566 SmallVector<ParsedType, 2> DynamicExceptions; 4567 SmallVector<SourceRange, 2> DynamicExceptionRanges; 4568 ExprResult NoexceptExpr; 4569 ParsedAttributes FnAttrs(AttrFactory); 4570 TypeResult TrailingReturnType; 4571 4572 Actions.ActOnStartFunctionDeclarator(); 4573 4574 SourceLocation EndLoc; 4575 if (isFunctionDeclaratorIdentifierList()) { 4576 if (RequiresArg) 4577 Diag(Tok, diag::err_argument_required_after_attribute); 4578 4579 ParseFunctionDeclaratorIdentifierList(D, ParamInfo); 4580 4581 Tracker.consumeClose(); 4582 EndLoc = Tracker.getCloseLocation(); 4583 } else { 4584 if (Tok.isNot(tok::r_paren)) 4585 ParseParameterDeclarationClause(D, FirstArgAttrs, ParamInfo, EllipsisLoc); 4586 else if (RequiresArg) 4587 Diag(Tok, diag::err_argument_required_after_attribute); 4588 4589 HasProto = ParamInfo.size() || getLangOpts().CPlusPlus; 4590 4591 // If we have the closing ')', eat it. 4592 Tracker.consumeClose(); 4593 EndLoc = Tracker.getCloseLocation(); 4594 4595 if (getLangOpts().CPlusPlus) { 4596 // FIXME: Accept these components in any order, and produce fixits to 4597 // correct the order if the user gets it wrong. Ideally we should deal 4598 // with the virt-specifier-seq and pure-specifier in the same way. 4599 4600 // Parse cv-qualifier-seq[opt]. 4601 ParseTypeQualifierListOpt(DS, false /*no attributes*/, false); 4602 if (!DS.getSourceRange().getEnd().isInvalid()) { 4603 EndLoc = DS.getSourceRange().getEnd(); 4604 ConstQualifierLoc = DS.getConstSpecLoc(); 4605 VolatileQualifierLoc = DS.getVolatileSpecLoc(); 4606 } 4607 4608 // Parse ref-qualifier[opt]. 4609 if (Tok.is(tok::amp) || Tok.is(tok::ampamp)) { 4610 Diag(Tok, getLangOpts().CPlusPlus0x ? 4611 diag::warn_cxx98_compat_ref_qualifier : 4612 diag::ext_ref_qualifier); 4613 4614 RefQualifierIsLValueRef = Tok.is(tok::amp); 4615 RefQualifierLoc = ConsumeToken(); 4616 EndLoc = RefQualifierLoc; 4617 } 4618 4619 // C++11 [expr.prim.general]p3: 4620 // If a declaration declares a member function or member function 4621 // template of a class X, the expression this is a prvalue of type 4622 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 4623 // and the end of the function-definition, member-declarator, or 4624 // declarator. 4625 bool IsCXX11MemberFunction = 4626 getLangOpts().CPlusPlus0x && 4627 (D.getContext() == Declarator::MemberContext || 4628 (D.getContext() == Declarator::FileContext && 4629 D.getCXXScopeSpec().isValid() && 4630 Actions.CurContext->isRecord())); 4631 Sema::CXXThisScopeRAII ThisScope(Actions, 4632 dyn_cast<CXXRecordDecl>(Actions.CurContext), 4633 DS.getTypeQualifiers(), 4634 IsCXX11MemberFunction); 4635 4636 // Parse exception-specification[opt]. 4637 ESpecType = tryParseExceptionSpecification(ESpecRange, 4638 DynamicExceptions, 4639 DynamicExceptionRanges, 4640 NoexceptExpr); 4641 if (ESpecType != EST_None) 4642 EndLoc = ESpecRange.getEnd(); 4643 4644 // Parse attribute-specifier-seq[opt]. Per DR 979 and DR 1297, this goes 4645 // after the exception-specification. 4646 MaybeParseCXX0XAttributes(FnAttrs); 4647 4648 // Parse trailing-return-type[opt]. 4649 if (getLangOpts().CPlusPlus0x && Tok.is(tok::arrow)) { 4650 Diag(Tok, diag::warn_cxx98_compat_trailing_return_type); 4651 SourceRange Range; 4652 TrailingReturnType = ParseTrailingReturnType(Range); 4653 if (Range.getEnd().isValid()) 4654 EndLoc = Range.getEnd(); 4655 } 4656 } 4657 } 4658 4659 // Remember that we parsed a function type, and remember the attributes. 4660 D.AddTypeInfo(DeclaratorChunk::getFunction(HasProto, 4661 /*isVariadic=*/EllipsisLoc.isValid(), 4662 IsAmbiguous, EllipsisLoc, 4663 ParamInfo.data(), ParamInfo.size(), 4664 DS.getTypeQualifiers(), 4665 RefQualifierIsLValueRef, 4666 RefQualifierLoc, ConstQualifierLoc, 4667 VolatileQualifierLoc, 4668 /*MutableLoc=*/SourceLocation(), 4669 ESpecType, ESpecRange.getBegin(), 4670 DynamicExceptions.data(), 4671 DynamicExceptionRanges.data(), 4672 DynamicExceptions.size(), 4673 NoexceptExpr.isUsable() ? 4674 NoexceptExpr.get() : 0, 4675 Tracker.getOpenLocation(), 4676 EndLoc, D, 4677 TrailingReturnType), 4678 FnAttrs, EndLoc); 4679 4680 Actions.ActOnEndFunctionDeclarator(); 4681 } 4682 4683 /// isFunctionDeclaratorIdentifierList - This parameter list may have an 4684 /// identifier list form for a K&R-style function: void foo(a,b,c) 4685 /// 4686 /// Note that identifier-lists are only allowed for normal declarators, not for 4687 /// abstract-declarators. 4688 bool Parser::isFunctionDeclaratorIdentifierList() { 4689 return !getLangOpts().CPlusPlus 4690 && Tok.is(tok::identifier) 4691 && !TryAltiVecVectorToken() 4692 // K&R identifier lists can't have typedefs as identifiers, per C99 4693 // 6.7.5.3p11. 4694 && (TryAnnotateTypeOrScopeToken() || !Tok.is(tok::annot_typename)) 4695 // Identifier lists follow a really simple grammar: the identifiers can 4696 // be followed *only* by a ", identifier" or ")". However, K&R 4697 // identifier lists are really rare in the brave new modern world, and 4698 // it is very common for someone to typo a type in a non-K&R style 4699 // list. If we are presented with something like: "void foo(intptr x, 4700 // float y)", we don't want to start parsing the function declarator as 4701 // though it is a K&R style declarator just because intptr is an 4702 // invalid type. 4703 // 4704 // To handle this, we check to see if the token after the first 4705 // identifier is a "," or ")". Only then do we parse it as an 4706 // identifier list. 4707 && (NextToken().is(tok::comma) || NextToken().is(tok::r_paren)); 4708 } 4709 4710 /// ParseFunctionDeclaratorIdentifierList - While parsing a function declarator 4711 /// we found a K&R-style identifier list instead of a typed parameter list. 4712 /// 4713 /// After returning, ParamInfo will hold the parsed parameters. 4714 /// 4715 /// identifier-list: [C99 6.7.5] 4716 /// identifier 4717 /// identifier-list ',' identifier 4718 /// 4719 void Parser::ParseFunctionDeclaratorIdentifierList( 4720 Declarator &D, 4721 SmallVector<DeclaratorChunk::ParamInfo, 16> &ParamInfo) { 4722 // If there was no identifier specified for the declarator, either we are in 4723 // an abstract-declarator, or we are in a parameter declarator which was found 4724 // to be abstract. In abstract-declarators, identifier lists are not valid: 4725 // diagnose this. 4726 if (!D.getIdentifier()) 4727 Diag(Tok, diag::ext_ident_list_in_param); 4728 4729 // Maintain an efficient lookup of params we have seen so far. 4730 llvm::SmallSet<const IdentifierInfo*, 16> ParamsSoFar; 4731 4732 while (1) { 4733 // If this isn't an identifier, report the error and skip until ')'. 4734 if (Tok.isNot(tok::identifier)) { 4735 Diag(Tok, diag::err_expected_ident); 4736 SkipUntil(tok::r_paren, /*StopAtSemi=*/true, /*DontConsume=*/true); 4737 // Forget we parsed anything. 4738 ParamInfo.clear(); 4739 return; 4740 } 4741 4742 IdentifierInfo *ParmII = Tok.getIdentifierInfo(); 4743 4744 // Reject 'typedef int y; int test(x, y)', but continue parsing. 4745 if (Actions.getTypeName(*ParmII, Tok.getLocation(), getCurScope())) 4746 Diag(Tok, diag::err_unexpected_typedef_ident) << ParmII; 4747 4748 // Verify that the argument identifier has not already been mentioned. 4749 if (!ParamsSoFar.insert(ParmII)) { 4750 Diag(Tok, diag::err_param_redefinition) << ParmII; 4751 } else { 4752 // Remember this identifier in ParamInfo. 4753 ParamInfo.push_back(DeclaratorChunk::ParamInfo(ParmII, 4754 Tok.getLocation(), 4755 0)); 4756 } 4757 4758 // Eat the identifier. 4759 ConsumeToken(); 4760 4761 // The list continues if we see a comma. 4762 if (Tok.isNot(tok::comma)) 4763 break; 4764 ConsumeToken(); 4765 } 4766 } 4767 4768 /// ParseParameterDeclarationClause - Parse a (possibly empty) parameter-list 4769 /// after the opening parenthesis. This function will not parse a K&R-style 4770 /// identifier list. 4771 /// 4772 /// D is the declarator being parsed. If FirstArgAttrs is non-null, then the 4773 /// caller parsed those arguments immediately after the open paren - they should 4774 /// be considered to be part of the first parameter. 4775 /// 4776 /// After returning, ParamInfo will hold the parsed parameters. EllipsisLoc will 4777 /// be the location of the ellipsis, if any was parsed. 4778 /// 4779 /// parameter-type-list: [C99 6.7.5] 4780 /// parameter-list 4781 /// parameter-list ',' '...' 4782 /// [C++] parameter-list '...' 4783 /// 4784 /// parameter-list: [C99 6.7.5] 4785 /// parameter-declaration 4786 /// parameter-list ',' parameter-declaration 4787 /// 4788 /// parameter-declaration: [C99 6.7.5] 4789 /// declaration-specifiers declarator 4790 /// [C++] declaration-specifiers declarator '=' assignment-expression 4791 /// [C++11] initializer-clause 4792 /// [GNU] declaration-specifiers declarator attributes 4793 /// declaration-specifiers abstract-declarator[opt] 4794 /// [C++] declaration-specifiers abstract-declarator[opt] 4795 /// '=' assignment-expression 4796 /// [GNU] declaration-specifiers abstract-declarator[opt] attributes 4797 /// [C++11] attribute-specifier-seq parameter-declaration 4798 /// 4799 void Parser::ParseParameterDeclarationClause( 4800 Declarator &D, 4801 ParsedAttributes &FirstArgAttrs, 4802 SmallVector<DeclaratorChunk::ParamInfo, 16> &ParamInfo, 4803 SourceLocation &EllipsisLoc) { 4804 4805 while (1) { 4806 if (Tok.is(tok::ellipsis)) { 4807 // FIXME: Issue a diagnostic if we parsed an attribute-specifier-seq 4808 // before deciding this was a parameter-declaration-clause. 4809 EllipsisLoc = ConsumeToken(); // Consume the ellipsis. 4810 break; 4811 } 4812 4813 // Parse the declaration-specifiers. 4814 // Just use the ParsingDeclaration "scope" of the declarator. 4815 DeclSpec DS(AttrFactory); 4816 4817 // Parse any C++11 attributes. 4818 MaybeParseCXX0XAttributes(DS.getAttributes()); 4819 4820 // Skip any Microsoft attributes before a param. 4821 if (getLangOpts().MicrosoftExt && Tok.is(tok::l_square)) 4822 ParseMicrosoftAttributes(DS.getAttributes()); 4823 4824 SourceLocation DSStart = Tok.getLocation(); 4825 4826 // If the caller parsed attributes for the first argument, add them now. 4827 // Take them so that we only apply the attributes to the first parameter. 4828 // FIXME: If we can leave the attributes in the token stream somehow, we can 4829 // get rid of a parameter (FirstArgAttrs) and this statement. It might be 4830 // too much hassle. 4831 DS.takeAttributesFrom(FirstArgAttrs); 4832 4833 ParseDeclarationSpecifiers(DS); 4834 4835 // Parse the declarator. This is "PrototypeContext", because we must 4836 // accept either 'declarator' or 'abstract-declarator' here. 4837 Declarator ParmDecl(DS, Declarator::PrototypeContext); 4838 ParseDeclarator(ParmDecl); 4839 4840 // Parse GNU attributes, if present. 4841 MaybeParseGNUAttributes(ParmDecl); 4842 4843 // Remember this parsed parameter in ParamInfo. 4844 IdentifierInfo *ParmII = ParmDecl.getIdentifier(); 4845 4846 // DefArgToks is used when the parsing of default arguments needs 4847 // to be delayed. 4848 CachedTokens *DefArgToks = 0; 4849 4850 // If no parameter was specified, verify that *something* was specified, 4851 // otherwise we have a missing type and identifier. 4852 if (DS.isEmpty() && ParmDecl.getIdentifier() == 0 && 4853 ParmDecl.getNumTypeObjects() == 0) { 4854 // Completely missing, emit error. 4855 Diag(DSStart, diag::err_missing_param); 4856 } else { 4857 // Otherwise, we have something. Add it and let semantic analysis try 4858 // to grok it and add the result to the ParamInfo we are building. 4859 4860 // Inform the actions module about the parameter declarator, so it gets 4861 // added to the current scope. 4862 Decl *Param = Actions.ActOnParamDeclarator(getCurScope(), ParmDecl); 4863 4864 // Parse the default argument, if any. We parse the default 4865 // arguments in all dialects; the semantic analysis in 4866 // ActOnParamDefaultArgument will reject the default argument in 4867 // C. 4868 if (Tok.is(tok::equal)) { 4869 SourceLocation EqualLoc = Tok.getLocation(); 4870 4871 // Parse the default argument 4872 if (D.getContext() == Declarator::MemberContext) { 4873 // If we're inside a class definition, cache the tokens 4874 // corresponding to the default argument. We'll actually parse 4875 // them when we see the end of the class definition. 4876 // FIXME: Can we use a smart pointer for Toks? 4877 DefArgToks = new CachedTokens; 4878 4879 if (!ConsumeAndStoreUntil(tok::comma, tok::r_paren, *DefArgToks, 4880 /*StopAtSemi=*/true, 4881 /*ConsumeFinalToken=*/false)) { 4882 delete DefArgToks; 4883 DefArgToks = 0; 4884 Actions.ActOnParamDefaultArgumentError(Param); 4885 } else { 4886 // Mark the end of the default argument so that we know when to 4887 // stop when we parse it later on. 4888 Token DefArgEnd; 4889 DefArgEnd.startToken(); 4890 DefArgEnd.setKind(tok::cxx_defaultarg_end); 4891 DefArgEnd.setLocation(Tok.getLocation()); 4892 DefArgToks->push_back(DefArgEnd); 4893 Actions.ActOnParamUnparsedDefaultArgument(Param, EqualLoc, 4894 (*DefArgToks)[1].getLocation()); 4895 } 4896 } else { 4897 // Consume the '='. 4898 ConsumeToken(); 4899 4900 // The argument isn't actually potentially evaluated unless it is 4901 // used. 4902 EnterExpressionEvaluationContext Eval(Actions, 4903 Sema::PotentiallyEvaluatedIfUsed, 4904 Param); 4905 4906 ExprResult DefArgResult; 4907 if (getLangOpts().CPlusPlus0x && Tok.is(tok::l_brace)) { 4908 Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists); 4909 DefArgResult = ParseBraceInitializer(); 4910 } else 4911 DefArgResult = ParseAssignmentExpression(); 4912 if (DefArgResult.isInvalid()) { 4913 Actions.ActOnParamDefaultArgumentError(Param); 4914 SkipUntil(tok::comma, tok::r_paren, true, true); 4915 } else { 4916 // Inform the actions module about the default argument 4917 Actions.ActOnParamDefaultArgument(Param, EqualLoc, 4918 DefArgResult.take()); 4919 } 4920 } 4921 } 4922 4923 ParamInfo.push_back(DeclaratorChunk::ParamInfo(ParmII, 4924 ParmDecl.getIdentifierLoc(), Param, 4925 DefArgToks)); 4926 } 4927 4928 // If the next token is a comma, consume it and keep reading arguments. 4929 if (Tok.isNot(tok::comma)) { 4930 if (Tok.is(tok::ellipsis)) { 4931 EllipsisLoc = ConsumeToken(); // Consume the ellipsis. 4932 4933 if (!getLangOpts().CPlusPlus) { 4934 // We have ellipsis without a preceding ',', which is ill-formed 4935 // in C. Complain and provide the fix. 4936 Diag(EllipsisLoc, diag::err_missing_comma_before_ellipsis) 4937 << FixItHint::CreateInsertion(EllipsisLoc, ", "); 4938 } 4939 } 4940 4941 break; 4942 } 4943 4944 // Consume the comma. 4945 ConsumeToken(); 4946 } 4947 4948 } 4949 4950 /// [C90] direct-declarator '[' constant-expression[opt] ']' 4951 /// [C99] direct-declarator '[' type-qual-list[opt] assignment-expr[opt] ']' 4952 /// [C99] direct-declarator '[' 'static' type-qual-list[opt] assign-expr ']' 4953 /// [C99] direct-declarator '[' type-qual-list 'static' assignment-expr ']' 4954 /// [C99] direct-declarator '[' type-qual-list[opt] '*' ']' 4955 /// [C++11] direct-declarator '[' constant-expression[opt] ']' 4956 /// attribute-specifier-seq[opt] 4957 void Parser::ParseBracketDeclarator(Declarator &D) { 4958 if (CheckProhibitedCXX11Attribute()) 4959 return; 4960 4961 BalancedDelimiterTracker T(*this, tok::l_square); 4962 T.consumeOpen(); 4963 4964 // C array syntax has many features, but by-far the most common is [] and [4]. 4965 // This code does a fast path to handle some of the most obvious cases. 4966 if (Tok.getKind() == tok::r_square) { 4967 T.consumeClose(); 4968 ParsedAttributes attrs(AttrFactory); 4969 MaybeParseCXX0XAttributes(attrs); 4970 4971 // Remember that we parsed the empty array type. 4972 ExprResult NumElements; 4973 D.AddTypeInfo(DeclaratorChunk::getArray(0, false, false, 0, 4974 T.getOpenLocation(), 4975 T.getCloseLocation()), 4976 attrs, T.getCloseLocation()); 4977 return; 4978 } else if (Tok.getKind() == tok::numeric_constant && 4979 GetLookAheadToken(1).is(tok::r_square)) { 4980 // [4] is very common. Parse the numeric constant expression. 4981 ExprResult ExprRes(Actions.ActOnNumericConstant(Tok, getCurScope())); 4982 ConsumeToken(); 4983 4984 T.consumeClose(); 4985 ParsedAttributes attrs(AttrFactory); 4986 MaybeParseCXX0XAttributes(attrs); 4987 4988 // Remember that we parsed a array type, and remember its features. 4989 D.AddTypeInfo(DeclaratorChunk::getArray(0, false, 0, 4990 ExprRes.release(), 4991 T.getOpenLocation(), 4992 T.getCloseLocation()), 4993 attrs, T.getCloseLocation()); 4994 return; 4995 } 4996 4997 // If valid, this location is the position where we read the 'static' keyword. 4998 SourceLocation StaticLoc; 4999 if (Tok.is(tok::kw_static)) 5000 StaticLoc = ConsumeToken(); 5001 5002 // If there is a type-qualifier-list, read it now. 5003 // Type qualifiers in an array subscript are a C99 feature. 5004 DeclSpec DS(AttrFactory); 5005 ParseTypeQualifierListOpt(DS, false /*no attributes*/); 5006 5007 // If we haven't already read 'static', check to see if there is one after the 5008 // type-qualifier-list. 5009 if (!StaticLoc.isValid() && Tok.is(tok::kw_static)) 5010 StaticLoc = ConsumeToken(); 5011 5012 // Handle "direct-declarator [ type-qual-list[opt] * ]". 5013 bool isStar = false; 5014 ExprResult NumElements; 5015 5016 // Handle the case where we have '[*]' as the array size. However, a leading 5017 // star could be the start of an expression, for example 'X[*p + 4]'. Verify 5018 // the token after the star is a ']'. Since stars in arrays are 5019 // infrequent, use of lookahead is not costly here. 5020 if (Tok.is(tok::star) && GetLookAheadToken(1).is(tok::r_square)) { 5021 ConsumeToken(); // Eat the '*'. 5022 5023 if (StaticLoc.isValid()) { 5024 Diag(StaticLoc, diag::err_unspecified_vla_size_with_static); 5025 StaticLoc = SourceLocation(); // Drop the static. 5026 } 5027 isStar = true; 5028 } else if (Tok.isNot(tok::r_square)) { 5029 // Note, in C89, this production uses the constant-expr production instead 5030 // of assignment-expr. The only difference is that assignment-expr allows 5031 // things like '=' and '*='. Sema rejects these in C89 mode because they 5032 // are not i-c-e's, so we don't need to distinguish between the two here. 5033 5034 // Parse the constant-expression or assignment-expression now (depending 5035 // on dialect). 5036 if (getLangOpts().CPlusPlus) { 5037 NumElements = ParseConstantExpression(); 5038 } else { 5039 EnterExpressionEvaluationContext Unevaluated(Actions, 5040 Sema::ConstantEvaluated); 5041 NumElements = ParseAssignmentExpression(); 5042 } 5043 } 5044 5045 // If there was an error parsing the assignment-expression, recover. 5046 if (NumElements.isInvalid()) { 5047 D.setInvalidType(true); 5048 // If the expression was invalid, skip it. 5049 SkipUntil(tok::r_square); 5050 return; 5051 } 5052 5053 T.consumeClose(); 5054 5055 ParsedAttributes attrs(AttrFactory); 5056 MaybeParseCXX0XAttributes(attrs); 5057 5058 // Remember that we parsed a array type, and remember its features. 5059 D.AddTypeInfo(DeclaratorChunk::getArray(DS.getTypeQualifiers(), 5060 StaticLoc.isValid(), isStar, 5061 NumElements.release(), 5062 T.getOpenLocation(), 5063 T.getCloseLocation()), 5064 attrs, T.getCloseLocation()); 5065 } 5066 5067 /// [GNU] typeof-specifier: 5068 /// typeof ( expressions ) 5069 /// typeof ( type-name ) 5070 /// [GNU/C++] typeof unary-expression 5071 /// 5072 void Parser::ParseTypeofSpecifier(DeclSpec &DS) { 5073 assert(Tok.is(tok::kw_typeof) && "Not a typeof specifier"); 5074 Token OpTok = Tok; 5075 SourceLocation StartLoc = ConsumeToken(); 5076 5077 const bool hasParens = Tok.is(tok::l_paren); 5078 5079 EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated); 5080 5081 bool isCastExpr; 5082 ParsedType CastTy; 5083 SourceRange CastRange; 5084 ExprResult Operand = ParseExprAfterUnaryExprOrTypeTrait(OpTok, isCastExpr, 5085 CastTy, CastRange); 5086 if (hasParens) 5087 DS.setTypeofParensRange(CastRange); 5088 5089 if (CastRange.getEnd().isInvalid()) 5090 // FIXME: Not accurate, the range gets one token more than it should. 5091 DS.SetRangeEnd(Tok.getLocation()); 5092 else 5093 DS.SetRangeEnd(CastRange.getEnd()); 5094 5095 if (isCastExpr) { 5096 if (!CastTy) { 5097 DS.SetTypeSpecError(); 5098 return; 5099 } 5100 5101 const char *PrevSpec = 0; 5102 unsigned DiagID; 5103 // Check for duplicate type specifiers (e.g. "int typeof(int)"). 5104 if (DS.SetTypeSpecType(DeclSpec::TST_typeofType, StartLoc, PrevSpec, 5105 DiagID, CastTy)) 5106 Diag(StartLoc, DiagID) << PrevSpec; 5107 return; 5108 } 5109 5110 // If we get here, the operand to the typeof was an expresion. 5111 if (Operand.isInvalid()) { 5112 DS.SetTypeSpecError(); 5113 return; 5114 } 5115 5116 // We might need to transform the operand if it is potentially evaluated. 5117 Operand = Actions.HandleExprEvaluationContextForTypeof(Operand.get()); 5118 if (Operand.isInvalid()) { 5119 DS.SetTypeSpecError(); 5120 return; 5121 } 5122 5123 const char *PrevSpec = 0; 5124 unsigned DiagID; 5125 // Check for duplicate type specifiers (e.g. "int typeof(int)"). 5126 if (DS.SetTypeSpecType(DeclSpec::TST_typeofExpr, StartLoc, PrevSpec, 5127 DiagID, Operand.get())) 5128 Diag(StartLoc, DiagID) << PrevSpec; 5129 } 5130 5131 /// [C11] atomic-specifier: 5132 /// _Atomic ( type-name ) 5133 /// 5134 void Parser::ParseAtomicSpecifier(DeclSpec &DS) { 5135 assert(Tok.is(tok::kw__Atomic) && "Not an atomic specifier"); 5136 5137 SourceLocation StartLoc = ConsumeToken(); 5138 BalancedDelimiterTracker T(*this, tok::l_paren); 5139 if (T.expectAndConsume(diag::err_expected_lparen_after, "_Atomic")) { 5140 SkipUntil(tok::r_paren); 5141 return; 5142 } 5143 5144 TypeResult Result = ParseTypeName(); 5145 if (Result.isInvalid()) { 5146 SkipUntil(tok::r_paren); 5147 return; 5148 } 5149 5150 // Match the ')' 5151 T.consumeClose(); 5152 5153 if (T.getCloseLocation().isInvalid()) 5154 return; 5155 5156 DS.setTypeofParensRange(T.getRange()); 5157 DS.SetRangeEnd(T.getCloseLocation()); 5158 5159 const char *PrevSpec = 0; 5160 unsigned DiagID; 5161 if (DS.SetTypeSpecType(DeclSpec::TST_atomic, StartLoc, PrevSpec, 5162 DiagID, Result.release())) 5163 Diag(StartLoc, DiagID) << PrevSpec; 5164 } 5165 5166 5167 /// TryAltiVecVectorTokenOutOfLine - Out of line body that should only be called 5168 /// from TryAltiVecVectorToken. 5169 bool Parser::TryAltiVecVectorTokenOutOfLine() { 5170 Token Next = NextToken(); 5171 switch (Next.getKind()) { 5172 default: return false; 5173 case tok::kw_short: 5174 case tok::kw_long: 5175 case tok::kw_signed: 5176 case tok::kw_unsigned: 5177 case tok::kw_void: 5178 case tok::kw_char: 5179 case tok::kw_int: 5180 case tok::kw_float: 5181 case tok::kw_double: 5182 case tok::kw_bool: 5183 case tok::kw___pixel: 5184 Tok.setKind(tok::kw___vector); 5185 return true; 5186 case tok::identifier: 5187 if (Next.getIdentifierInfo() == Ident_pixel) { 5188 Tok.setKind(tok::kw___vector); 5189 return true; 5190 } 5191 return false; 5192 } 5193 } 5194 5195 bool Parser::TryAltiVecTokenOutOfLine(DeclSpec &DS, SourceLocation Loc, 5196 const char *&PrevSpec, unsigned &DiagID, 5197 bool &isInvalid) { 5198 if (Tok.getIdentifierInfo() == Ident_vector) { 5199 Token Next = NextToken(); 5200 switch (Next.getKind()) { 5201 case tok::kw_short: 5202 case tok::kw_long: 5203 case tok::kw_signed: 5204 case tok::kw_unsigned: 5205 case tok::kw_void: 5206 case tok::kw_char: 5207 case tok::kw_int: 5208 case tok::kw_float: 5209 case tok::kw_double: 5210 case tok::kw_bool: 5211 case tok::kw___pixel: 5212 isInvalid = DS.SetTypeAltiVecVector(true, Loc, PrevSpec, DiagID); 5213 return true; 5214 case tok::identifier: 5215 if (Next.getIdentifierInfo() == Ident_pixel) { 5216 isInvalid = DS.SetTypeAltiVecVector(true, Loc, PrevSpec, DiagID); 5217 return true; 5218 } 5219 break; 5220 default: 5221 break; 5222 } 5223 } else if ((Tok.getIdentifierInfo() == Ident_pixel) && 5224 DS.isTypeAltiVecVector()) { 5225 isInvalid = DS.SetTypeAltiVecPixel(true, Loc, PrevSpec, DiagID); 5226 return true; 5227 } 5228 return false; 5229 } 5230