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 /// decl-specifier-seq ref-qualifier[opt] '[' identifier-list ']' 78 /// brace-or-equal-initializer ';' [C++17] 79 /// 80 /// (if AllowForRangeDecl specified) 81 /// for ( for-range-declaration : for-range-initializer ) statement 82 /// 83 /// for-range-declaration: 84 /// decl-specifier-seq declarator 85 /// decl-specifier-seq ref-qualifier[opt] '[' identifier-list ']' 86 /// 87 /// In any of the above cases there can be a preceding attribute-specifier-seq, 88 /// but the caller is expected to handle that. 89 bool Parser::isCXXSimpleDeclaration(bool AllowForRangeDecl) { 90 // C++ 6.8p1: 91 // There is an ambiguity in the grammar involving expression-statements and 92 // declarations: An expression-statement with a function-style explicit type 93 // conversion (5.2.3) as its leftmost subexpression can be indistinguishable 94 // from a declaration where the first declarator starts with a '('. In those 95 // cases the statement is a declaration. [Note: To disambiguate, the whole 96 // statement might have to be examined to determine if it is an 97 // expression-statement or a declaration]. 98 99 // C++ 6.8p3: 100 // The disambiguation is purely syntactic; that is, the meaning of the names 101 // occurring in such a statement, beyond whether they are type-names or not, 102 // is not generally used in or changed by the disambiguation. Class 103 // templates are instantiated as necessary to determine if a qualified name 104 // is a type-name. Disambiguation precedes parsing, and a statement 105 // disambiguated as a declaration may be an ill-formed declaration. 106 107 // We don't have to parse all of the decl-specifier-seq part. There's only 108 // an ambiguity if the first decl-specifier is 109 // simple-type-specifier/typename-specifier followed by a '(', which may 110 // indicate a function-style cast expression. 111 // isCXXDeclarationSpecifier will return TPResult::Ambiguous only in such 112 // a case. 113 114 bool InvalidAsDeclaration = false; 115 TPResult TPR = isCXXDeclarationSpecifier(TPResult::False, 116 &InvalidAsDeclaration); 117 if (TPR != TPResult::Ambiguous) 118 return TPR != TPResult::False; // Returns true for TPResult::True or 119 // TPResult::Error. 120 121 // FIXME: TryParseSimpleDeclaration doesn't look past the first initializer, 122 // and so gets some cases wrong. We can't carry on if we've already seen 123 // something which makes this statement invalid as a declaration in this case, 124 // since it can cause us to misparse valid code. Revisit this once 125 // TryParseInitDeclaratorList is fixed. 126 if (InvalidAsDeclaration) 127 return false; 128 129 // FIXME: Add statistics about the number of ambiguous statements encountered 130 // and how they were resolved (number of declarations+number of expressions). 131 132 // Ok, we have a simple-type-specifier/typename-specifier followed by a '(', 133 // or an identifier which doesn't resolve as anything. We need tentative 134 // parsing... 135 136 { 137 RevertingTentativeParsingAction PA(*this); 138 TPR = TryParseSimpleDeclaration(AllowForRangeDecl); 139 } 140 141 // In case of an error, let the declaration parsing code handle it. 142 if (TPR == TPResult::Error) 143 return true; 144 145 // Declarations take precedence over expressions. 146 if (TPR == TPResult::Ambiguous) 147 TPR = TPResult::True; 148 149 assert(TPR == TPResult::True || TPR == TPResult::False); 150 return TPR == TPResult::True; 151 } 152 153 /// Try to consume a token sequence that we've already identified as 154 /// (potentially) starting a decl-specifier. 155 Parser::TPResult Parser::TryConsumeDeclarationSpecifier() { 156 switch (Tok.getKind()) { 157 case tok::kw__Atomic: 158 if (NextToken().isNot(tok::l_paren)) { 159 ConsumeToken(); 160 break; 161 } 162 // Fall through. 163 case tok::kw_typeof: 164 case tok::kw___attribute: 165 case tok::kw___underlying_type: { 166 ConsumeToken(); 167 if (Tok.isNot(tok::l_paren)) 168 return TPResult::Error; 169 ConsumeParen(); 170 if (!SkipUntil(tok::r_paren)) 171 return TPResult::Error; 172 break; 173 } 174 175 case tok::kw_class: 176 case tok::kw_struct: 177 case tok::kw_union: 178 case tok::kw___interface: 179 case tok::kw_enum: 180 // elaborated-type-specifier: 181 // class-key attribute-specifier-seq[opt] 182 // nested-name-specifier[opt] identifier 183 // class-key nested-name-specifier[opt] template[opt] simple-template-id 184 // enum nested-name-specifier[opt] identifier 185 // 186 // FIXME: We don't support class-specifiers nor enum-specifiers here. 187 ConsumeToken(); 188 189 // Skip attributes. 190 while (Tok.isOneOf(tok::l_square, tok::kw___attribute, tok::kw___declspec, 191 tok::kw_alignas)) { 192 if (Tok.is(tok::l_square)) { 193 ConsumeBracket(); 194 if (!SkipUntil(tok::r_square)) 195 return TPResult::Error; 196 } else { 197 ConsumeToken(); 198 if (Tok.isNot(tok::l_paren)) 199 return TPResult::Error; 200 ConsumeParen(); 201 if (!SkipUntil(tok::r_paren)) 202 return TPResult::Error; 203 } 204 } 205 206 if (Tok.isOneOf(tok::identifier, tok::coloncolon, tok::kw_decltype, 207 tok::annot_template_id) && 208 TryAnnotateCXXScopeToken()) 209 return TPResult::Error; 210 if (Tok.is(tok::annot_cxxscope)) 211 ConsumeAnnotationToken(); 212 if (Tok.is(tok::identifier)) 213 ConsumeToken(); 214 else if (Tok.is(tok::annot_template_id)) 215 ConsumeAnnotationToken(); 216 else 217 return TPResult::Error; 218 break; 219 220 case tok::annot_cxxscope: 221 ConsumeAnnotationToken(); 222 // Fall through. 223 default: 224 ConsumeAnyToken(); 225 226 if (getLangOpts().ObjC1 && Tok.is(tok::less)) 227 return TryParseProtocolQualifiers(); 228 break; 229 } 230 231 return TPResult::Ambiguous; 232 } 233 234 /// simple-declaration: 235 /// decl-specifier-seq init-declarator-list[opt] ';' 236 /// 237 /// (if AllowForRangeDecl specified) 238 /// for ( for-range-declaration : for-range-initializer ) statement 239 /// for-range-declaration: 240 /// attribute-specifier-seqopt type-specifier-seq declarator 241 /// 242 Parser::TPResult Parser::TryParseSimpleDeclaration(bool AllowForRangeDecl) { 243 if (TryConsumeDeclarationSpecifier() == TPResult::Error) 244 return TPResult::Error; 245 246 // Two decl-specifiers in a row conclusively disambiguate this as being a 247 // simple-declaration. Don't bother calling isCXXDeclarationSpecifier in the 248 // overwhelmingly common case that the next token is a '('. 249 if (Tok.isNot(tok::l_paren)) { 250 TPResult TPR = isCXXDeclarationSpecifier(); 251 if (TPR == TPResult::Ambiguous) 252 return TPResult::True; 253 if (TPR == TPResult::True || TPR == TPResult::Error) 254 return TPR; 255 assert(TPR == TPResult::False); 256 } 257 258 TPResult TPR = TryParseInitDeclaratorList(); 259 if (TPR != TPResult::Ambiguous) 260 return TPR; 261 262 if (Tok.isNot(tok::semi) && (!AllowForRangeDecl || Tok.isNot(tok::colon))) 263 return TPResult::False; 264 265 return TPResult::Ambiguous; 266 } 267 268 /// Tentatively parse an init-declarator-list in order to disambiguate it from 269 /// an expression. 270 /// 271 /// init-declarator-list: 272 /// init-declarator 273 /// init-declarator-list ',' init-declarator 274 /// 275 /// init-declarator: 276 /// declarator initializer[opt] 277 /// [GNU] declarator simple-asm-expr[opt] attributes[opt] initializer[opt] 278 /// 279 /// initializer: 280 /// brace-or-equal-initializer 281 /// '(' expression-list ')' 282 /// 283 /// brace-or-equal-initializer: 284 /// '=' initializer-clause 285 /// [C++11] braced-init-list 286 /// 287 /// initializer-clause: 288 /// assignment-expression 289 /// braced-init-list 290 /// 291 /// braced-init-list: 292 /// '{' initializer-list ','[opt] '}' 293 /// '{' '}' 294 /// 295 Parser::TPResult Parser::TryParseInitDeclaratorList() { 296 while (1) { 297 // declarator 298 TPResult TPR = TryParseDeclarator(false/*mayBeAbstract*/); 299 if (TPR != TPResult::Ambiguous) 300 return TPR; 301 302 // [GNU] simple-asm-expr[opt] attributes[opt] 303 if (Tok.isOneOf(tok::kw_asm, tok::kw___attribute)) 304 return TPResult::True; 305 306 // initializer[opt] 307 if (Tok.is(tok::l_paren)) { 308 // Parse through the parens. 309 ConsumeParen(); 310 if (!SkipUntil(tok::r_paren, StopAtSemi)) 311 return TPResult::Error; 312 } else if (Tok.is(tok::l_brace)) { 313 // A left-brace here is sufficient to disambiguate the parse; an 314 // expression can never be followed directly by a braced-init-list. 315 return TPResult::True; 316 } else if (Tok.is(tok::equal) || isTokIdentifier_in()) { 317 // MSVC and g++ won't examine the rest of declarators if '=' is 318 // encountered; they just conclude that we have a declaration. 319 // EDG parses the initializer completely, which is the proper behavior 320 // for this case. 321 // 322 // At present, Clang follows MSVC and g++, since the parser does not have 323 // the ability to parse an expression fully without recording the 324 // results of that parse. 325 // FIXME: Handle this case correctly. 326 // 327 // Also allow 'in' after an Objective-C declaration as in: 328 // for (int (^b)(void) in array). Ideally this should be done in the 329 // context of parsing for-init-statement of a foreach statement only. But, 330 // in any other context 'in' is invalid after a declaration and parser 331 // issues the error regardless of outcome of this decision. 332 // FIXME: Change if above assumption does not hold. 333 return TPResult::True; 334 } 335 336 if (!TryConsumeToken(tok::comma)) 337 break; 338 } 339 340 return TPResult::Ambiguous; 341 } 342 343 struct Parser::ConditionDeclarationOrInitStatementState { 344 Parser &P; 345 bool CanBeExpression = true; 346 bool CanBeCondition = true; 347 bool CanBeInitStatement; 348 349 ConditionDeclarationOrInitStatementState(Parser &P, bool CanBeInitStatement) 350 : P(P), CanBeInitStatement(CanBeInitStatement) {} 351 352 void markNotExpression() { 353 CanBeExpression = false; 354 355 if (CanBeCondition && CanBeInitStatement) { 356 // FIXME: Unify the parsing codepaths for condition variables and 357 // simple-declarations so that we don't need to eagerly figure out which 358 // kind we have here. (Just parse init-declarators until we reach a 359 // semicolon or right paren.) 360 RevertingTentativeParsingAction PA(P); 361 P.SkipUntil(tok::r_paren, tok::semi, StopBeforeMatch); 362 if (P.Tok.isNot(tok::r_paren)) 363 CanBeCondition = false; 364 if (P.Tok.isNot(tok::semi)) 365 CanBeInitStatement = false; 366 } 367 } 368 369 bool markNotCondition() { 370 CanBeCondition = false; 371 return !CanBeInitStatement || !CanBeExpression; 372 } 373 374 bool update(TPResult IsDecl) { 375 switch (IsDecl) { 376 case TPResult::True: 377 markNotExpression(); 378 return true; 379 case TPResult::False: 380 CanBeCondition = CanBeInitStatement = false; 381 return true; 382 case TPResult::Ambiguous: 383 return false; 384 case TPResult::Error: 385 CanBeExpression = CanBeCondition = CanBeInitStatement = false; 386 return true; 387 } 388 llvm_unreachable("unknown tentative parse result"); 389 } 390 391 ConditionOrInitStatement result() const { 392 assert(CanBeExpression + CanBeCondition + CanBeInitStatement < 2 && 393 "result called but not yet resolved"); 394 if (CanBeExpression) 395 return ConditionOrInitStatement::Expression; 396 if (CanBeCondition) 397 return ConditionOrInitStatement::ConditionDecl; 398 if (CanBeInitStatement) 399 return ConditionOrInitStatement::InitStmtDecl; 400 return ConditionOrInitStatement::Error; 401 } 402 }; 403 404 /// \brief Disambiguates between a declaration in a condition, a 405 /// simple-declaration in an init-statement, and an expression for 406 /// a condition of a if/switch statement. 407 /// 408 /// condition: 409 /// expression 410 /// type-specifier-seq declarator '=' assignment-expression 411 /// [C++11] type-specifier-seq declarator '=' initializer-clause 412 /// [C++11] type-specifier-seq declarator braced-init-list 413 /// [GNU] type-specifier-seq declarator simple-asm-expr[opt] attributes[opt] 414 /// '=' assignment-expression 415 /// simple-declaration: 416 /// decl-specifier-seq init-declarator-list[opt] ';' 417 /// 418 /// Note that, unlike isCXXSimpleDeclaration, we must disambiguate all the way 419 /// to the ';' to disambiguate cases like 'int(x))' (an expression) from 420 /// 'int(x);' (a simple-declaration in an init-statement). 421 Parser::ConditionOrInitStatement 422 Parser::isCXXConditionDeclarationOrInitStatement(bool CanBeInitStatement) { 423 ConditionDeclarationOrInitStatementState State(*this, CanBeInitStatement); 424 425 if (State.update(isCXXDeclarationSpecifier())) 426 return State.result(); 427 428 // It might be a declaration; we need tentative parsing. 429 RevertingTentativeParsingAction PA(*this); 430 431 // FIXME: A tag definition unambiguously tells us this is an init-statement. 432 if (State.update(TryConsumeDeclarationSpecifier())) 433 return State.result(); 434 assert(Tok.is(tok::l_paren) && "Expected '('"); 435 436 while (true) { 437 // Consume a declarator. 438 if (State.update(TryParseDeclarator(false/*mayBeAbstract*/))) 439 return State.result(); 440 441 // Attributes, asm label, or an initializer imply this is not an expression. 442 // FIXME: Disambiguate properly after an = instead of assuming that it's a 443 // valid declaration. 444 if (Tok.isOneOf(tok::equal, tok::kw_asm, tok::kw___attribute) || 445 (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace))) { 446 State.markNotExpression(); 447 return State.result(); 448 } 449 450 // At this point, it can't be a condition any more, because a condition 451 // must have a brace-or-equal-initializer. 452 if (State.markNotCondition()) 453 return State.result(); 454 455 // A parenthesized initializer could be part of an expression or a 456 // simple-declaration. 457 if (Tok.is(tok::l_paren)) { 458 ConsumeParen(); 459 SkipUntil(tok::r_paren, StopAtSemi); 460 } 461 462 if (!TryConsumeToken(tok::comma)) 463 break; 464 } 465 466 // We reached the end. If it can now be some kind of decl, then it is. 467 if (State.CanBeCondition && Tok.is(tok::r_paren)) 468 return ConditionOrInitStatement::ConditionDecl; 469 else if (State.CanBeInitStatement && Tok.is(tok::semi)) 470 return ConditionOrInitStatement::InitStmtDecl; 471 else 472 return ConditionOrInitStatement::Expression; 473 } 474 475 /// \brief Determine whether the next set of tokens contains a type-id. 476 /// 477 /// The context parameter states what context we're parsing right 478 /// now, which affects how this routine copes with the token 479 /// following the type-id. If the context is TypeIdInParens, we have 480 /// already parsed the '(' and we will cease lookahead when we hit 481 /// the corresponding ')'. If the context is 482 /// TypeIdAsTemplateArgument, we've already parsed the '<' or ',' 483 /// before this template argument, and will cease lookahead when we 484 /// hit a '>', '>>' (in C++0x), or ','; or, in C++0x, an ellipsis immediately 485 /// preceding such. Returns true for a type-id and false for an expression. 486 /// If during the disambiguation process a parsing error is encountered, 487 /// the function returns true to let the declaration parsing code handle it. 488 /// 489 /// type-id: 490 /// type-specifier-seq abstract-declarator[opt] 491 /// 492 bool Parser::isCXXTypeId(TentativeCXXTypeIdContext Context, bool &isAmbiguous) { 493 494 isAmbiguous = false; 495 496 // C++ 8.2p2: 497 // The ambiguity arising from the similarity between a function-style cast and 498 // a type-id can occur in different contexts. The ambiguity appears as a 499 // choice between a function-style cast expression and a declaration of a 500 // type. The resolution is that any construct that could possibly be a type-id 501 // in its syntactic context shall be considered a type-id. 502 503 TPResult TPR = isCXXDeclarationSpecifier(); 504 if (TPR != TPResult::Ambiguous) 505 return TPR != TPResult::False; // Returns true for TPResult::True or 506 // TPResult::Error. 507 508 // FIXME: Add statistics about the number of ambiguous statements encountered 509 // and how they were resolved (number of declarations+number of expressions). 510 511 // Ok, we have a simple-type-specifier/typename-specifier followed by a '('. 512 // We need tentative parsing... 513 514 RevertingTentativeParsingAction PA(*this); 515 516 // type-specifier-seq 517 TryConsumeDeclarationSpecifier(); 518 assert(Tok.is(tok::l_paren) && "Expected '('"); 519 520 // declarator 521 TPR = TryParseDeclarator(true/*mayBeAbstract*/, false/*mayHaveIdentifier*/); 522 523 // In case of an error, let the declaration parsing code handle it. 524 if (TPR == TPResult::Error) 525 TPR = TPResult::True; 526 527 if (TPR == TPResult::Ambiguous) { 528 // We are supposed to be inside parens, so if after the abstract declarator 529 // we encounter a ')' this is a type-id, otherwise it's an expression. 530 if (Context == TypeIdInParens && Tok.is(tok::r_paren)) { 531 TPR = TPResult::True; 532 isAmbiguous = true; 533 534 // We are supposed to be inside a template argument, so if after 535 // the abstract declarator we encounter a '>', '>>' (in C++0x), or 536 // ','; or, in C++0x, an ellipsis immediately preceding such, this 537 // is a type-id. Otherwise, it's an expression. 538 } else if (Context == TypeIdAsTemplateArgument && 539 (Tok.isOneOf(tok::greater, tok::comma) || 540 (getLangOpts().CPlusPlus11 && 541 (Tok.is(tok::greatergreater) || 542 (Tok.is(tok::ellipsis) && 543 NextToken().isOneOf(tok::greater, tok::greatergreater, 544 tok::comma)))))) { 545 TPR = TPResult::True; 546 isAmbiguous = true; 547 548 } else 549 TPR = TPResult::False; 550 } 551 552 assert(TPR == TPResult::True || TPR == TPResult::False); 553 return TPR == TPResult::True; 554 } 555 556 /// \brief Returns true if this is a C++11 attribute-specifier. Per 557 /// C++11 [dcl.attr.grammar]p6, two consecutive left square bracket tokens 558 /// always introduce an attribute. In Objective-C++11, this rule does not 559 /// apply if either '[' begins a message-send. 560 /// 561 /// If Disambiguate is true, we try harder to determine whether a '[[' starts 562 /// an attribute-specifier, and return CAK_InvalidAttributeSpecifier if not. 563 /// 564 /// If OuterMightBeMessageSend is true, we assume the outer '[' is either an 565 /// Obj-C message send or the start of an attribute. Otherwise, we assume it 566 /// is not an Obj-C message send. 567 /// 568 /// C++11 [dcl.attr.grammar]: 569 /// 570 /// attribute-specifier: 571 /// '[' '[' attribute-list ']' ']' 572 /// alignment-specifier 573 /// 574 /// attribute-list: 575 /// attribute[opt] 576 /// attribute-list ',' attribute[opt] 577 /// attribute '...' 578 /// attribute-list ',' attribute '...' 579 /// 580 /// attribute: 581 /// attribute-token attribute-argument-clause[opt] 582 /// 583 /// attribute-token: 584 /// identifier 585 /// identifier '::' identifier 586 /// 587 /// attribute-argument-clause: 588 /// '(' balanced-token-seq ')' 589 Parser::CXX11AttributeKind 590 Parser::isCXX11AttributeSpecifier(bool Disambiguate, 591 bool OuterMightBeMessageSend) { 592 if (Tok.is(tok::kw_alignas)) 593 return CAK_AttributeSpecifier; 594 595 if (Tok.isNot(tok::l_square) || NextToken().isNot(tok::l_square)) 596 return CAK_NotAttributeSpecifier; 597 598 // No tentative parsing if we don't need to look for ']]' or a lambda. 599 if (!Disambiguate && !getLangOpts().ObjC1) 600 return CAK_AttributeSpecifier; 601 602 RevertingTentativeParsingAction PA(*this); 603 604 // Opening brackets were checked for above. 605 ConsumeBracket(); 606 607 // Outside Obj-C++11, treat anything with a matching ']]' as an attribute. 608 if (!getLangOpts().ObjC1) { 609 ConsumeBracket(); 610 611 bool IsAttribute = SkipUntil(tok::r_square); 612 IsAttribute &= Tok.is(tok::r_square); 613 614 return IsAttribute ? CAK_AttributeSpecifier : CAK_InvalidAttributeSpecifier; 615 } 616 617 // In Obj-C++11, we need to distinguish four situations: 618 // 1a) int x[[attr]]; C++11 attribute. 619 // 1b) [[attr]]; C++11 statement attribute. 620 // 2) int x[[obj](){ return 1; }()]; Lambda in array size/index. 621 // 3a) int x[[obj get]]; Message send in array size/index. 622 // 3b) [[Class alloc] init]; Message send in message send. 623 // 4) [[obj]{ return self; }() doStuff]; Lambda in message send. 624 // (1) is an attribute, (2) is ill-formed, and (3) and (4) are accepted. 625 626 // If we have a lambda-introducer, then this is definitely not a message send. 627 // FIXME: If this disambiguation is too slow, fold the tentative lambda parse 628 // into the tentative attribute parse below. 629 LambdaIntroducer Intro; 630 if (!TryParseLambdaIntroducer(Intro)) { 631 // A lambda cannot end with ']]', and an attribute must. 632 bool IsAttribute = Tok.is(tok::r_square); 633 634 if (IsAttribute) 635 // Case 1: C++11 attribute. 636 return CAK_AttributeSpecifier; 637 638 if (OuterMightBeMessageSend) 639 // Case 4: Lambda in message send. 640 return CAK_NotAttributeSpecifier; 641 642 // Case 2: Lambda in array size / index. 643 return CAK_InvalidAttributeSpecifier; 644 } 645 646 ConsumeBracket(); 647 648 // If we don't have a lambda-introducer, then we have an attribute or a 649 // message-send. 650 bool IsAttribute = true; 651 while (Tok.isNot(tok::r_square)) { 652 if (Tok.is(tok::comma)) { 653 // Case 1: Stray commas can only occur in attributes. 654 return CAK_AttributeSpecifier; 655 } 656 657 // Parse the attribute-token, if present. 658 // C++11 [dcl.attr.grammar]: 659 // If a keyword or an alternative token that satisfies the syntactic 660 // requirements of an identifier is contained in an attribute-token, 661 // it is considered an identifier. 662 SourceLocation Loc; 663 if (!TryParseCXX11AttributeIdentifier(Loc)) { 664 IsAttribute = false; 665 break; 666 } 667 if (Tok.is(tok::coloncolon)) { 668 ConsumeToken(); 669 if (!TryParseCXX11AttributeIdentifier(Loc)) { 670 IsAttribute = false; 671 break; 672 } 673 } 674 675 // Parse the attribute-argument-clause, if present. 676 if (Tok.is(tok::l_paren)) { 677 ConsumeParen(); 678 if (!SkipUntil(tok::r_paren)) { 679 IsAttribute = false; 680 break; 681 } 682 } 683 684 TryConsumeToken(tok::ellipsis); 685 686 if (!TryConsumeToken(tok::comma)) 687 break; 688 } 689 690 // An attribute must end ']]'. 691 if (IsAttribute) { 692 if (Tok.is(tok::r_square)) { 693 ConsumeBracket(); 694 IsAttribute = Tok.is(tok::r_square); 695 } else { 696 IsAttribute = false; 697 } 698 } 699 700 if (IsAttribute) 701 // Case 1: C++11 statement attribute. 702 return CAK_AttributeSpecifier; 703 704 // Case 3: Message send. 705 return CAK_NotAttributeSpecifier; 706 } 707 708 Parser::TPResult Parser::TryParsePtrOperatorSeq() { 709 while (true) { 710 if (Tok.isOneOf(tok::coloncolon, tok::identifier)) 711 if (TryAnnotateCXXScopeToken(true)) 712 return TPResult::Error; 713 714 if (Tok.isOneOf(tok::star, tok::amp, tok::caret, tok::ampamp) || 715 (Tok.is(tok::annot_cxxscope) && NextToken().is(tok::star))) { 716 // ptr-operator 717 ConsumeAnyToken(); 718 while (Tok.isOneOf(tok::kw_const, tok::kw_volatile, tok::kw_restrict, 719 tok::kw__Nonnull, tok::kw__Nullable, 720 tok::kw__Null_unspecified)) 721 ConsumeToken(); 722 } else { 723 return TPResult::True; 724 } 725 } 726 } 727 728 /// operator-function-id: 729 /// 'operator' operator 730 /// 731 /// operator: one of 732 /// new delete new[] delete[] + - * / % ^ [...] 733 /// 734 /// conversion-function-id: 735 /// 'operator' conversion-type-id 736 /// 737 /// conversion-type-id: 738 /// type-specifier-seq conversion-declarator[opt] 739 /// 740 /// conversion-declarator: 741 /// ptr-operator conversion-declarator[opt] 742 /// 743 /// literal-operator-id: 744 /// 'operator' string-literal identifier 745 /// 'operator' user-defined-string-literal 746 Parser::TPResult Parser::TryParseOperatorId() { 747 assert(Tok.is(tok::kw_operator)); 748 ConsumeToken(); 749 750 // Maybe this is an operator-function-id. 751 switch (Tok.getKind()) { 752 case tok::kw_new: case tok::kw_delete: 753 ConsumeToken(); 754 if (Tok.is(tok::l_square) && NextToken().is(tok::r_square)) { 755 ConsumeBracket(); 756 ConsumeBracket(); 757 } 758 return TPResult::True; 759 760 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemOnly) \ 761 case tok::Token: 762 #define OVERLOADED_OPERATOR_MULTI(Name, Spelling, Unary, Binary, MemOnly) 763 #include "clang/Basic/OperatorKinds.def" 764 ConsumeToken(); 765 return TPResult::True; 766 767 case tok::l_square: 768 if (NextToken().is(tok::r_square)) { 769 ConsumeBracket(); 770 ConsumeBracket(); 771 return TPResult::True; 772 } 773 break; 774 775 case tok::l_paren: 776 if (NextToken().is(tok::r_paren)) { 777 ConsumeParen(); 778 ConsumeParen(); 779 return TPResult::True; 780 } 781 break; 782 783 default: 784 break; 785 } 786 787 // Maybe this is a literal-operator-id. 788 if (getLangOpts().CPlusPlus11 && isTokenStringLiteral()) { 789 bool FoundUDSuffix = false; 790 do { 791 FoundUDSuffix |= Tok.hasUDSuffix(); 792 ConsumeStringToken(); 793 } while (isTokenStringLiteral()); 794 795 if (!FoundUDSuffix) { 796 if (Tok.is(tok::identifier)) 797 ConsumeToken(); 798 else 799 return TPResult::Error; 800 } 801 return TPResult::True; 802 } 803 804 // Maybe this is a conversion-function-id. 805 bool AnyDeclSpecifiers = false; 806 while (true) { 807 TPResult TPR = isCXXDeclarationSpecifier(); 808 if (TPR == TPResult::Error) 809 return TPR; 810 if (TPR == TPResult::False) { 811 if (!AnyDeclSpecifiers) 812 return TPResult::Error; 813 break; 814 } 815 if (TryConsumeDeclarationSpecifier() == TPResult::Error) 816 return TPResult::Error; 817 AnyDeclSpecifiers = true; 818 } 819 return TryParsePtrOperatorSeq(); 820 } 821 822 /// declarator: 823 /// direct-declarator 824 /// ptr-operator declarator 825 /// 826 /// direct-declarator: 827 /// declarator-id 828 /// direct-declarator '(' parameter-declaration-clause ')' 829 /// cv-qualifier-seq[opt] exception-specification[opt] 830 /// direct-declarator '[' constant-expression[opt] ']' 831 /// '(' declarator ')' 832 /// [GNU] '(' attributes declarator ')' 833 /// 834 /// abstract-declarator: 835 /// ptr-operator abstract-declarator[opt] 836 /// direct-abstract-declarator 837 /// 838 /// direct-abstract-declarator: 839 /// direct-abstract-declarator[opt] 840 /// '(' parameter-declaration-clause ')' cv-qualifier-seq[opt] 841 /// exception-specification[opt] 842 /// direct-abstract-declarator[opt] '[' constant-expression[opt] ']' 843 /// '(' abstract-declarator ')' 844 /// [C++0x] ... 845 /// 846 /// ptr-operator: 847 /// '*' cv-qualifier-seq[opt] 848 /// '&' 849 /// [C++0x] '&&' [TODO] 850 /// '::'[opt] nested-name-specifier '*' cv-qualifier-seq[opt] 851 /// 852 /// cv-qualifier-seq: 853 /// cv-qualifier cv-qualifier-seq[opt] 854 /// 855 /// cv-qualifier: 856 /// 'const' 857 /// 'volatile' 858 /// 859 /// declarator-id: 860 /// '...'[opt] id-expression 861 /// 862 /// id-expression: 863 /// unqualified-id 864 /// qualified-id [TODO] 865 /// 866 /// unqualified-id: 867 /// identifier 868 /// operator-function-id 869 /// conversion-function-id 870 /// literal-operator-id 871 /// '~' class-name [TODO] 872 /// '~' decltype-specifier [TODO] 873 /// template-id [TODO] 874 /// 875 Parser::TPResult Parser::TryParseDeclarator(bool mayBeAbstract, 876 bool mayHaveIdentifier, 877 bool mayHaveDirectInit) { 878 // declarator: 879 // direct-declarator 880 // ptr-operator declarator 881 if (TryParsePtrOperatorSeq() == TPResult::Error) 882 return TPResult::Error; 883 884 // direct-declarator: 885 // direct-abstract-declarator: 886 if (Tok.is(tok::ellipsis)) 887 ConsumeToken(); 888 889 if ((Tok.isOneOf(tok::identifier, tok::kw_operator) || 890 (Tok.is(tok::annot_cxxscope) && (NextToken().is(tok::identifier) || 891 NextToken().is(tok::kw_operator)))) && 892 mayHaveIdentifier) { 893 // declarator-id 894 if (Tok.is(tok::annot_cxxscope)) 895 ConsumeAnnotationToken(); 896 else if (Tok.is(tok::identifier)) 897 TentativelyDeclaredIdentifiers.push_back(Tok.getIdentifierInfo()); 898 if (Tok.is(tok::kw_operator)) { 899 if (TryParseOperatorId() == TPResult::Error) 900 return TPResult::Error; 901 } else 902 ConsumeToken(); 903 } else if (Tok.is(tok::l_paren)) { 904 ConsumeParen(); 905 if (mayBeAbstract && 906 (Tok.is(tok::r_paren) || // 'int()' is a function. 907 // 'int(...)' is a function. 908 (Tok.is(tok::ellipsis) && NextToken().is(tok::r_paren)) || 909 isDeclarationSpecifier())) { // 'int(int)' is a function. 910 // '(' parameter-declaration-clause ')' cv-qualifier-seq[opt] 911 // exception-specification[opt] 912 TPResult TPR = TryParseFunctionDeclarator(); 913 if (TPR != TPResult::Ambiguous) 914 return TPR; 915 } else { 916 // '(' declarator ')' 917 // '(' attributes declarator ')' 918 // '(' abstract-declarator ')' 919 if (Tok.isOneOf(tok::kw___attribute, tok::kw___declspec, tok::kw___cdecl, 920 tok::kw___stdcall, tok::kw___fastcall, tok::kw___thiscall, 921 tok::kw___regcall, tok::kw___vectorcall)) 922 return TPResult::True; // attributes indicate declaration 923 TPResult TPR = TryParseDeclarator(mayBeAbstract, mayHaveIdentifier); 924 if (TPR != TPResult::Ambiguous) 925 return TPR; 926 if (Tok.isNot(tok::r_paren)) 927 return TPResult::False; 928 ConsumeParen(); 929 } 930 } else if (!mayBeAbstract) { 931 return TPResult::False; 932 } 933 934 if (mayHaveDirectInit) 935 return TPResult::Ambiguous; 936 937 while (1) { 938 TPResult TPR(TPResult::Ambiguous); 939 940 if (Tok.is(tok::l_paren)) { 941 // Check whether we have a function declarator or a possible ctor-style 942 // initializer that follows the declarator. Note that ctor-style 943 // initializers are not possible in contexts where abstract declarators 944 // are allowed. 945 if (!mayBeAbstract && !isCXXFunctionDeclarator()) 946 break; 947 948 // direct-declarator '(' parameter-declaration-clause ')' 949 // cv-qualifier-seq[opt] exception-specification[opt] 950 ConsumeParen(); 951 TPR = TryParseFunctionDeclarator(); 952 } else if (Tok.is(tok::l_square)) { 953 // direct-declarator '[' constant-expression[opt] ']' 954 // direct-abstract-declarator[opt] '[' constant-expression[opt] ']' 955 TPR = TryParseBracketDeclarator(); 956 } else { 957 break; 958 } 959 960 if (TPR != TPResult::Ambiguous) 961 return TPR; 962 } 963 964 return TPResult::Ambiguous; 965 } 966 967 Parser::TPResult 968 Parser::isExpressionOrTypeSpecifierSimple(tok::TokenKind Kind) { 969 switch (Kind) { 970 // Obviously starts an expression. 971 case tok::numeric_constant: 972 case tok::char_constant: 973 case tok::wide_char_constant: 974 case tok::utf8_char_constant: 975 case tok::utf16_char_constant: 976 case tok::utf32_char_constant: 977 case tok::string_literal: 978 case tok::wide_string_literal: 979 case tok::utf8_string_literal: 980 case tok::utf16_string_literal: 981 case tok::utf32_string_literal: 982 case tok::l_square: 983 case tok::l_paren: 984 case tok::amp: 985 case tok::ampamp: 986 case tok::star: 987 case tok::plus: 988 case tok::plusplus: 989 case tok::minus: 990 case tok::minusminus: 991 case tok::tilde: 992 case tok::exclaim: 993 case tok::kw_sizeof: 994 case tok::kw___func__: 995 case tok::kw_const_cast: 996 case tok::kw_delete: 997 case tok::kw_dynamic_cast: 998 case tok::kw_false: 999 case tok::kw_new: 1000 case tok::kw_operator: 1001 case tok::kw_reinterpret_cast: 1002 case tok::kw_static_cast: 1003 case tok::kw_this: 1004 case tok::kw_throw: 1005 case tok::kw_true: 1006 case tok::kw_typeid: 1007 case tok::kw_alignof: 1008 case tok::kw_noexcept: 1009 case tok::kw_nullptr: 1010 case tok::kw__Alignof: 1011 case tok::kw___null: 1012 case tok::kw___alignof: 1013 case tok::kw___builtin_choose_expr: 1014 case tok::kw___builtin_offsetof: 1015 case tok::kw___builtin_va_arg: 1016 case tok::kw___imag: 1017 case tok::kw___real: 1018 case tok::kw___FUNCTION__: 1019 case tok::kw___FUNCDNAME__: 1020 case tok::kw___FUNCSIG__: 1021 case tok::kw_L__FUNCTION__: 1022 case tok::kw___PRETTY_FUNCTION__: 1023 case tok::kw___uuidof: 1024 #define TYPE_TRAIT(N,Spelling,K) \ 1025 case tok::kw_##Spelling: 1026 #include "clang/Basic/TokenKinds.def" 1027 return TPResult::True; 1028 1029 // Obviously starts a type-specifier-seq: 1030 case tok::kw_char: 1031 case tok::kw_const: 1032 case tok::kw_double: 1033 case tok::kw__Float16: 1034 case tok::kw___float128: 1035 case tok::kw_enum: 1036 case tok::kw_half: 1037 case tok::kw_float: 1038 case tok::kw_int: 1039 case tok::kw_long: 1040 case tok::kw___int64: 1041 case tok::kw___int128: 1042 case tok::kw_restrict: 1043 case tok::kw_short: 1044 case tok::kw_signed: 1045 case tok::kw_struct: 1046 case tok::kw_union: 1047 case tok::kw_unsigned: 1048 case tok::kw_void: 1049 case tok::kw_volatile: 1050 case tok::kw__Bool: 1051 case tok::kw__Complex: 1052 case tok::kw_class: 1053 case tok::kw_typename: 1054 case tok::kw_wchar_t: 1055 case tok::kw_char16_t: 1056 case tok::kw_char32_t: 1057 case tok::kw__Decimal32: 1058 case tok::kw__Decimal64: 1059 case tok::kw__Decimal128: 1060 case tok::kw___interface: 1061 case tok::kw___thread: 1062 case tok::kw_thread_local: 1063 case tok::kw__Thread_local: 1064 case tok::kw_typeof: 1065 case tok::kw___underlying_type: 1066 case tok::kw___cdecl: 1067 case tok::kw___stdcall: 1068 case tok::kw___fastcall: 1069 case tok::kw___thiscall: 1070 case tok::kw___regcall: 1071 case tok::kw___vectorcall: 1072 case tok::kw___unaligned: 1073 case tok::kw___vector: 1074 case tok::kw___pixel: 1075 case tok::kw___bool: 1076 case tok::kw__Atomic: 1077 #define GENERIC_IMAGE_TYPE(ImgType, Id) case tok::kw_##ImgType##_t: 1078 #include "clang/Basic/OpenCLImageTypes.def" 1079 case tok::kw___unknown_anytype: 1080 return TPResult::False; 1081 1082 default: 1083 break; 1084 } 1085 1086 return TPResult::Ambiguous; 1087 } 1088 1089 bool Parser::isTentativelyDeclared(IdentifierInfo *II) { 1090 return std::find(TentativelyDeclaredIdentifiers.begin(), 1091 TentativelyDeclaredIdentifiers.end(), II) 1092 != TentativelyDeclaredIdentifiers.end(); 1093 } 1094 1095 namespace { 1096 class TentativeParseCCC : public CorrectionCandidateCallback { 1097 public: 1098 TentativeParseCCC(const Token &Next) { 1099 WantRemainingKeywords = false; 1100 WantTypeSpecifiers = Next.isOneOf(tok::l_paren, tok::r_paren, tok::greater, 1101 tok::l_brace, tok::identifier); 1102 } 1103 1104 bool ValidateCandidate(const TypoCorrection &Candidate) override { 1105 // Reject any candidate that only resolves to instance members since they 1106 // aren't viable as standalone identifiers instead of member references. 1107 if (Candidate.isResolved() && !Candidate.isKeyword() && 1108 std::all_of(Candidate.begin(), Candidate.end(), 1109 [](NamedDecl *ND) { return ND->isCXXInstanceMember(); })) 1110 return false; 1111 1112 return CorrectionCandidateCallback::ValidateCandidate(Candidate); 1113 } 1114 }; 1115 } 1116 /// isCXXDeclarationSpecifier - Returns TPResult::True if it is a declaration 1117 /// specifier, TPResult::False if it is not, TPResult::Ambiguous if it could 1118 /// be either a decl-specifier or a function-style cast, and TPResult::Error 1119 /// if a parsing error was found and reported. 1120 /// 1121 /// If HasMissingTypename is provided, a name with a dependent scope specifier 1122 /// will be treated as ambiguous if the 'typename' keyword is missing. If this 1123 /// happens, *HasMissingTypename will be set to 'true'. This will also be used 1124 /// as an indicator that undeclared identifiers (which will trigger a later 1125 /// parse error) should be treated as types. Returns TPResult::Ambiguous in 1126 /// such cases. 1127 /// 1128 /// decl-specifier: 1129 /// storage-class-specifier 1130 /// type-specifier 1131 /// function-specifier 1132 /// 'friend' 1133 /// 'typedef' 1134 /// [C++11] 'constexpr' 1135 /// [GNU] attributes declaration-specifiers[opt] 1136 /// 1137 /// storage-class-specifier: 1138 /// 'register' 1139 /// 'static' 1140 /// 'extern' 1141 /// 'mutable' 1142 /// 'auto' 1143 /// [GNU] '__thread' 1144 /// [C++11] 'thread_local' 1145 /// [C11] '_Thread_local' 1146 /// 1147 /// function-specifier: 1148 /// 'inline' 1149 /// 'virtual' 1150 /// 'explicit' 1151 /// 1152 /// typedef-name: 1153 /// identifier 1154 /// 1155 /// type-specifier: 1156 /// simple-type-specifier 1157 /// class-specifier 1158 /// enum-specifier 1159 /// elaborated-type-specifier 1160 /// typename-specifier 1161 /// cv-qualifier 1162 /// 1163 /// simple-type-specifier: 1164 /// '::'[opt] nested-name-specifier[opt] type-name 1165 /// '::'[opt] nested-name-specifier 'template' 1166 /// simple-template-id [TODO] 1167 /// 'char' 1168 /// 'wchar_t' 1169 /// 'bool' 1170 /// 'short' 1171 /// 'int' 1172 /// 'long' 1173 /// 'signed' 1174 /// 'unsigned' 1175 /// 'float' 1176 /// 'double' 1177 /// 'void' 1178 /// [GNU] typeof-specifier 1179 /// [GNU] '_Complex' 1180 /// [C++11] 'auto' 1181 /// [GNU] '__auto_type' 1182 /// [C++11] 'decltype' ( expression ) 1183 /// [C++1y] 'decltype' ( 'auto' ) 1184 /// 1185 /// type-name: 1186 /// class-name 1187 /// enum-name 1188 /// typedef-name 1189 /// 1190 /// elaborated-type-specifier: 1191 /// class-key '::'[opt] nested-name-specifier[opt] identifier 1192 /// class-key '::'[opt] nested-name-specifier[opt] 'template'[opt] 1193 /// simple-template-id 1194 /// 'enum' '::'[opt] nested-name-specifier[opt] identifier 1195 /// 1196 /// enum-name: 1197 /// identifier 1198 /// 1199 /// enum-specifier: 1200 /// 'enum' identifier[opt] '{' enumerator-list[opt] '}' 1201 /// 'enum' identifier[opt] '{' enumerator-list ',' '}' 1202 /// 1203 /// class-specifier: 1204 /// class-head '{' member-specification[opt] '}' 1205 /// 1206 /// class-head: 1207 /// class-key identifier[opt] base-clause[opt] 1208 /// class-key nested-name-specifier identifier base-clause[opt] 1209 /// class-key nested-name-specifier[opt] simple-template-id 1210 /// base-clause[opt] 1211 /// 1212 /// class-key: 1213 /// 'class' 1214 /// 'struct' 1215 /// 'union' 1216 /// 1217 /// cv-qualifier: 1218 /// 'const' 1219 /// 'volatile' 1220 /// [GNU] restrict 1221 /// 1222 Parser::TPResult 1223 Parser::isCXXDeclarationSpecifier(Parser::TPResult BracedCastResult, 1224 bool *HasMissingTypename) { 1225 switch (Tok.getKind()) { 1226 case tok::identifier: { 1227 // Check for need to substitute AltiVec __vector keyword 1228 // for "vector" identifier. 1229 if (TryAltiVecVectorToken()) 1230 return TPResult::True; 1231 1232 const Token &Next = NextToken(); 1233 // In 'foo bar', 'foo' is always a type name outside of Objective-C. 1234 if (!getLangOpts().ObjC1 && Next.is(tok::identifier)) 1235 return TPResult::True; 1236 1237 if (Next.isNot(tok::coloncolon) && Next.isNot(tok::less)) { 1238 // Determine whether this is a valid expression. If not, we will hit 1239 // a parse error one way or another. In that case, tell the caller that 1240 // this is ambiguous. Typo-correct to type and expression keywords and 1241 // to types and identifiers, in order to try to recover from errors. 1242 switch (TryAnnotateName(false /* no nested name specifier */, 1243 llvm::make_unique<TentativeParseCCC>(Next))) { 1244 case ANK_Error: 1245 return TPResult::Error; 1246 case ANK_TentativeDecl: 1247 return TPResult::False; 1248 case ANK_TemplateName: 1249 // A bare type template-name which can't be a template template 1250 // argument is an error, and was probably intended to be a type. 1251 return GreaterThanIsOperator ? TPResult::True : TPResult::False; 1252 case ANK_Unresolved: 1253 return HasMissingTypename ? TPResult::Ambiguous : TPResult::False; 1254 case ANK_Success: 1255 break; 1256 } 1257 assert(Tok.isNot(tok::identifier) && 1258 "TryAnnotateName succeeded without producing an annotation"); 1259 } else { 1260 // This might possibly be a type with a dependent scope specifier and 1261 // a missing 'typename' keyword. Don't use TryAnnotateName in this case, 1262 // since it will annotate as a primary expression, and we want to use the 1263 // "missing 'typename'" logic. 1264 if (TryAnnotateTypeOrScopeToken()) 1265 return TPResult::Error; 1266 // If annotation failed, assume it's a non-type. 1267 // FIXME: If this happens due to an undeclared identifier, treat it as 1268 // ambiguous. 1269 if (Tok.is(tok::identifier)) 1270 return TPResult::False; 1271 } 1272 1273 // We annotated this token as something. Recurse to handle whatever we got. 1274 return isCXXDeclarationSpecifier(BracedCastResult, HasMissingTypename); 1275 } 1276 1277 case tok::kw_typename: // typename T::type 1278 // Annotate typenames and C++ scope specifiers. If we get one, just 1279 // recurse to handle whatever we get. 1280 if (TryAnnotateTypeOrScopeToken()) 1281 return TPResult::Error; 1282 return isCXXDeclarationSpecifier(BracedCastResult, HasMissingTypename); 1283 1284 case tok::coloncolon: { // ::foo::bar 1285 const Token &Next = NextToken(); 1286 if (Next.isOneOf(tok::kw_new, // ::new 1287 tok::kw_delete)) // ::delete 1288 return TPResult::False; 1289 } 1290 // Fall through. 1291 case tok::kw___super: 1292 case tok::kw_decltype: 1293 // Annotate typenames and C++ scope specifiers. If we get one, just 1294 // recurse to handle whatever we get. 1295 if (TryAnnotateTypeOrScopeToken()) 1296 return TPResult::Error; 1297 return isCXXDeclarationSpecifier(BracedCastResult, HasMissingTypename); 1298 1299 // decl-specifier: 1300 // storage-class-specifier 1301 // type-specifier 1302 // function-specifier 1303 // 'friend' 1304 // 'typedef' 1305 // 'constexpr' 1306 case tok::kw_friend: 1307 case tok::kw_typedef: 1308 case tok::kw_constexpr: 1309 // storage-class-specifier 1310 case tok::kw_register: 1311 case tok::kw_static: 1312 case tok::kw_extern: 1313 case tok::kw_mutable: 1314 case tok::kw_auto: 1315 case tok::kw___thread: 1316 case tok::kw_thread_local: 1317 case tok::kw__Thread_local: 1318 // function-specifier 1319 case tok::kw_inline: 1320 case tok::kw_virtual: 1321 case tok::kw_explicit: 1322 1323 // Modules 1324 case tok::kw___module_private__: 1325 1326 // Debugger support 1327 case tok::kw___unknown_anytype: 1328 1329 // type-specifier: 1330 // simple-type-specifier 1331 // class-specifier 1332 // enum-specifier 1333 // elaborated-type-specifier 1334 // typename-specifier 1335 // cv-qualifier 1336 1337 // class-specifier 1338 // elaborated-type-specifier 1339 case tok::kw_class: 1340 case tok::kw_struct: 1341 case tok::kw_union: 1342 case tok::kw___interface: 1343 // enum-specifier 1344 case tok::kw_enum: 1345 // cv-qualifier 1346 case tok::kw_const: 1347 case tok::kw_volatile: 1348 1349 // GNU 1350 case tok::kw_restrict: 1351 case tok::kw__Complex: 1352 case tok::kw___attribute: 1353 case tok::kw___auto_type: 1354 return TPResult::True; 1355 1356 // Microsoft 1357 case tok::kw___declspec: 1358 case tok::kw___cdecl: 1359 case tok::kw___stdcall: 1360 case tok::kw___fastcall: 1361 case tok::kw___thiscall: 1362 case tok::kw___regcall: 1363 case tok::kw___vectorcall: 1364 case tok::kw___w64: 1365 case tok::kw___sptr: 1366 case tok::kw___uptr: 1367 case tok::kw___ptr64: 1368 case tok::kw___ptr32: 1369 case tok::kw___forceinline: 1370 case tok::kw___unaligned: 1371 case tok::kw__Nonnull: 1372 case tok::kw__Nullable: 1373 case tok::kw__Null_unspecified: 1374 case tok::kw___kindof: 1375 return TPResult::True; 1376 1377 // Borland 1378 case tok::kw___pascal: 1379 return TPResult::True; 1380 1381 // AltiVec 1382 case tok::kw___vector: 1383 return TPResult::True; 1384 1385 case tok::annot_template_id: { 1386 TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); 1387 if (TemplateId->Kind != TNK_Type_template) 1388 return TPResult::False; 1389 CXXScopeSpec SS; 1390 AnnotateTemplateIdTokenAsType(); 1391 assert(Tok.is(tok::annot_typename)); 1392 goto case_typename; 1393 } 1394 1395 case tok::annot_cxxscope: // foo::bar or ::foo::bar, but already parsed 1396 // We've already annotated a scope; try to annotate a type. 1397 if (TryAnnotateTypeOrScopeToken()) 1398 return TPResult::Error; 1399 if (!Tok.is(tok::annot_typename)) { 1400 // If the next token is an identifier or a type qualifier, then this 1401 // can't possibly be a valid expression either. 1402 if (Tok.is(tok::annot_cxxscope) && NextToken().is(tok::identifier)) { 1403 CXXScopeSpec SS; 1404 Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(), 1405 Tok.getAnnotationRange(), 1406 SS); 1407 if (SS.getScopeRep() && SS.getScopeRep()->isDependent()) { 1408 RevertingTentativeParsingAction PA(*this); 1409 ConsumeAnnotationToken(); 1410 ConsumeToken(); 1411 bool isIdentifier = Tok.is(tok::identifier); 1412 TPResult TPR = TPResult::False; 1413 if (!isIdentifier) 1414 TPR = isCXXDeclarationSpecifier(BracedCastResult, 1415 HasMissingTypename); 1416 1417 if (isIdentifier || 1418 TPR == TPResult::True || TPR == TPResult::Error) 1419 return TPResult::Error; 1420 1421 if (HasMissingTypename) { 1422 // We can't tell whether this is a missing 'typename' or a valid 1423 // expression. 1424 *HasMissingTypename = true; 1425 return TPResult::Ambiguous; 1426 } 1427 1428 // FIXME: Fails to either revert or commit the tentative parse! 1429 } else { 1430 // Try to resolve the name. If it doesn't exist, assume it was 1431 // intended to name a type and keep disambiguating. 1432 switch (TryAnnotateName(false /* SS is not dependent */)) { 1433 case ANK_Error: 1434 return TPResult::Error; 1435 case ANK_TentativeDecl: 1436 return TPResult::False; 1437 case ANK_TemplateName: 1438 // A bare type template-name which can't be a template template 1439 // argument is an error, and was probably intended to be a type. 1440 return GreaterThanIsOperator ? TPResult::True : TPResult::False; 1441 case ANK_Unresolved: 1442 return HasMissingTypename ? TPResult::Ambiguous 1443 : TPResult::False; 1444 case ANK_Success: 1445 // Annotated it, check again. 1446 assert(Tok.isNot(tok::annot_cxxscope) || 1447 NextToken().isNot(tok::identifier)); 1448 return isCXXDeclarationSpecifier(BracedCastResult, 1449 HasMissingTypename); 1450 } 1451 } 1452 } 1453 return TPResult::False; 1454 } 1455 // If that succeeded, fallthrough into the generic simple-type-id case. 1456 LLVM_FALLTHROUGH; 1457 1458 // The ambiguity resides in a simple-type-specifier/typename-specifier 1459 // followed by a '('. The '(' could either be the start of: 1460 // 1461 // direct-declarator: 1462 // '(' declarator ')' 1463 // 1464 // direct-abstract-declarator: 1465 // '(' parameter-declaration-clause ')' cv-qualifier-seq[opt] 1466 // exception-specification[opt] 1467 // '(' abstract-declarator ')' 1468 // 1469 // or part of a function-style cast expression: 1470 // 1471 // simple-type-specifier '(' expression-list[opt] ')' 1472 // 1473 1474 // simple-type-specifier: 1475 1476 case tok::annot_typename: 1477 case_typename: 1478 // In Objective-C, we might have a protocol-qualified type. 1479 if (getLangOpts().ObjC1 && NextToken().is(tok::less)) { 1480 // Tentatively parse the protocol qualifiers. 1481 RevertingTentativeParsingAction PA(*this); 1482 ConsumeAnyToken(); // The type token 1483 1484 TPResult TPR = TryParseProtocolQualifiers(); 1485 bool isFollowedByParen = Tok.is(tok::l_paren); 1486 bool isFollowedByBrace = Tok.is(tok::l_brace); 1487 1488 if (TPR == TPResult::Error) 1489 return TPResult::Error; 1490 1491 if (isFollowedByParen) 1492 return TPResult::Ambiguous; 1493 1494 if (getLangOpts().CPlusPlus11 && isFollowedByBrace) 1495 return BracedCastResult; 1496 1497 return TPResult::True; 1498 } 1499 LLVM_FALLTHROUGH; 1500 1501 case tok::kw_char: 1502 case tok::kw_wchar_t: 1503 case tok::kw_char16_t: 1504 case tok::kw_char32_t: 1505 case tok::kw_bool: 1506 case tok::kw_short: 1507 case tok::kw_int: 1508 case tok::kw_long: 1509 case tok::kw___int64: 1510 case tok::kw___int128: 1511 case tok::kw_signed: 1512 case tok::kw_unsigned: 1513 case tok::kw_half: 1514 case tok::kw_float: 1515 case tok::kw_double: 1516 case tok::kw__Float16: 1517 case tok::kw___float128: 1518 case tok::kw_void: 1519 case tok::annot_decltype: 1520 if (NextToken().is(tok::l_paren)) 1521 return TPResult::Ambiguous; 1522 1523 // This is a function-style cast in all cases we disambiguate other than 1524 // one: 1525 // struct S { 1526 // enum E : int { a = 4 }; // enum 1527 // enum E : int { 4 }; // bit-field 1528 // }; 1529 if (getLangOpts().CPlusPlus11 && NextToken().is(tok::l_brace)) 1530 return BracedCastResult; 1531 1532 if (isStartOfObjCClassMessageMissingOpenBracket()) 1533 return TPResult::False; 1534 1535 return TPResult::True; 1536 1537 // GNU typeof support. 1538 case tok::kw_typeof: { 1539 if (NextToken().isNot(tok::l_paren)) 1540 return TPResult::True; 1541 1542 RevertingTentativeParsingAction PA(*this); 1543 1544 TPResult TPR = TryParseTypeofSpecifier(); 1545 bool isFollowedByParen = Tok.is(tok::l_paren); 1546 bool isFollowedByBrace = Tok.is(tok::l_brace); 1547 1548 if (TPR == TPResult::Error) 1549 return TPResult::Error; 1550 1551 if (isFollowedByParen) 1552 return TPResult::Ambiguous; 1553 1554 if (getLangOpts().CPlusPlus11 && isFollowedByBrace) 1555 return BracedCastResult; 1556 1557 return TPResult::True; 1558 } 1559 1560 // C++0x type traits support 1561 case tok::kw___underlying_type: 1562 return TPResult::True; 1563 1564 // C11 _Atomic 1565 case tok::kw__Atomic: 1566 return TPResult::True; 1567 1568 default: 1569 return TPResult::False; 1570 } 1571 } 1572 1573 bool Parser::isCXXDeclarationSpecifierAType() { 1574 switch (Tok.getKind()) { 1575 // typename-specifier 1576 case tok::annot_decltype: 1577 case tok::annot_template_id: 1578 case tok::annot_typename: 1579 case tok::kw_typeof: 1580 case tok::kw___underlying_type: 1581 return true; 1582 1583 // elaborated-type-specifier 1584 case tok::kw_class: 1585 case tok::kw_struct: 1586 case tok::kw_union: 1587 case tok::kw___interface: 1588 case tok::kw_enum: 1589 return true; 1590 1591 // simple-type-specifier 1592 case tok::kw_char: 1593 case tok::kw_wchar_t: 1594 case tok::kw_char16_t: 1595 case tok::kw_char32_t: 1596 case tok::kw_bool: 1597 case tok::kw_short: 1598 case tok::kw_int: 1599 case tok::kw_long: 1600 case tok::kw___int64: 1601 case tok::kw___int128: 1602 case tok::kw_signed: 1603 case tok::kw_unsigned: 1604 case tok::kw_half: 1605 case tok::kw_float: 1606 case tok::kw_double: 1607 case tok::kw__Float16: 1608 case tok::kw___float128: 1609 case tok::kw_void: 1610 case tok::kw___unknown_anytype: 1611 case tok::kw___auto_type: 1612 return true; 1613 1614 case tok::kw_auto: 1615 return getLangOpts().CPlusPlus11; 1616 1617 case tok::kw__Atomic: 1618 // "_Atomic foo" 1619 return NextToken().is(tok::l_paren); 1620 1621 default: 1622 return false; 1623 } 1624 } 1625 1626 /// [GNU] typeof-specifier: 1627 /// 'typeof' '(' expressions ')' 1628 /// 'typeof' '(' type-name ')' 1629 /// 1630 Parser::TPResult Parser::TryParseTypeofSpecifier() { 1631 assert(Tok.is(tok::kw_typeof) && "Expected 'typeof'!"); 1632 ConsumeToken(); 1633 1634 assert(Tok.is(tok::l_paren) && "Expected '('"); 1635 // Parse through the parens after 'typeof'. 1636 ConsumeParen(); 1637 if (!SkipUntil(tok::r_paren, StopAtSemi)) 1638 return TPResult::Error; 1639 1640 return TPResult::Ambiguous; 1641 } 1642 1643 /// [ObjC] protocol-qualifiers: 1644 //// '<' identifier-list '>' 1645 Parser::TPResult Parser::TryParseProtocolQualifiers() { 1646 assert(Tok.is(tok::less) && "Expected '<' for qualifier list"); 1647 ConsumeToken(); 1648 do { 1649 if (Tok.isNot(tok::identifier)) 1650 return TPResult::Error; 1651 ConsumeToken(); 1652 1653 if (Tok.is(tok::comma)) { 1654 ConsumeToken(); 1655 continue; 1656 } 1657 1658 if (Tok.is(tok::greater)) { 1659 ConsumeToken(); 1660 return TPResult::Ambiguous; 1661 } 1662 } while (false); 1663 1664 return TPResult::Error; 1665 } 1666 1667 /// isCXXFunctionDeclarator - Disambiguates between a function declarator or 1668 /// a constructor-style initializer, when parsing declaration statements. 1669 /// Returns true for function declarator and false for constructor-style 1670 /// initializer. 1671 /// If during the disambiguation process a parsing error is encountered, 1672 /// the function returns true to let the declaration parsing code handle it. 1673 /// 1674 /// '(' parameter-declaration-clause ')' cv-qualifier-seq[opt] 1675 /// exception-specification[opt] 1676 /// 1677 bool Parser::isCXXFunctionDeclarator(bool *IsAmbiguous) { 1678 1679 // C++ 8.2p1: 1680 // The ambiguity arising from the similarity between a function-style cast and 1681 // a declaration mentioned in 6.8 can also occur in the context of a 1682 // declaration. In that context, the choice is between a function declaration 1683 // with a redundant set of parentheses around a parameter name and an object 1684 // declaration with a function-style cast as the initializer. Just as for the 1685 // ambiguities mentioned in 6.8, the resolution is to consider any construct 1686 // that could possibly be a declaration a declaration. 1687 1688 RevertingTentativeParsingAction PA(*this); 1689 1690 ConsumeParen(); 1691 bool InvalidAsDeclaration = false; 1692 TPResult TPR = TryParseParameterDeclarationClause(&InvalidAsDeclaration); 1693 if (TPR == TPResult::Ambiguous) { 1694 if (Tok.isNot(tok::r_paren)) 1695 TPR = TPResult::False; 1696 else { 1697 const Token &Next = NextToken(); 1698 if (Next.isOneOf(tok::amp, tok::ampamp, tok::kw_const, tok::kw_volatile, 1699 tok::kw_throw, tok::kw_noexcept, tok::l_square, 1700 tok::l_brace, tok::kw_try, tok::equal, tok::arrow) || 1701 isCXX11VirtSpecifier(Next)) 1702 // The next token cannot appear after a constructor-style initializer, 1703 // and can appear next in a function definition. This must be a function 1704 // declarator. 1705 TPR = TPResult::True; 1706 else if (InvalidAsDeclaration) 1707 // Use the absence of 'typename' as a tie-breaker. 1708 TPR = TPResult::False; 1709 } 1710 } 1711 1712 if (IsAmbiguous && TPR == TPResult::Ambiguous) 1713 *IsAmbiguous = true; 1714 1715 // In case of an error, let the declaration parsing code handle it. 1716 return TPR != TPResult::False; 1717 } 1718 1719 /// parameter-declaration-clause: 1720 /// parameter-declaration-list[opt] '...'[opt] 1721 /// parameter-declaration-list ',' '...' 1722 /// 1723 /// parameter-declaration-list: 1724 /// parameter-declaration 1725 /// parameter-declaration-list ',' parameter-declaration 1726 /// 1727 /// parameter-declaration: 1728 /// attribute-specifier-seq[opt] decl-specifier-seq declarator attributes[opt] 1729 /// attribute-specifier-seq[opt] decl-specifier-seq declarator attributes[opt] 1730 /// '=' assignment-expression 1731 /// attribute-specifier-seq[opt] decl-specifier-seq abstract-declarator[opt] 1732 /// attributes[opt] 1733 /// attribute-specifier-seq[opt] decl-specifier-seq abstract-declarator[opt] 1734 /// attributes[opt] '=' assignment-expression 1735 /// 1736 Parser::TPResult 1737 Parser::TryParseParameterDeclarationClause(bool *InvalidAsDeclaration, 1738 bool VersusTemplateArgument) { 1739 1740 if (Tok.is(tok::r_paren)) 1741 return TPResult::Ambiguous; 1742 1743 // parameter-declaration-list[opt] '...'[opt] 1744 // parameter-declaration-list ',' '...' 1745 // 1746 // parameter-declaration-list: 1747 // parameter-declaration 1748 // parameter-declaration-list ',' parameter-declaration 1749 // 1750 while (1) { 1751 // '...'[opt] 1752 if (Tok.is(tok::ellipsis)) { 1753 ConsumeToken(); 1754 if (Tok.is(tok::r_paren)) 1755 return TPResult::True; // '...)' is a sign of a function declarator. 1756 else 1757 return TPResult::False; 1758 } 1759 1760 // An attribute-specifier-seq here is a sign of a function declarator. 1761 if (isCXX11AttributeSpecifier(/*Disambiguate*/false, 1762 /*OuterMightBeMessageSend*/true)) 1763 return TPResult::True; 1764 1765 ParsedAttributes attrs(AttrFactory); 1766 MaybeParseMicrosoftAttributes(attrs); 1767 1768 // decl-specifier-seq 1769 // A parameter-declaration's initializer must be preceded by an '=', so 1770 // decl-specifier-seq '{' is not a parameter in C++11. 1771 TPResult TPR = isCXXDeclarationSpecifier(TPResult::False, 1772 InvalidAsDeclaration); 1773 1774 if (VersusTemplateArgument && TPR == TPResult::True) { 1775 // Consume the decl-specifier-seq. We have to look past it, since a 1776 // type-id might appear here in a template argument. 1777 bool SeenType = false; 1778 do { 1779 SeenType |= isCXXDeclarationSpecifierAType(); 1780 if (TryConsumeDeclarationSpecifier() == TPResult::Error) 1781 return TPResult::Error; 1782 1783 // If we see a parameter name, this can't be a template argument. 1784 if (SeenType && Tok.is(tok::identifier)) 1785 return TPResult::True; 1786 1787 TPR = isCXXDeclarationSpecifier(TPResult::False, 1788 InvalidAsDeclaration); 1789 if (TPR == TPResult::Error) 1790 return TPR; 1791 } while (TPR != TPResult::False); 1792 } else if (TPR == TPResult::Ambiguous) { 1793 // Disambiguate what follows the decl-specifier. 1794 if (TryConsumeDeclarationSpecifier() == TPResult::Error) 1795 return TPResult::Error; 1796 } else 1797 return TPR; 1798 1799 // declarator 1800 // abstract-declarator[opt] 1801 TPR = TryParseDeclarator(true/*mayBeAbstract*/); 1802 if (TPR != TPResult::Ambiguous) 1803 return TPR; 1804 1805 // [GNU] attributes[opt] 1806 if (Tok.is(tok::kw___attribute)) 1807 return TPResult::True; 1808 1809 // If we're disambiguating a template argument in a default argument in 1810 // a class definition versus a parameter declaration, an '=' here 1811 // disambiguates the parse one way or the other. 1812 // If this is a parameter, it must have a default argument because 1813 // (a) the previous parameter did, and 1814 // (b) this must be the first declaration of the function, so we can't 1815 // inherit any default arguments from elsewhere. 1816 // If we see an ')', then we've reached the end of a 1817 // parameter-declaration-clause, and the last param is missing its default 1818 // argument. 1819 if (VersusTemplateArgument) 1820 return Tok.isOneOf(tok::equal, tok::r_paren) ? TPResult::True 1821 : TPResult::False; 1822 1823 if (Tok.is(tok::equal)) { 1824 // '=' assignment-expression 1825 // Parse through assignment-expression. 1826 // FIXME: assignment-expression may contain an unparenthesized comma. 1827 if (!SkipUntil(tok::comma, tok::r_paren, StopAtSemi | StopBeforeMatch)) 1828 return TPResult::Error; 1829 } 1830 1831 if (Tok.is(tok::ellipsis)) { 1832 ConsumeToken(); 1833 if (Tok.is(tok::r_paren)) 1834 return TPResult::True; // '...)' is a sign of a function declarator. 1835 else 1836 return TPResult::False; 1837 } 1838 1839 if (!TryConsumeToken(tok::comma)) 1840 break; 1841 } 1842 1843 return TPResult::Ambiguous; 1844 } 1845 1846 /// TryParseFunctionDeclarator - We parsed a '(' and we want to try to continue 1847 /// parsing as a function declarator. 1848 /// If TryParseFunctionDeclarator fully parsed the function declarator, it will 1849 /// return TPResult::Ambiguous, otherwise it will return either False() or 1850 /// Error(). 1851 /// 1852 /// '(' parameter-declaration-clause ')' cv-qualifier-seq[opt] 1853 /// exception-specification[opt] 1854 /// 1855 /// exception-specification: 1856 /// 'throw' '(' type-id-list[opt] ')' 1857 /// 1858 Parser::TPResult Parser::TryParseFunctionDeclarator() { 1859 1860 // The '(' is already parsed. 1861 1862 TPResult TPR = TryParseParameterDeclarationClause(); 1863 if (TPR == TPResult::Ambiguous && Tok.isNot(tok::r_paren)) 1864 TPR = TPResult::False; 1865 1866 if (TPR == TPResult::False || TPR == TPResult::Error) 1867 return TPR; 1868 1869 // Parse through the parens. 1870 if (!SkipUntil(tok::r_paren, StopAtSemi)) 1871 return TPResult::Error; 1872 1873 // cv-qualifier-seq 1874 while (Tok.isOneOf(tok::kw_const, tok::kw_volatile, tok::kw_restrict)) 1875 ConsumeToken(); 1876 1877 // ref-qualifier[opt] 1878 if (Tok.isOneOf(tok::amp, tok::ampamp)) 1879 ConsumeToken(); 1880 1881 // exception-specification 1882 if (Tok.is(tok::kw_throw)) { 1883 ConsumeToken(); 1884 if (Tok.isNot(tok::l_paren)) 1885 return TPResult::Error; 1886 1887 // Parse through the parens after 'throw'. 1888 ConsumeParen(); 1889 if (!SkipUntil(tok::r_paren, StopAtSemi)) 1890 return TPResult::Error; 1891 } 1892 if (Tok.is(tok::kw_noexcept)) { 1893 ConsumeToken(); 1894 // Possibly an expression as well. 1895 if (Tok.is(tok::l_paren)) { 1896 // Find the matching rparen. 1897 ConsumeParen(); 1898 if (!SkipUntil(tok::r_paren, StopAtSemi)) 1899 return TPResult::Error; 1900 } 1901 } 1902 1903 return TPResult::Ambiguous; 1904 } 1905 1906 /// '[' constant-expression[opt] ']' 1907 /// 1908 Parser::TPResult Parser::TryParseBracketDeclarator() { 1909 ConsumeBracket(); 1910 if (!SkipUntil(tok::r_square, StopAtSemi)) 1911 return TPResult::Error; 1912 1913 return TPResult::Ambiguous; 1914 } 1915