1 //===--- ParseTentative.cpp - Ambiguity Resolution 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 tentative parsing portions of the Parser 11 // interfaces, for ambiguity resolution. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "clang/Parse/Parser.h" 16 #include "clang/Parse/ParseDiagnostic.h" 17 #include "clang/Sema/ParsedTemplate.h" 18 using namespace clang; 19 20 /// isCXXDeclarationStatement - C++-specialized function that disambiguates 21 /// between a declaration or an expression statement, when parsing function 22 /// bodies. Returns true for declaration, false for expression. 23 /// 24 /// declaration-statement: 25 /// block-declaration 26 /// 27 /// block-declaration: 28 /// simple-declaration 29 /// asm-definition 30 /// namespace-alias-definition 31 /// using-declaration 32 /// using-directive 33 /// [C++0x] static_assert-declaration 34 /// 35 /// asm-definition: 36 /// 'asm' '(' string-literal ')' ';' 37 /// 38 /// namespace-alias-definition: 39 /// 'namespace' identifier = qualified-namespace-specifier ';' 40 /// 41 /// using-declaration: 42 /// 'using' typename[opt] '::'[opt] nested-name-specifier 43 /// unqualified-id ';' 44 /// 'using' '::' unqualified-id ; 45 /// 46 /// using-directive: 47 /// 'using' 'namespace' '::'[opt] nested-name-specifier[opt] 48 /// namespace-name ';' 49 /// 50 bool Parser::isCXXDeclarationStatement() { 51 switch (Tok.getKind()) { 52 // asm-definition 53 case tok::kw_asm: 54 // namespace-alias-definition 55 case tok::kw_namespace: 56 // using-declaration 57 // using-directive 58 case tok::kw_using: 59 // static_assert-declaration 60 case tok::kw_static_assert: 61 case tok::kw__Static_assert: 62 return true; 63 // simple-declaration 64 default: 65 return isCXXSimpleDeclaration(/*AllowForRangeDecl=*/false); 66 } 67 } 68 69 /// isCXXSimpleDeclaration - C++-specialized function that disambiguates 70 /// between a simple-declaration or an expression-statement. 71 /// If during the disambiguation process a parsing error is encountered, 72 /// the function returns true to let the declaration parsing code handle it. 73 /// Returns false if the statement is disambiguated as expression. 74 /// 75 /// simple-declaration: 76 /// decl-specifier-seq init-declarator-list[opt] ';' 77 /// 78 /// (if AllowForRangeDecl specified) 79 /// for ( for-range-declaration : for-range-initializer ) statement 80 /// for-range-declaration: 81 /// attribute-specifier-seqopt type-specifier-seq declarator 82 bool Parser::isCXXSimpleDeclaration(bool AllowForRangeDecl) { 83 // C++ 6.8p1: 84 // There is an ambiguity in the grammar involving expression-statements and 85 // declarations: An expression-statement with a function-style explicit type 86 // conversion (5.2.3) as its leftmost subexpression can be indistinguishable 87 // from a declaration where the first declarator starts with a '('. In those 88 // cases the statement is a declaration. [Note: To disambiguate, the whole 89 // statement might have to be examined to determine if it is an 90 // expression-statement or a declaration]. 91 92 // C++ 6.8p3: 93 // The disambiguation is purely syntactic; that is, the meaning of the names 94 // occurring in such a statement, beyond whether they are type-names or not, 95 // is not generally used in or changed by the disambiguation. Class 96 // templates are instantiated as necessary to determine if a qualified name 97 // is a type-name. Disambiguation precedes parsing, and a statement 98 // disambiguated as a declaration may be an ill-formed declaration. 99 100 // We don't have to parse all of the decl-specifier-seq part. There's only 101 // an ambiguity if the first decl-specifier is 102 // simple-type-specifier/typename-specifier followed by a '(', which may 103 // indicate a function-style cast expression. 104 // isCXXDeclarationSpecifier will return TPResult::Ambiguous() only in such 105 // a case. 106 107 bool InvalidAsDeclaration = false; 108 TPResult TPR = isCXXDeclarationSpecifier(TPResult::False(), 109 &InvalidAsDeclaration); 110 if (TPR != TPResult::Ambiguous()) 111 return TPR != TPResult::False(); // Returns true for TPResult::True() or 112 // TPResult::Error(). 113 114 // FIXME: TryParseSimpleDeclaration doesn't look past the first initializer, 115 // and so gets some cases wrong. We can't carry on if we've already seen 116 // something which makes this statement invalid as a declaration in this case, 117 // since it can cause us to misparse valid code. Revisit this once 118 // TryParseInitDeclaratorList is fixed. 119 if (InvalidAsDeclaration) 120 return false; 121 122 // FIXME: Add statistics about the number of ambiguous statements encountered 123 // and how they were resolved (number of declarations+number of expressions). 124 125 // Ok, we have a simple-type-specifier/typename-specifier followed by a '(', 126 // or an identifier which doesn't resolve as anything. We need tentative 127 // parsing... 128 129 TentativeParsingAction PA(*this); 130 TPR = TryParseSimpleDeclaration(AllowForRangeDecl); 131 PA.Revert(); 132 133 // In case of an error, let the declaration parsing code handle it. 134 if (TPR == TPResult::Error()) 135 return true; 136 137 // Declarations take precedence over expressions. 138 if (TPR == TPResult::Ambiguous()) 139 TPR = TPResult::True(); 140 141 assert(TPR == TPResult::True() || TPR == TPResult::False()); 142 return TPR == TPResult::True(); 143 } 144 145 /// simple-declaration: 146 /// decl-specifier-seq init-declarator-list[opt] ';' 147 /// 148 /// (if AllowForRangeDecl specified) 149 /// for ( for-range-declaration : for-range-initializer ) statement 150 /// for-range-declaration: 151 /// attribute-specifier-seqopt type-specifier-seq declarator 152 /// 153 Parser::TPResult Parser::TryParseSimpleDeclaration(bool AllowForRangeDecl) { 154 if (Tok.is(tok::kw_typeof)) 155 TryParseTypeofSpecifier(); 156 else { 157 if (Tok.is(tok::annot_cxxscope)) 158 ConsumeToken(); 159 ConsumeToken(); 160 161 if (getLangOpts().ObjC1 && Tok.is(tok::less)) 162 TryParseProtocolQualifiers(); 163 } 164 165 // Two decl-specifiers in a row conclusively disambiguate this as being a 166 // simple-declaration. Don't bother calling isCXXDeclarationSpecifier in the 167 // overwhelmingly common case that the next token is a '('. 168 if (Tok.isNot(tok::l_paren)) { 169 TPResult TPR = isCXXDeclarationSpecifier(); 170 if (TPR == TPResult::Ambiguous()) 171 return TPResult::True(); 172 if (TPR == TPResult::True() || TPR == TPResult::Error()) 173 return TPR; 174 assert(TPR == TPResult::False()); 175 } 176 177 TPResult TPR = TryParseInitDeclaratorList(); 178 if (TPR != TPResult::Ambiguous()) 179 return TPR; 180 181 if (Tok.isNot(tok::semi) && (!AllowForRangeDecl || Tok.isNot(tok::colon))) 182 return TPResult::False(); 183 184 return TPResult::Ambiguous(); 185 } 186 187 /// init-declarator-list: 188 /// init-declarator 189 /// init-declarator-list ',' init-declarator 190 /// 191 /// init-declarator: 192 /// declarator initializer[opt] 193 /// [GNU] declarator simple-asm-expr[opt] attributes[opt] initializer[opt] 194 /// 195 /// initializer: 196 /// '=' initializer-clause 197 /// '(' expression-list ')' 198 /// 199 /// initializer-clause: 200 /// assignment-expression 201 /// '{' initializer-list ','[opt] '}' 202 /// '{' '}' 203 /// 204 Parser::TPResult Parser::TryParseInitDeclaratorList() { 205 while (1) { 206 // declarator 207 TPResult TPR = TryParseDeclarator(false/*mayBeAbstract*/); 208 if (TPR != TPResult::Ambiguous()) 209 return TPR; 210 211 // [GNU] simple-asm-expr[opt] attributes[opt] 212 if (Tok.is(tok::kw_asm) || Tok.is(tok::kw___attribute)) 213 return TPResult::True(); 214 215 // initializer[opt] 216 if (Tok.is(tok::l_paren)) { 217 // Parse through the parens. 218 ConsumeParen(); 219 if (!SkipUntil(tok::r_paren)) 220 return TPResult::Error(); 221 } else if (Tok.is(tok::equal) || isTokIdentifier_in()) { 222 // MSVC and g++ won't examine the rest of declarators if '=' is 223 // encountered; they just conclude that we have a declaration. 224 // EDG parses the initializer completely, which is the proper behavior 225 // for this case. 226 // 227 // At present, Clang follows MSVC and g++, since the parser does not have 228 // the ability to parse an expression fully without recording the 229 // results of that parse. 230 // Also allow 'in' after on objective-c declaration as in: 231 // for (int (^b)(void) in array). Ideally this should be done in the 232 // context of parsing for-init-statement of a foreach statement only. But, 233 // in any other context 'in' is invalid after a declaration and parser 234 // issues the error regardless of outcome of this decision. 235 // FIXME. Change if above assumption does not hold. 236 return TPResult::True(); 237 } 238 239 if (Tok.isNot(tok::comma)) 240 break; 241 ConsumeToken(); // the comma. 242 } 243 244 return TPResult::Ambiguous(); 245 } 246 247 /// isCXXConditionDeclaration - Disambiguates between a declaration or an 248 /// expression for a condition of a if/switch/while/for statement. 249 /// If during the disambiguation process a parsing error is encountered, 250 /// the function returns true to let the declaration parsing code handle it. 251 /// 252 /// condition: 253 /// expression 254 /// type-specifier-seq declarator '=' assignment-expression 255 /// [C++11] type-specifier-seq declarator '=' initializer-clause 256 /// [C++11] type-specifier-seq declarator braced-init-list 257 /// [GNU] type-specifier-seq declarator simple-asm-expr[opt] attributes[opt] 258 /// '=' assignment-expression 259 /// 260 bool Parser::isCXXConditionDeclaration() { 261 TPResult TPR = isCXXDeclarationSpecifier(); 262 if (TPR != TPResult::Ambiguous()) 263 return TPR != TPResult::False(); // Returns true for TPResult::True() or 264 // TPResult::Error(). 265 266 // FIXME: Add statistics about the number of ambiguous statements encountered 267 // and how they were resolved (number of declarations+number of expressions). 268 269 // Ok, we have a simple-type-specifier/typename-specifier followed by a '('. 270 // We need tentative parsing... 271 272 TentativeParsingAction PA(*this); 273 274 // type-specifier-seq 275 if (Tok.is(tok::kw_typeof)) 276 TryParseTypeofSpecifier(); 277 else { 278 ConsumeToken(); 279 280 if (getLangOpts().ObjC1 && Tok.is(tok::less)) 281 TryParseProtocolQualifiers(); 282 } 283 assert(Tok.is(tok::l_paren) && "Expected '('"); 284 285 // declarator 286 TPR = TryParseDeclarator(false/*mayBeAbstract*/); 287 288 // In case of an error, let the declaration parsing code handle it. 289 if (TPR == TPResult::Error()) 290 TPR = TPResult::True(); 291 292 if (TPR == TPResult::Ambiguous()) { 293 // '=' 294 // [GNU] simple-asm-expr[opt] attributes[opt] 295 if (Tok.is(tok::equal) || 296 Tok.is(tok::kw_asm) || Tok.is(tok::kw___attribute)) 297 TPR = TPResult::True(); 298 else if (getLangOpts().CPlusPlus0x && Tok.is(tok::l_brace)) 299 TPR = TPResult::True(); 300 else 301 TPR = TPResult::False(); 302 } 303 304 PA.Revert(); 305 306 assert(TPR == TPResult::True() || TPR == TPResult::False()); 307 return TPR == TPResult::True(); 308 } 309 310 /// \brief Determine whether the next set of tokens contains a type-id. 311 /// 312 /// The context parameter states what context we're parsing right 313 /// now, which affects how this routine copes with the token 314 /// following the type-id. If the context is TypeIdInParens, we have 315 /// already parsed the '(' and we will cease lookahead when we hit 316 /// the corresponding ')'. If the context is 317 /// TypeIdAsTemplateArgument, we've already parsed the '<' or ',' 318 /// before this template argument, and will cease lookahead when we 319 /// hit a '>', '>>' (in C++0x), or ','. Returns true for a type-id 320 /// and false for an expression. If during the disambiguation 321 /// process a parsing error is encountered, the function returns 322 /// true to let the declaration parsing code handle it. 323 /// 324 /// type-id: 325 /// type-specifier-seq abstract-declarator[opt] 326 /// 327 bool Parser::isCXXTypeId(TentativeCXXTypeIdContext Context, bool &isAmbiguous) { 328 329 isAmbiguous = false; 330 331 // C++ 8.2p2: 332 // The ambiguity arising from the similarity between a function-style cast and 333 // a type-id can occur in different contexts. The ambiguity appears as a 334 // choice between a function-style cast expression and a declaration of a 335 // type. The resolution is that any construct that could possibly be a type-id 336 // in its syntactic context shall be considered a type-id. 337 338 TPResult TPR = isCXXDeclarationSpecifier(); 339 if (TPR != TPResult::Ambiguous()) 340 return TPR != TPResult::False(); // Returns true for TPResult::True() or 341 // TPResult::Error(). 342 343 // FIXME: Add statistics about the number of ambiguous statements encountered 344 // and how they were resolved (number of declarations+number of expressions). 345 346 // Ok, we have a simple-type-specifier/typename-specifier followed by a '('. 347 // We need tentative parsing... 348 349 TentativeParsingAction PA(*this); 350 351 // type-specifier-seq 352 if (Tok.is(tok::kw_typeof)) 353 TryParseTypeofSpecifier(); 354 else { 355 ConsumeToken(); 356 357 if (getLangOpts().ObjC1 && Tok.is(tok::less)) 358 TryParseProtocolQualifiers(); 359 } 360 361 assert(Tok.is(tok::l_paren) && "Expected '('"); 362 363 // declarator 364 TPR = TryParseDeclarator(true/*mayBeAbstract*/, false/*mayHaveIdentifier*/); 365 366 // In case of an error, let the declaration parsing code handle it. 367 if (TPR == TPResult::Error()) 368 TPR = TPResult::True(); 369 370 if (TPR == TPResult::Ambiguous()) { 371 // We are supposed to be inside parens, so if after the abstract declarator 372 // we encounter a ')' this is a type-id, otherwise it's an expression. 373 if (Context == TypeIdInParens && Tok.is(tok::r_paren)) { 374 TPR = TPResult::True(); 375 isAmbiguous = true; 376 377 // We are supposed to be inside a template argument, so if after 378 // the abstract declarator we encounter a '>', '>>' (in C++0x), or 379 // ',', this is a type-id. Otherwise, it's an expression. 380 } else if (Context == TypeIdAsTemplateArgument && 381 (Tok.is(tok::greater) || Tok.is(tok::comma) || 382 (getLangOpts().CPlusPlus0x && Tok.is(tok::greatergreater)))) { 383 TPR = TPResult::True(); 384 isAmbiguous = true; 385 386 } else 387 TPR = TPResult::False(); 388 } 389 390 PA.Revert(); 391 392 assert(TPR == TPResult::True() || TPR == TPResult::False()); 393 return TPR == TPResult::True(); 394 } 395 396 /// \brief Returns true if this is a C++11 attribute-specifier. Per 397 /// C++11 [dcl.attr.grammar]p6, two consecutive left square bracket tokens 398 /// always introduce an attribute. In Objective-C++11, this rule does not 399 /// apply if either '[' begins a message-send. 400 /// 401 /// If Disambiguate is true, we try harder to determine whether a '[[' starts 402 /// an attribute-specifier, and return CAK_InvalidAttributeSpecifier if not. 403 /// 404 /// If OuterMightBeMessageSend is true, we assume the outer '[' is either an 405 /// Obj-C message send or the start of an attribute. Otherwise, we assume it 406 /// is not an Obj-C message send. 407 /// 408 /// C++11 [dcl.attr.grammar]: 409 /// 410 /// attribute-specifier: 411 /// '[' '[' attribute-list ']' ']' 412 /// alignment-specifier 413 /// 414 /// attribute-list: 415 /// attribute[opt] 416 /// attribute-list ',' attribute[opt] 417 /// attribute '...' 418 /// attribute-list ',' attribute '...' 419 /// 420 /// attribute: 421 /// attribute-token attribute-argument-clause[opt] 422 /// 423 /// attribute-token: 424 /// identifier 425 /// identifier '::' identifier 426 /// 427 /// attribute-argument-clause: 428 /// '(' balanced-token-seq ')' 429 Parser::CXX11AttributeKind 430 Parser::isCXX11AttributeSpecifier(bool Disambiguate, 431 bool OuterMightBeMessageSend) { 432 if (Tok.is(tok::kw_alignas)) 433 return CAK_AttributeSpecifier; 434 435 if (Tok.isNot(tok::l_square) || NextToken().isNot(tok::l_square)) 436 return CAK_NotAttributeSpecifier; 437 438 // No tentative parsing if we don't need to look for ']]' or a lambda. 439 if (!Disambiguate && !getLangOpts().ObjC1) 440 return CAK_AttributeSpecifier; 441 442 TentativeParsingAction PA(*this); 443 444 // Opening brackets were checked for above. 445 ConsumeBracket(); 446 447 // Outside Obj-C++11, treat anything with a matching ']]' as an attribute. 448 if (!getLangOpts().ObjC1) { 449 ConsumeBracket(); 450 451 bool IsAttribute = SkipUntil(tok::r_square, false); 452 IsAttribute &= Tok.is(tok::r_square); 453 454 PA.Revert(); 455 456 return IsAttribute ? CAK_AttributeSpecifier : CAK_InvalidAttributeSpecifier; 457 } 458 459 // In Obj-C++11, we need to distinguish four situations: 460 // 1a) int x[[attr]]; C++11 attribute. 461 // 1b) [[attr]]; C++11 statement attribute. 462 // 2) int x[[obj](){ return 1; }()]; Lambda in array size/index. 463 // 3a) int x[[obj get]]; Message send in array size/index. 464 // 3b) [[Class alloc] init]; Message send in message send. 465 // 4) [[obj]{ return self; }() doStuff]; Lambda in message send. 466 // (1) is an attribute, (2) is ill-formed, and (3) and (4) are accepted. 467 468 // If we have a lambda-introducer, then this is definitely not a message send. 469 // FIXME: If this disambiguation is too slow, fold the tentative lambda parse 470 // into the tentative attribute parse below. 471 LambdaIntroducer Intro; 472 if (!TryParseLambdaIntroducer(Intro)) { 473 // A lambda cannot end with ']]', and an attribute must. 474 bool IsAttribute = Tok.is(tok::r_square); 475 476 PA.Revert(); 477 478 if (IsAttribute) 479 // Case 1: C++11 attribute. 480 return CAK_AttributeSpecifier; 481 482 if (OuterMightBeMessageSend) 483 // Case 4: Lambda in message send. 484 return CAK_NotAttributeSpecifier; 485 486 // Case 2: Lambda in array size / index. 487 return CAK_InvalidAttributeSpecifier; 488 } 489 490 ConsumeBracket(); 491 492 // If we don't have a lambda-introducer, then we have an attribute or a 493 // message-send. 494 bool IsAttribute = true; 495 while (Tok.isNot(tok::r_square)) { 496 if (Tok.is(tok::comma)) { 497 // Case 1: Stray commas can only occur in attributes. 498 PA.Revert(); 499 return CAK_AttributeSpecifier; 500 } 501 502 // Parse the attribute-token, if present. 503 // C++11 [dcl.attr.grammar]: 504 // If a keyword or an alternative token that satisfies the syntactic 505 // requirements of an identifier is contained in an attribute-token, 506 // it is considered an identifier. 507 SourceLocation Loc; 508 if (!TryParseCXX11AttributeIdentifier(Loc)) { 509 IsAttribute = false; 510 break; 511 } 512 if (Tok.is(tok::coloncolon)) { 513 ConsumeToken(); 514 if (!TryParseCXX11AttributeIdentifier(Loc)) { 515 IsAttribute = false; 516 break; 517 } 518 } 519 520 // Parse the attribute-argument-clause, if present. 521 if (Tok.is(tok::l_paren)) { 522 ConsumeParen(); 523 if (!SkipUntil(tok::r_paren, false)) { 524 IsAttribute = false; 525 break; 526 } 527 } 528 529 if (Tok.is(tok::ellipsis)) 530 ConsumeToken(); 531 532 if (Tok.isNot(tok::comma)) 533 break; 534 535 ConsumeToken(); 536 } 537 538 // An attribute must end ']]'. 539 if (IsAttribute) { 540 if (Tok.is(tok::r_square)) { 541 ConsumeBracket(); 542 IsAttribute = Tok.is(tok::r_square); 543 } else { 544 IsAttribute = false; 545 } 546 } 547 548 PA.Revert(); 549 550 if (IsAttribute) 551 // Case 1: C++11 statement attribute. 552 return CAK_AttributeSpecifier; 553 554 // Case 3: Message send. 555 return CAK_NotAttributeSpecifier; 556 } 557 558 /// declarator: 559 /// direct-declarator 560 /// ptr-operator declarator 561 /// 562 /// direct-declarator: 563 /// declarator-id 564 /// direct-declarator '(' parameter-declaration-clause ')' 565 /// cv-qualifier-seq[opt] exception-specification[opt] 566 /// direct-declarator '[' constant-expression[opt] ']' 567 /// '(' declarator ')' 568 /// [GNU] '(' attributes declarator ')' 569 /// 570 /// abstract-declarator: 571 /// ptr-operator abstract-declarator[opt] 572 /// direct-abstract-declarator 573 /// ... 574 /// 575 /// direct-abstract-declarator: 576 /// direct-abstract-declarator[opt] 577 /// '(' parameter-declaration-clause ')' cv-qualifier-seq[opt] 578 /// exception-specification[opt] 579 /// direct-abstract-declarator[opt] '[' constant-expression[opt] ']' 580 /// '(' abstract-declarator ')' 581 /// 582 /// ptr-operator: 583 /// '*' cv-qualifier-seq[opt] 584 /// '&' 585 /// [C++0x] '&&' [TODO] 586 /// '::'[opt] nested-name-specifier '*' cv-qualifier-seq[opt] 587 /// 588 /// cv-qualifier-seq: 589 /// cv-qualifier cv-qualifier-seq[opt] 590 /// 591 /// cv-qualifier: 592 /// 'const' 593 /// 'volatile' 594 /// 595 /// declarator-id: 596 /// '...'[opt] id-expression 597 /// 598 /// id-expression: 599 /// unqualified-id 600 /// qualified-id [TODO] 601 /// 602 /// unqualified-id: 603 /// identifier 604 /// operator-function-id [TODO] 605 /// conversion-function-id [TODO] 606 /// '~' class-name [TODO] 607 /// template-id [TODO] 608 /// 609 Parser::TPResult Parser::TryParseDeclarator(bool mayBeAbstract, 610 bool mayHaveIdentifier) { 611 // declarator: 612 // direct-declarator 613 // ptr-operator declarator 614 615 while (1) { 616 if (Tok.is(tok::coloncolon) || Tok.is(tok::identifier)) 617 if (TryAnnotateCXXScopeToken(true)) 618 return TPResult::Error(); 619 620 if (Tok.is(tok::star) || Tok.is(tok::amp) || Tok.is(tok::caret) || 621 Tok.is(tok::ampamp) || 622 (Tok.is(tok::annot_cxxscope) && NextToken().is(tok::star))) { 623 // ptr-operator 624 ConsumeToken(); 625 while (Tok.is(tok::kw_const) || 626 Tok.is(tok::kw_volatile) || 627 Tok.is(tok::kw_restrict)) 628 ConsumeToken(); 629 } else { 630 break; 631 } 632 } 633 634 // direct-declarator: 635 // direct-abstract-declarator: 636 if (Tok.is(tok::ellipsis)) 637 ConsumeToken(); 638 639 if ((Tok.is(tok::identifier) || 640 (Tok.is(tok::annot_cxxscope) && NextToken().is(tok::identifier))) && 641 mayHaveIdentifier) { 642 // declarator-id 643 if (Tok.is(tok::annot_cxxscope)) 644 ConsumeToken(); 645 else 646 TentativelyDeclaredIdentifiers.push_back(Tok.getIdentifierInfo()); 647 ConsumeToken(); 648 } else if (Tok.is(tok::l_paren)) { 649 ConsumeParen(); 650 if (mayBeAbstract && 651 (Tok.is(tok::r_paren) || // 'int()' is a function. 652 // 'int(...)' is a function. 653 (Tok.is(tok::ellipsis) && NextToken().is(tok::r_paren)) || 654 isDeclarationSpecifier())) { // 'int(int)' is a function. 655 // '(' parameter-declaration-clause ')' cv-qualifier-seq[opt] 656 // exception-specification[opt] 657 TPResult TPR = TryParseFunctionDeclarator(); 658 if (TPR != TPResult::Ambiguous()) 659 return TPR; 660 } else { 661 // '(' declarator ')' 662 // '(' attributes declarator ')' 663 // '(' abstract-declarator ')' 664 if (Tok.is(tok::kw___attribute) || 665 Tok.is(tok::kw___declspec) || 666 Tok.is(tok::kw___cdecl) || 667 Tok.is(tok::kw___stdcall) || 668 Tok.is(tok::kw___fastcall) || 669 Tok.is(tok::kw___thiscall) || 670 Tok.is(tok::kw___unaligned)) 671 return TPResult::True(); // attributes indicate declaration 672 TPResult TPR = TryParseDeclarator(mayBeAbstract, mayHaveIdentifier); 673 if (TPR != TPResult::Ambiguous()) 674 return TPR; 675 if (Tok.isNot(tok::r_paren)) 676 return TPResult::False(); 677 ConsumeParen(); 678 } 679 } else if (!mayBeAbstract) { 680 return TPResult::False(); 681 } 682 683 while (1) { 684 TPResult TPR(TPResult::Ambiguous()); 685 686 // abstract-declarator: ... 687 if (Tok.is(tok::ellipsis)) 688 ConsumeToken(); 689 690 if (Tok.is(tok::l_paren)) { 691 // Check whether we have a function declarator or a possible ctor-style 692 // initializer that follows the declarator. Note that ctor-style 693 // initializers are not possible in contexts where abstract declarators 694 // are allowed. 695 if (!mayBeAbstract && !isCXXFunctionDeclarator()) 696 break; 697 698 // direct-declarator '(' parameter-declaration-clause ')' 699 // cv-qualifier-seq[opt] exception-specification[opt] 700 ConsumeParen(); 701 TPR = TryParseFunctionDeclarator(); 702 } else if (Tok.is(tok::l_square)) { 703 // direct-declarator '[' constant-expression[opt] ']' 704 // direct-abstract-declarator[opt] '[' constant-expression[opt] ']' 705 TPR = TryParseBracketDeclarator(); 706 } else { 707 break; 708 } 709 710 if (TPR != TPResult::Ambiguous()) 711 return TPR; 712 } 713 714 return TPResult::Ambiguous(); 715 } 716 717 Parser::TPResult 718 Parser::isExpressionOrTypeSpecifierSimple(tok::TokenKind Kind) { 719 switch (Kind) { 720 // Obviously starts an expression. 721 case tok::numeric_constant: 722 case tok::char_constant: 723 case tok::wide_char_constant: 724 case tok::utf16_char_constant: 725 case tok::utf32_char_constant: 726 case tok::string_literal: 727 case tok::wide_string_literal: 728 case tok::utf8_string_literal: 729 case tok::utf16_string_literal: 730 case tok::utf32_string_literal: 731 case tok::l_square: 732 case tok::l_paren: 733 case tok::amp: 734 case tok::ampamp: 735 case tok::star: 736 case tok::plus: 737 case tok::plusplus: 738 case tok::minus: 739 case tok::minusminus: 740 case tok::tilde: 741 case tok::exclaim: 742 case tok::kw_sizeof: 743 case tok::kw___func__: 744 case tok::kw_const_cast: 745 case tok::kw_delete: 746 case tok::kw_dynamic_cast: 747 case tok::kw_false: 748 case tok::kw_new: 749 case tok::kw_operator: 750 case tok::kw_reinterpret_cast: 751 case tok::kw_static_cast: 752 case tok::kw_this: 753 case tok::kw_throw: 754 case tok::kw_true: 755 case tok::kw_typeid: 756 case tok::kw_alignof: 757 case tok::kw_noexcept: 758 case tok::kw_nullptr: 759 case tok::kw__Alignof: 760 case tok::kw___null: 761 case tok::kw___alignof: 762 case tok::kw___builtin_choose_expr: 763 case tok::kw___builtin_offsetof: 764 case tok::kw___builtin_types_compatible_p: 765 case tok::kw___builtin_va_arg: 766 case tok::kw___imag: 767 case tok::kw___real: 768 case tok::kw___FUNCTION__: 769 case tok::kw_L__FUNCTION__: 770 case tok::kw___PRETTY_FUNCTION__: 771 case tok::kw___has_nothrow_assign: 772 case tok::kw___has_nothrow_copy: 773 case tok::kw___has_nothrow_constructor: 774 case tok::kw___has_trivial_assign: 775 case tok::kw___has_trivial_copy: 776 case tok::kw___has_trivial_constructor: 777 case tok::kw___has_trivial_destructor: 778 case tok::kw___has_virtual_destructor: 779 case tok::kw___is_abstract: 780 case tok::kw___is_base_of: 781 case tok::kw___is_class: 782 case tok::kw___is_convertible_to: 783 case tok::kw___is_empty: 784 case tok::kw___is_enum: 785 case tok::kw___is_final: 786 case tok::kw___is_literal: 787 case tok::kw___is_literal_type: 788 case tok::kw___is_pod: 789 case tok::kw___is_polymorphic: 790 case tok::kw___is_trivial: 791 case tok::kw___is_trivially_assignable: 792 case tok::kw___is_trivially_constructible: 793 case tok::kw___is_trivially_copyable: 794 case tok::kw___is_union: 795 case tok::kw___uuidof: 796 return TPResult::True(); 797 798 // Obviously starts a type-specifier-seq: 799 case tok::kw_char: 800 case tok::kw_const: 801 case tok::kw_double: 802 case tok::kw_enum: 803 case tok::kw_half: 804 case tok::kw_float: 805 case tok::kw_int: 806 case tok::kw_long: 807 case tok::kw___int64: 808 case tok::kw___int128: 809 case tok::kw_restrict: 810 case tok::kw_short: 811 case tok::kw_signed: 812 case tok::kw_struct: 813 case tok::kw_union: 814 case tok::kw_unsigned: 815 case tok::kw_void: 816 case tok::kw_volatile: 817 case tok::kw__Bool: 818 case tok::kw__Complex: 819 case tok::kw_class: 820 case tok::kw_typename: 821 case tok::kw_wchar_t: 822 case tok::kw_char16_t: 823 case tok::kw_char32_t: 824 case tok::kw___underlying_type: 825 case tok::kw_thread_local: 826 case tok::kw__Decimal32: 827 case tok::kw__Decimal64: 828 case tok::kw__Decimal128: 829 case tok::kw___thread: 830 case tok::kw_typeof: 831 case tok::kw___cdecl: 832 case tok::kw___stdcall: 833 case tok::kw___fastcall: 834 case tok::kw___thiscall: 835 case tok::kw___unaligned: 836 case tok::kw___vector: 837 case tok::kw___pixel: 838 case tok::kw__Atomic: 839 return TPResult::False(); 840 841 default: 842 break; 843 } 844 845 return TPResult::Ambiguous(); 846 } 847 848 bool Parser::isTentativelyDeclared(IdentifierInfo *II) { 849 return std::find(TentativelyDeclaredIdentifiers.begin(), 850 TentativelyDeclaredIdentifiers.end(), II) 851 != TentativelyDeclaredIdentifiers.end(); 852 } 853 854 /// isCXXDeclarationSpecifier - Returns TPResult::True() if it is a declaration 855 /// specifier, TPResult::False() if it is not, TPResult::Ambiguous() if it could 856 /// be either a decl-specifier or a function-style cast, and TPResult::Error() 857 /// if a parsing error was found and reported. 858 /// 859 /// If HasMissingTypename is provided, a name with a dependent scope specifier 860 /// will be treated as ambiguous if the 'typename' keyword is missing. If this 861 /// happens, *HasMissingTypename will be set to 'true'. This will also be used 862 /// as an indicator that undeclared identifiers (which will trigger a later 863 /// parse error) should be treated as types. Returns TPResult::Ambiguous() in 864 /// such cases. 865 /// 866 /// decl-specifier: 867 /// storage-class-specifier 868 /// type-specifier 869 /// function-specifier 870 /// 'friend' 871 /// 'typedef' 872 /// [C++0x] 'constexpr' 873 /// [GNU] attributes declaration-specifiers[opt] 874 /// 875 /// storage-class-specifier: 876 /// 'register' 877 /// 'static' 878 /// 'extern' 879 /// 'mutable' 880 /// 'auto' 881 /// [GNU] '__thread' 882 /// 883 /// function-specifier: 884 /// 'inline' 885 /// 'virtual' 886 /// 'explicit' 887 /// 888 /// typedef-name: 889 /// identifier 890 /// 891 /// type-specifier: 892 /// simple-type-specifier 893 /// class-specifier 894 /// enum-specifier 895 /// elaborated-type-specifier 896 /// typename-specifier 897 /// cv-qualifier 898 /// 899 /// simple-type-specifier: 900 /// '::'[opt] nested-name-specifier[opt] type-name 901 /// '::'[opt] nested-name-specifier 'template' 902 /// simple-template-id [TODO] 903 /// 'char' 904 /// 'wchar_t' 905 /// 'bool' 906 /// 'short' 907 /// 'int' 908 /// 'long' 909 /// 'signed' 910 /// 'unsigned' 911 /// 'float' 912 /// 'double' 913 /// 'void' 914 /// [GNU] typeof-specifier 915 /// [GNU] '_Complex' 916 /// [C++0x] 'auto' [TODO] 917 /// [C++0x] 'decltype' ( expression ) 918 /// 919 /// type-name: 920 /// class-name 921 /// enum-name 922 /// typedef-name 923 /// 924 /// elaborated-type-specifier: 925 /// class-key '::'[opt] nested-name-specifier[opt] identifier 926 /// class-key '::'[opt] nested-name-specifier[opt] 'template'[opt] 927 /// simple-template-id 928 /// 'enum' '::'[opt] nested-name-specifier[opt] identifier 929 /// 930 /// enum-name: 931 /// identifier 932 /// 933 /// enum-specifier: 934 /// 'enum' identifier[opt] '{' enumerator-list[opt] '}' 935 /// 'enum' identifier[opt] '{' enumerator-list ',' '}' 936 /// 937 /// class-specifier: 938 /// class-head '{' member-specification[opt] '}' 939 /// 940 /// class-head: 941 /// class-key identifier[opt] base-clause[opt] 942 /// class-key nested-name-specifier identifier base-clause[opt] 943 /// class-key nested-name-specifier[opt] simple-template-id 944 /// base-clause[opt] 945 /// 946 /// class-key: 947 /// 'class' 948 /// 'struct' 949 /// 'union' 950 /// 951 /// cv-qualifier: 952 /// 'const' 953 /// 'volatile' 954 /// [GNU] restrict 955 /// 956 Parser::TPResult 957 Parser::isCXXDeclarationSpecifier(Parser::TPResult BracedCastResult, 958 bool *HasMissingTypename) { 959 switch (Tok.getKind()) { 960 case tok::identifier: { 961 // Check for need to substitute AltiVec __vector keyword 962 // for "vector" identifier. 963 if (TryAltiVecVectorToken()) 964 return TPResult::True(); 965 966 const Token &Next = NextToken(); 967 // In 'foo bar', 'foo' is always a type name outside of Objective-C. 968 if (!getLangOpts().ObjC1 && Next.is(tok::identifier)) 969 return TPResult::True(); 970 971 if (Next.isNot(tok::coloncolon) && Next.isNot(tok::less)) { 972 // Determine whether this is a valid expression. If not, we will hit 973 // a parse error one way or another. In that case, tell the caller that 974 // this is ambiguous. Typo-correct to type and expression keywords and 975 // to types and identifiers, in order to try to recover from errors. 976 CorrectionCandidateCallback TypoCorrection; 977 TypoCorrection.WantRemainingKeywords = false; 978 switch (TryAnnotateName(false /* no nested name specifier */, 979 &TypoCorrection)) { 980 case ANK_Error: 981 return TPResult::Error(); 982 case ANK_TentativeDecl: 983 return TPResult::False(); 984 case ANK_TemplateName: 985 // A bare type template-name which can't be a template template 986 // argument is an error, and was probably intended to be a type. 987 return GreaterThanIsOperator ? TPResult::True() : TPResult::False(); 988 case ANK_Unresolved: 989 return HasMissingTypename ? TPResult::Ambiguous() : TPResult::False(); 990 case ANK_Success: 991 break; 992 } 993 assert(Tok.isNot(tok::identifier) && 994 "TryAnnotateName succeeded without producing an annotation"); 995 } else { 996 // This might possibly be a type with a dependent scope specifier and 997 // a missing 'typename' keyword. Don't use TryAnnotateName in this case, 998 // since it will annotate as a primary expression, and we want to use the 999 // "missing 'typename'" logic. 1000 if (TryAnnotateTypeOrScopeToken()) 1001 return TPResult::Error(); 1002 // If annotation failed, assume it's a non-type. 1003 // FIXME: If this happens due to an undeclared identifier, treat it as 1004 // ambiguous. 1005 if (Tok.is(tok::identifier)) 1006 return TPResult::False(); 1007 } 1008 1009 // We annotated this token as something. Recurse to handle whatever we got. 1010 return isCXXDeclarationSpecifier(BracedCastResult, HasMissingTypename); 1011 } 1012 1013 case tok::kw_typename: // typename T::type 1014 // Annotate typenames and C++ scope specifiers. If we get one, just 1015 // recurse to handle whatever we get. 1016 if (TryAnnotateTypeOrScopeToken()) 1017 return TPResult::Error(); 1018 return isCXXDeclarationSpecifier(BracedCastResult, HasMissingTypename); 1019 1020 case tok::coloncolon: { // ::foo::bar 1021 const Token &Next = NextToken(); 1022 if (Next.is(tok::kw_new) || // ::new 1023 Next.is(tok::kw_delete)) // ::delete 1024 return TPResult::False(); 1025 } 1026 // Fall through. 1027 case tok::kw_decltype: 1028 // Annotate typenames and C++ scope specifiers. If we get one, just 1029 // recurse to handle whatever we get. 1030 if (TryAnnotateTypeOrScopeToken()) 1031 return TPResult::Error(); 1032 return isCXXDeclarationSpecifier(BracedCastResult, HasMissingTypename); 1033 1034 // decl-specifier: 1035 // storage-class-specifier 1036 // type-specifier 1037 // function-specifier 1038 // 'friend' 1039 // 'typedef' 1040 // 'constexpr' 1041 case tok::kw_friend: 1042 case tok::kw_typedef: 1043 case tok::kw_constexpr: 1044 // storage-class-specifier 1045 case tok::kw_register: 1046 case tok::kw_static: 1047 case tok::kw_extern: 1048 case tok::kw_mutable: 1049 case tok::kw_auto: 1050 case tok::kw___thread: 1051 // function-specifier 1052 case tok::kw_inline: 1053 case tok::kw_virtual: 1054 case tok::kw_explicit: 1055 1056 // Modules 1057 case tok::kw___module_private__: 1058 1059 // type-specifier: 1060 // simple-type-specifier 1061 // class-specifier 1062 // enum-specifier 1063 // elaborated-type-specifier 1064 // typename-specifier 1065 // cv-qualifier 1066 1067 // class-specifier 1068 // elaborated-type-specifier 1069 case tok::kw_class: 1070 case tok::kw_struct: 1071 case tok::kw_union: 1072 // enum-specifier 1073 case tok::kw_enum: 1074 // cv-qualifier 1075 case tok::kw_const: 1076 case tok::kw_volatile: 1077 1078 // GNU 1079 case tok::kw_restrict: 1080 case tok::kw__Complex: 1081 case tok::kw___attribute: 1082 return TPResult::True(); 1083 1084 // Microsoft 1085 case tok::kw___declspec: 1086 case tok::kw___cdecl: 1087 case tok::kw___stdcall: 1088 case tok::kw___fastcall: 1089 case tok::kw___thiscall: 1090 case tok::kw___w64: 1091 case tok::kw___ptr64: 1092 case tok::kw___ptr32: 1093 case tok::kw___forceinline: 1094 case tok::kw___unaligned: 1095 return TPResult::True(); 1096 1097 // Borland 1098 case tok::kw___pascal: 1099 return TPResult::True(); 1100 1101 // AltiVec 1102 case tok::kw___vector: 1103 return TPResult::True(); 1104 1105 case tok::annot_template_id: { 1106 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); 1107 if (TemplateId->Kind != TNK_Type_template) 1108 return TPResult::False(); 1109 CXXScopeSpec SS; 1110 AnnotateTemplateIdTokenAsType(); 1111 assert(Tok.is(tok::annot_typename)); 1112 goto case_typename; 1113 } 1114 1115 case tok::annot_cxxscope: // foo::bar or ::foo::bar, but already parsed 1116 // We've already annotated a scope; try to annotate a type. 1117 if (TryAnnotateTypeOrScopeToken()) 1118 return TPResult::Error(); 1119 if (!Tok.is(tok::annot_typename)) { 1120 // If the next token is an identifier or a type qualifier, then this 1121 // can't possibly be a valid expression either. 1122 if (Tok.is(tok::annot_cxxscope) && NextToken().is(tok::identifier)) { 1123 CXXScopeSpec SS; 1124 Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(), 1125 Tok.getAnnotationRange(), 1126 SS); 1127 if (SS.getScopeRep() && SS.getScopeRep()->isDependent()) { 1128 TentativeParsingAction PA(*this); 1129 ConsumeToken(); 1130 ConsumeToken(); 1131 bool isIdentifier = Tok.is(tok::identifier); 1132 TPResult TPR = TPResult::False(); 1133 if (!isIdentifier) 1134 TPR = isCXXDeclarationSpecifier(BracedCastResult, 1135 HasMissingTypename); 1136 PA.Revert(); 1137 1138 if (isIdentifier || 1139 TPR == TPResult::True() || TPR == TPResult::Error()) 1140 return TPResult::Error(); 1141 1142 if (HasMissingTypename) { 1143 // We can't tell whether this is a missing 'typename' or a valid 1144 // expression. 1145 *HasMissingTypename = true; 1146 return TPResult::Ambiguous(); 1147 } 1148 } else { 1149 // Try to resolve the name. If it doesn't exist, assume it was 1150 // intended to name a type and keep disambiguating. 1151 switch (TryAnnotateName(false /* SS is not dependent */)) { 1152 case ANK_Error: 1153 return TPResult::Error(); 1154 case ANK_TentativeDecl: 1155 return TPResult::False(); 1156 case ANK_TemplateName: 1157 // A bare type template-name which can't be a template template 1158 // argument is an error, and was probably intended to be a type. 1159 return GreaterThanIsOperator ? TPResult::True() : TPResult::False(); 1160 case ANK_Unresolved: 1161 return HasMissingTypename ? TPResult::Ambiguous() 1162 : TPResult::False(); 1163 case ANK_Success: 1164 // Annotated it, check again. 1165 assert(Tok.isNot(tok::annot_cxxscope) || 1166 NextToken().isNot(tok::identifier)); 1167 return isCXXDeclarationSpecifier(BracedCastResult, 1168 HasMissingTypename); 1169 } 1170 } 1171 } 1172 return TPResult::False(); 1173 } 1174 // If that succeeded, fallthrough into the generic simple-type-id case. 1175 1176 // The ambiguity resides in a simple-type-specifier/typename-specifier 1177 // followed by a '('. The '(' could either be the start of: 1178 // 1179 // direct-declarator: 1180 // '(' declarator ')' 1181 // 1182 // direct-abstract-declarator: 1183 // '(' parameter-declaration-clause ')' cv-qualifier-seq[opt] 1184 // exception-specification[opt] 1185 // '(' abstract-declarator ')' 1186 // 1187 // or part of a function-style cast expression: 1188 // 1189 // simple-type-specifier '(' expression-list[opt] ')' 1190 // 1191 1192 // simple-type-specifier: 1193 1194 case tok::annot_typename: 1195 case_typename: 1196 // In Objective-C, we might have a protocol-qualified type. 1197 if (getLangOpts().ObjC1 && NextToken().is(tok::less)) { 1198 // Tentatively parse the 1199 TentativeParsingAction PA(*this); 1200 ConsumeToken(); // The type token 1201 1202 TPResult TPR = TryParseProtocolQualifiers(); 1203 bool isFollowedByParen = Tok.is(tok::l_paren); 1204 bool isFollowedByBrace = Tok.is(tok::l_brace); 1205 1206 PA.Revert(); 1207 1208 if (TPR == TPResult::Error()) 1209 return TPResult::Error(); 1210 1211 if (isFollowedByParen) 1212 return TPResult::Ambiguous(); 1213 1214 if (getLangOpts().CPlusPlus0x && isFollowedByBrace) 1215 return BracedCastResult; 1216 1217 return TPResult::True(); 1218 } 1219 1220 case tok::kw_char: 1221 case tok::kw_wchar_t: 1222 case tok::kw_char16_t: 1223 case tok::kw_char32_t: 1224 case tok::kw_bool: 1225 case tok::kw_short: 1226 case tok::kw_int: 1227 case tok::kw_long: 1228 case tok::kw___int64: 1229 case tok::kw___int128: 1230 case tok::kw_signed: 1231 case tok::kw_unsigned: 1232 case tok::kw_half: 1233 case tok::kw_float: 1234 case tok::kw_double: 1235 case tok::kw_void: 1236 case tok::annot_decltype: 1237 if (NextToken().is(tok::l_paren)) 1238 return TPResult::Ambiguous(); 1239 1240 // This is a function-style cast in all cases we disambiguate other than 1241 // one: 1242 // struct S { 1243 // enum E : int { a = 4 }; // enum 1244 // enum E : int { 4 }; // bit-field 1245 // }; 1246 if (getLangOpts().CPlusPlus0x && NextToken().is(tok::l_brace)) 1247 return BracedCastResult; 1248 1249 if (isStartOfObjCClassMessageMissingOpenBracket()) 1250 return TPResult::False(); 1251 1252 return TPResult::True(); 1253 1254 // GNU typeof support. 1255 case tok::kw_typeof: { 1256 if (NextToken().isNot(tok::l_paren)) 1257 return TPResult::True(); 1258 1259 TentativeParsingAction PA(*this); 1260 1261 TPResult TPR = TryParseTypeofSpecifier(); 1262 bool isFollowedByParen = Tok.is(tok::l_paren); 1263 bool isFollowedByBrace = Tok.is(tok::l_brace); 1264 1265 PA.Revert(); 1266 1267 if (TPR == TPResult::Error()) 1268 return TPResult::Error(); 1269 1270 if (isFollowedByParen) 1271 return TPResult::Ambiguous(); 1272 1273 if (getLangOpts().CPlusPlus0x && isFollowedByBrace) 1274 return BracedCastResult; 1275 1276 return TPResult::True(); 1277 } 1278 1279 // C++0x type traits support 1280 case tok::kw___underlying_type: 1281 return TPResult::True(); 1282 1283 // C11 _Atomic 1284 case tok::kw__Atomic: 1285 return TPResult::True(); 1286 1287 default: 1288 return TPResult::False(); 1289 } 1290 } 1291 1292 /// [GNU] typeof-specifier: 1293 /// 'typeof' '(' expressions ')' 1294 /// 'typeof' '(' type-name ')' 1295 /// 1296 Parser::TPResult Parser::TryParseTypeofSpecifier() { 1297 assert(Tok.is(tok::kw_typeof) && "Expected 'typeof'!"); 1298 ConsumeToken(); 1299 1300 assert(Tok.is(tok::l_paren) && "Expected '('"); 1301 // Parse through the parens after 'typeof'. 1302 ConsumeParen(); 1303 if (!SkipUntil(tok::r_paren)) 1304 return TPResult::Error(); 1305 1306 return TPResult::Ambiguous(); 1307 } 1308 1309 /// [ObjC] protocol-qualifiers: 1310 //// '<' identifier-list '>' 1311 Parser::TPResult Parser::TryParseProtocolQualifiers() { 1312 assert(Tok.is(tok::less) && "Expected '<' for qualifier list"); 1313 ConsumeToken(); 1314 do { 1315 if (Tok.isNot(tok::identifier)) 1316 return TPResult::Error(); 1317 ConsumeToken(); 1318 1319 if (Tok.is(tok::comma)) { 1320 ConsumeToken(); 1321 continue; 1322 } 1323 1324 if (Tok.is(tok::greater)) { 1325 ConsumeToken(); 1326 return TPResult::Ambiguous(); 1327 } 1328 } while (false); 1329 1330 return TPResult::Error(); 1331 } 1332 1333 Parser::TPResult 1334 Parser::TryParseDeclarationSpecifier(bool *HasMissingTypename) { 1335 TPResult TPR = isCXXDeclarationSpecifier(TPResult::False(), 1336 HasMissingTypename); 1337 if (TPR != TPResult::Ambiguous()) 1338 return TPR; 1339 1340 if (Tok.is(tok::kw_typeof)) 1341 TryParseTypeofSpecifier(); 1342 else { 1343 if (Tok.is(tok::annot_cxxscope)) 1344 ConsumeToken(); 1345 ConsumeToken(); 1346 1347 if (getLangOpts().ObjC1 && Tok.is(tok::less)) 1348 TryParseProtocolQualifiers(); 1349 } 1350 1351 return TPResult::Ambiguous(); 1352 } 1353 1354 /// isCXXFunctionDeclarator - Disambiguates between a function declarator or 1355 /// a constructor-style initializer, when parsing declaration statements. 1356 /// Returns true for function declarator and false for constructor-style 1357 /// initializer. 1358 /// If during the disambiguation process a parsing error is encountered, 1359 /// the function returns true to let the declaration parsing code handle it. 1360 /// 1361 /// '(' parameter-declaration-clause ')' cv-qualifier-seq[opt] 1362 /// exception-specification[opt] 1363 /// 1364 bool Parser::isCXXFunctionDeclarator(bool *IsAmbiguous) { 1365 1366 // C++ 8.2p1: 1367 // The ambiguity arising from the similarity between a function-style cast and 1368 // a declaration mentioned in 6.8 can also occur in the context of a 1369 // declaration. In that context, the choice is between a function declaration 1370 // with a redundant set of parentheses around a parameter name and an object 1371 // declaration with a function-style cast as the initializer. Just as for the 1372 // ambiguities mentioned in 6.8, the resolution is to consider any construct 1373 // that could possibly be a declaration a declaration. 1374 1375 TentativeParsingAction PA(*this); 1376 1377 ConsumeParen(); 1378 bool InvalidAsDeclaration = false; 1379 TPResult TPR = TryParseParameterDeclarationClause(&InvalidAsDeclaration); 1380 if (TPR == TPResult::Ambiguous()) { 1381 if (Tok.isNot(tok::r_paren)) 1382 TPR = TPResult::False(); 1383 else { 1384 const Token &Next = NextToken(); 1385 if (Next.is(tok::amp) || Next.is(tok::ampamp) || 1386 Next.is(tok::kw_const) || Next.is(tok::kw_volatile) || 1387 Next.is(tok::kw_throw) || Next.is(tok::kw_noexcept) || 1388 Next.is(tok::l_square) || isCXX0XVirtSpecifier(Next) || 1389 Next.is(tok::l_brace) || Next.is(tok::kw_try) || 1390 Next.is(tok::equal) || Next.is(tok::arrow)) 1391 // The next token cannot appear after a constructor-style initializer, 1392 // and can appear next in a function definition. This must be a function 1393 // declarator. 1394 TPR = TPResult::True(); 1395 else if (InvalidAsDeclaration) 1396 // Use the absence of 'typename' as a tie-breaker. 1397 TPR = TPResult::False(); 1398 } 1399 } 1400 1401 PA.Revert(); 1402 1403 if (IsAmbiguous && TPR == TPResult::Ambiguous()) 1404 *IsAmbiguous = true; 1405 1406 // In case of an error, let the declaration parsing code handle it. 1407 return TPR != TPResult::False(); 1408 } 1409 1410 /// parameter-declaration-clause: 1411 /// parameter-declaration-list[opt] '...'[opt] 1412 /// parameter-declaration-list ',' '...' 1413 /// 1414 /// parameter-declaration-list: 1415 /// parameter-declaration 1416 /// parameter-declaration-list ',' parameter-declaration 1417 /// 1418 /// parameter-declaration: 1419 /// attribute-specifier-seq[opt] decl-specifier-seq declarator attributes[opt] 1420 /// attribute-specifier-seq[opt] decl-specifier-seq declarator attributes[opt] 1421 /// '=' assignment-expression 1422 /// attribute-specifier-seq[opt] decl-specifier-seq abstract-declarator[opt] 1423 /// attributes[opt] 1424 /// attribute-specifier-seq[opt] decl-specifier-seq abstract-declarator[opt] 1425 /// attributes[opt] '=' assignment-expression 1426 /// 1427 Parser::TPResult 1428 Parser::TryParseParameterDeclarationClause(bool *InvalidAsDeclaration) { 1429 1430 if (Tok.is(tok::r_paren)) 1431 return TPResult::Ambiguous(); 1432 1433 // parameter-declaration-list[opt] '...'[opt] 1434 // parameter-declaration-list ',' '...' 1435 // 1436 // parameter-declaration-list: 1437 // parameter-declaration 1438 // parameter-declaration-list ',' parameter-declaration 1439 // 1440 while (1) { 1441 // '...'[opt] 1442 if (Tok.is(tok::ellipsis)) { 1443 ConsumeToken(); 1444 if (Tok.is(tok::r_paren)) 1445 return TPResult::True(); // '...)' is a sign of a function declarator. 1446 else 1447 return TPResult::False(); 1448 } 1449 1450 // An attribute-specifier-seq here is a sign of a function declarator. 1451 if (isCXX11AttributeSpecifier(/*Disambiguate*/false, 1452 /*OuterMightBeMessageSend*/true)) 1453 return TPResult::True(); 1454 1455 ParsedAttributes attrs(AttrFactory); 1456 MaybeParseMicrosoftAttributes(attrs); 1457 1458 // decl-specifier-seq 1459 // A parameter-declaration's initializer must be preceded by an '=', so 1460 // decl-specifier-seq '{' is not a parameter in C++11. 1461 TPResult TPR = TryParseDeclarationSpecifier(InvalidAsDeclaration); 1462 if (TPR != TPResult::Ambiguous()) 1463 return TPR; 1464 1465 // declarator 1466 // abstract-declarator[opt] 1467 TPR = TryParseDeclarator(true/*mayBeAbstract*/); 1468 if (TPR != TPResult::Ambiguous()) 1469 return TPR; 1470 1471 // [GNU] attributes[opt] 1472 if (Tok.is(tok::kw___attribute)) 1473 return TPResult::True(); 1474 1475 if (Tok.is(tok::equal)) { 1476 // '=' assignment-expression 1477 // Parse through assignment-expression. 1478 if (!SkipUntil(tok::comma, tok::r_paren, true/*StopAtSemi*/, 1479 true/*DontConsume*/)) 1480 return TPResult::Error(); 1481 } 1482 1483 if (Tok.is(tok::ellipsis)) { 1484 ConsumeToken(); 1485 if (Tok.is(tok::r_paren)) 1486 return TPResult::True(); // '...)' is a sign of a function declarator. 1487 else 1488 return TPResult::False(); 1489 } 1490 1491 if (Tok.isNot(tok::comma)) 1492 break; 1493 ConsumeToken(); // the comma. 1494 } 1495 1496 return TPResult::Ambiguous(); 1497 } 1498 1499 /// TryParseFunctionDeclarator - We parsed a '(' and we want to try to continue 1500 /// parsing as a function declarator. 1501 /// If TryParseFunctionDeclarator fully parsed the function declarator, it will 1502 /// return TPResult::Ambiguous(), otherwise it will return either False() or 1503 /// Error(). 1504 /// 1505 /// '(' parameter-declaration-clause ')' cv-qualifier-seq[opt] 1506 /// exception-specification[opt] 1507 /// 1508 /// exception-specification: 1509 /// 'throw' '(' type-id-list[opt] ')' 1510 /// 1511 Parser::TPResult Parser::TryParseFunctionDeclarator() { 1512 1513 // The '(' is already parsed. 1514 1515 TPResult TPR = TryParseParameterDeclarationClause(); 1516 if (TPR == TPResult::Ambiguous() && Tok.isNot(tok::r_paren)) 1517 TPR = TPResult::False(); 1518 1519 if (TPR == TPResult::False() || TPR == TPResult::Error()) 1520 return TPR; 1521 1522 // Parse through the parens. 1523 if (!SkipUntil(tok::r_paren)) 1524 return TPResult::Error(); 1525 1526 // cv-qualifier-seq 1527 while (Tok.is(tok::kw_const) || 1528 Tok.is(tok::kw_volatile) || 1529 Tok.is(tok::kw_restrict) ) 1530 ConsumeToken(); 1531 1532 // ref-qualifier[opt] 1533 if (Tok.is(tok::amp) || Tok.is(tok::ampamp)) 1534 ConsumeToken(); 1535 1536 // exception-specification 1537 if (Tok.is(tok::kw_throw)) { 1538 ConsumeToken(); 1539 if (Tok.isNot(tok::l_paren)) 1540 return TPResult::Error(); 1541 1542 // Parse through the parens after 'throw'. 1543 ConsumeParen(); 1544 if (!SkipUntil(tok::r_paren)) 1545 return TPResult::Error(); 1546 } 1547 if (Tok.is(tok::kw_noexcept)) { 1548 ConsumeToken(); 1549 // Possibly an expression as well. 1550 if (Tok.is(tok::l_paren)) { 1551 // Find the matching rparen. 1552 ConsumeParen(); 1553 if (!SkipUntil(tok::r_paren)) 1554 return TPResult::Error(); 1555 } 1556 } 1557 1558 return TPResult::Ambiguous(); 1559 } 1560 1561 /// '[' constant-expression[opt] ']' 1562 /// 1563 Parser::TPResult Parser::TryParseBracketDeclarator() { 1564 ConsumeBracket(); 1565 if (!SkipUntil(tok::r_square)) 1566 return TPResult::Error(); 1567 1568 return TPResult::Ambiguous(); 1569 } 1570