15404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis//===--- ParseTentative.cpp - Ambiguity Resolution Parsing ----------------===// 25404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis// 35404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis// The LLVM Compiler Infrastructure 45404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis// 55404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 65404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis// License. See LICENSE.TXT for details. 75404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis// 85404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 95404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis// 105404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis// This file implements the tentative parsing portions of the Parser 115404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis// interfaces, for ambiguity resolution. 125404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis// 135404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 145404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 155404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis#include "clang/Parse/Parser.h" 16500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/Parse/ParseDiagnostic.h" 1719510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/ParsedTemplate.h" 185404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidisusing namespace clang; 195404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 205404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// isCXXDeclarationStatement - C++-specialized function that disambiguates 215404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// between a declaration or an expression statement, when parsing function 225404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// bodies. Returns true for declaration, false for expression. 235404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 245404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// declaration-statement: 255404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// block-declaration 265404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 275404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// block-declaration: 285404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// simple-declaration 295404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// asm-definition 305404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// namespace-alias-definition 315404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// using-declaration 325404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// using-directive 33511d7aba3b12853fdb88729a0313b80a60eab8adAnders Carlsson/// [C++0x] static_assert-declaration 345404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 355404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// asm-definition: 365404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'asm' '(' string-literal ')' ';' 375404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 385404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// namespace-alias-definition: 395404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'namespace' identifier = qualified-namespace-specifier ';' 405404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 415404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// using-declaration: 425404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'using' typename[opt] '::'[opt] nested-name-specifier 435404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// unqualified-id ';' 445404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'using' '::' unqualified-id ; 455404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 465404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// using-directive: 475404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'using' 'namespace' '::'[opt] nested-name-specifier[opt] 485404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// namespace-name ';' 495404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 505404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidisbool Parser::isCXXDeclarationStatement() { 515404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis switch (Tok.getKind()) { 525404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // asm-definition 535404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_asm: 545404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // namespace-alias-definition 555404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_namespace: 565404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // using-declaration 575404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // using-directive 585404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_using: 59511d7aba3b12853fdb88729a0313b80a60eab8adAnders Carlsson // static_assert-declaration 60bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt case tok::kw_static_assert: 61c6eb44b321c543c5bcf28727228a0cceced57e2ePeter Collingbourne case tok::kw__Static_assert: 62511d7aba3b12853fdb88729a0313b80a60eab8adAnders Carlsson return true; 635404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // simple-declaration 64bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt default: 659490ab433deef70105d817616928d700f87642d9Eli Friedman return isCXXSimpleDeclaration(/*AllowForRangeDecl=*/false); 665404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 675404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis} 685404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 695404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// isCXXSimpleDeclaration - C++-specialized function that disambiguates 705404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// between a simple-declaration or an expression-statement. 715404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// If during the disambiguation process a parsing error is encountered, 725404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// the function returns true to let the declaration parsing code handle it. 735404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// Returns false if the statement is disambiguated as expression. 745404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 755404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// simple-declaration: 765404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// decl-specifier-seq init-declarator-list[opt] ';' 775404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 789490ab433deef70105d817616928d700f87642d9Eli Friedman/// (if AllowForRangeDecl specified) 799490ab433deef70105d817616928d700f87642d9Eli Friedman/// for ( for-range-declaration : for-range-initializer ) statement 809490ab433deef70105d817616928d700f87642d9Eli Friedman/// for-range-declaration: 819490ab433deef70105d817616928d700f87642d9Eli Friedman/// attribute-specifier-seqopt type-specifier-seq declarator 829490ab433deef70105d817616928d700f87642d9Eli Friedmanbool Parser::isCXXSimpleDeclaration(bool AllowForRangeDecl) { 835404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // C++ 6.8p1: 845404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // There is an ambiguity in the grammar involving expression-statements and 855404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // declarations: An expression-statement with a function-style explicit type 865404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // conversion (5.2.3) as its leftmost subexpression can be indistinguishable 875404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // from a declaration where the first declarator starts with a '('. In those 885404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // cases the statement is a declaration. [Note: To disambiguate, the whole 895404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // statement might have to be examined to determine if it is an 905404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // expression-statement or a declaration]. 915404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 925404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // C++ 6.8p3: 935404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // The disambiguation is purely syntactic; that is, the meaning of the names 945404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // occurring in such a statement, beyond whether they are type-names or not, 955404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // is not generally used in or changed by the disambiguation. Class 965404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // templates are instantiated as necessary to determine if a qualified name 975404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // is a type-name. Disambiguation precedes parsing, and a statement 985404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // disambiguated as a declaration may be an ill-formed declaration. 995404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1005404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // We don't have to parse all of the decl-specifier-seq part. There's only 1015404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // an ambiguity if the first decl-specifier is 1025404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // simple-type-specifier/typename-specifier followed by a '(', which may 1035404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // indicate a function-style cast expression. 104b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis // isCXXDeclarationSpecifier will return TPResult::Ambiguous() only in such 105b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis // a case. 1065404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 10740b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith bool InvalidAsDeclaration = false; 10840b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith TPResult TPR = isCXXDeclarationSpecifier(TPResult::False(), 10940b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith &InvalidAsDeclaration); 110b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis if (TPR != TPResult::Ambiguous()) 111b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPR != TPResult::False(); // Returns true for TPResult::True() or 112b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis // TPResult::Error(). 1135404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 11440b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith // FIXME: TryParseSimpleDeclaration doesn't look past the first initializer, 11540b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith // and so gets some cases wrong. We can't carry on if we've already seen 11640b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith // something which makes this statement invalid as a declaration in this case, 11740b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith // since it can cause us to misparse valid code. Revisit this once 11840b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith // TryParseInitDeclaratorList is fixed. 11940b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith if (InvalidAsDeclaration) 12040b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith return false; 12140b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith 1225404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // FIXME: Add statistics about the number of ambiguous statements encountered 1235404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // and how they were resolved (number of declarations+number of expressions). 1245404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 12540b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith // Ok, we have a simple-type-specifier/typename-specifier followed by a '(', 12640b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith // or an identifier which doesn't resolve as anything. We need tentative 12740b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith // parsing... 1285404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1295404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis TentativeParsingAction PA(*this); 1309490ab433deef70105d817616928d700f87642d9Eli Friedman TPR = TryParseSimpleDeclaration(AllowForRangeDecl); 1315404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis PA.Revert(); 1325404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1335404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // In case of an error, let the declaration parsing code handle it. 134b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis if (TPR == TPResult::Error()) 1355404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis return true; 1365404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1375404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // Declarations take precedence over expressions. 138b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis if (TPR == TPResult::Ambiguous()) 139b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis TPR = TPResult::True(); 1405404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 141b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis assert(TPR == TPResult::True() || TPR == TPResult::False()); 142b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPR == TPResult::True(); 1435404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis} 1445404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1455404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// simple-declaration: 1465404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// decl-specifier-seq init-declarator-list[opt] ';' 1475404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 1489490ab433deef70105d817616928d700f87642d9Eli Friedman/// (if AllowForRangeDecl specified) 1499490ab433deef70105d817616928d700f87642d9Eli Friedman/// for ( for-range-declaration : for-range-initializer ) statement 1509490ab433deef70105d817616928d700f87642d9Eli Friedman/// for-range-declaration: 1519490ab433deef70105d817616928d700f87642d9Eli Friedman/// attribute-specifier-seqopt type-specifier-seq declarator 1529490ab433deef70105d817616928d700f87642d9Eli Friedman/// 1539490ab433deef70105d817616928d700f87642d9Eli FriedmanParser::TPResult Parser::TryParseSimpleDeclaration(bool AllowForRangeDecl) { 1545404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (Tok.is(tok::kw_typeof)) 1555404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis TryParseTypeofSpecifier(); 1569bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor else { 15740b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith if (Tok.is(tok::annot_cxxscope)) 15840b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith ConsumeToken(); 1595404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeToken(); 16040b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith 1614e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().ObjC1 && Tok.is(tok::less)) 1629bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor TryParseProtocolQualifiers(); 1639bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor } 16440b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith 16540b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith // Two decl-specifiers in a row conclusively disambiguate this as being a 16640b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith // simple-declaration. Don't bother calling isCXXDeclarationSpecifier in the 16740b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith // overwhelmingly common case that the next token is a '('. 16840b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith if (Tok.isNot(tok::l_paren)) { 16940b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith TPResult TPR = isCXXDeclarationSpecifier(); 17040b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith if (TPR == TPResult::Ambiguous()) 17140b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith return TPResult::True(); 17240b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith if (TPR == TPResult::True() || TPR == TPResult::Error()) 17340b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith return TPR; 17440b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith assert(TPR == TPResult::False()); 17540b2e19cae6ab85407856c70f76278f9efbeeb7cRichard Smith } 1765404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 177b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis TPResult TPR = TryParseInitDeclaratorList(); 178b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis if (TPR != TPResult::Ambiguous()) 1795404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis return TPR; 1805404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1819490ab433deef70105d817616928d700f87642d9Eli Friedman if (Tok.isNot(tok::semi) && (!AllowForRangeDecl || Tok.isNot(tok::colon))) 182b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::False(); 1835404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 184b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Ambiguous(); 1855404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis} 1865404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1871ee2c43bc0c281b60b29f1883e1e206cae28aed6Argyrios Kyrtzidis/// init-declarator-list: 1881ee2c43bc0c281b60b29f1883e1e206cae28aed6Argyrios Kyrtzidis/// init-declarator 1891ee2c43bc0c281b60b29f1883e1e206cae28aed6Argyrios Kyrtzidis/// init-declarator-list ',' init-declarator 1905404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 1911ee2c43bc0c281b60b29f1883e1e206cae28aed6Argyrios Kyrtzidis/// init-declarator: 1921ee2c43bc0c281b60b29f1883e1e206cae28aed6Argyrios Kyrtzidis/// declarator initializer[opt] 1931ee2c43bc0c281b60b29f1883e1e206cae28aed6Argyrios Kyrtzidis/// [GNU] declarator simple-asm-expr[opt] attributes[opt] initializer[opt] 1945404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 1955404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// initializer: 1965404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// '=' initializer-clause 1975404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// '(' expression-list ')' 1985404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 1995404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// initializer-clause: 2005404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// assignment-expression 2015404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// '{' initializer-list ','[opt] '}' 2025404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// '{' '}' 2035404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 204b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios KyrtzidisParser::TPResult Parser::TryParseInitDeclaratorList() { 2055404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis while (1) { 2065404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // declarator 207b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis TPResult TPR = TryParseDeclarator(false/*mayBeAbstract*/); 208b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis if (TPR != TPResult::Ambiguous()) 2095404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis return TPR; 2105404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 2111ee2c43bc0c281b60b29f1883e1e206cae28aed6Argyrios Kyrtzidis // [GNU] simple-asm-expr[opt] attributes[opt] 2121ee2c43bc0c281b60b29f1883e1e206cae28aed6Argyrios Kyrtzidis if (Tok.is(tok::kw_asm) || Tok.is(tok::kw___attribute)) 213b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::True(); 2141ee2c43bc0c281b60b29f1883e1e206cae28aed6Argyrios Kyrtzidis 2155404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // initializer[opt] 2165404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (Tok.is(tok::l_paren)) { 2175404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // Parse through the parens. 2185404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeParen(); 2195404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (!SkipUntil(tok::r_paren)) 220b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Error(); 221f459beb2fa7c5441eae4b1f5311f6a2ea60f6b00Fariborz Jahanian } else if (Tok.is(tok::equal) || isTokIdentifier_in()) { 22206b7080b04ba799379469c03471558e4222921ceDouglas Gregor // MSVC and g++ won't examine the rest of declarators if '=' is 22306b7080b04ba799379469c03471558e4222921ceDouglas Gregor // encountered; they just conclude that we have a declaration. 22406b7080b04ba799379469c03471558e4222921ceDouglas Gregor // EDG parses the initializer completely, which is the proper behavior 22506b7080b04ba799379469c03471558e4222921ceDouglas Gregor // for this case. 2265404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // 22706b7080b04ba799379469c03471558e4222921ceDouglas Gregor // At present, Clang follows MSVC and g++, since the parser does not have 22806b7080b04ba799379469c03471558e4222921ceDouglas Gregor // the ability to parse an expression fully without recording the 22906b7080b04ba799379469c03471558e4222921ceDouglas Gregor // results of that parse. 230f459beb2fa7c5441eae4b1f5311f6a2ea60f6b00Fariborz Jahanian // Also allow 'in' after on objective-c declaration as in: 231f459beb2fa7c5441eae4b1f5311f6a2ea60f6b00Fariborz Jahanian // for (int (^b)(void) in array). Ideally this should be done in the 232f459beb2fa7c5441eae4b1f5311f6a2ea60f6b00Fariborz Jahanian // context of parsing for-init-statement of a foreach statement only. But, 233f459beb2fa7c5441eae4b1f5311f6a2ea60f6b00Fariborz Jahanian // in any other context 'in' is invalid after a declaration and parser 234f459beb2fa7c5441eae4b1f5311f6a2ea60f6b00Fariborz Jahanian // issues the error regardless of outcome of this decision. 235f459beb2fa7c5441eae4b1f5311f6a2ea60f6b00Fariborz Jahanian // FIXME. Change if above assumption does not hold. 23606b7080b04ba799379469c03471558e4222921ceDouglas Gregor return TPResult::True(); 2375404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 2385404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 2395404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (Tok.isNot(tok::comma)) 2405404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis break; 2415404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeToken(); // the comma. 2425404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 2435404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 244b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Ambiguous(); 2455404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis} 2465404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 247a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis/// isCXXConditionDeclaration - Disambiguates between a declaration or an 248a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis/// expression for a condition of a if/switch/while/for statement. 249a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis/// If during the disambiguation process a parsing error is encountered, 250a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis/// the function returns true to let the declaration parsing code handle it. 251a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis/// 252a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis/// condition: 253a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis/// expression 254a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis/// type-specifier-seq declarator '=' assignment-expression 255d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith/// [C++11] type-specifier-seq declarator '=' initializer-clause 256d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith/// [C++11] type-specifier-seq declarator braced-init-list 257a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis/// [GNU] type-specifier-seq declarator simple-asm-expr[opt] attributes[opt] 258a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis/// '=' assignment-expression 259a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis/// 260a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidisbool Parser::isCXXConditionDeclaration() { 261b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis TPResult TPR = isCXXDeclarationSpecifier(); 262b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis if (TPR != TPResult::Ambiguous()) 263b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPR != TPResult::False(); // Returns true for TPResult::True() or 264b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis // TPResult::Error(). 265a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis 266a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis // FIXME: Add statistics about the number of ambiguous statements encountered 267a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis // and how they were resolved (number of declarations+number of expressions). 268a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis 269a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis // Ok, we have a simple-type-specifier/typename-specifier followed by a '('. 270a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis // We need tentative parsing... 271a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis 272a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis TentativeParsingAction PA(*this); 273a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis 274a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis // type-specifier-seq 275a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis if (Tok.is(tok::kw_typeof)) 276a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis TryParseTypeofSpecifier(); 2779bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor else { 278a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis ConsumeToken(); 2799bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor 2804e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().ObjC1 && Tok.is(tok::less)) 2819bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor TryParseProtocolQualifiers(); 2829bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor } 283a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis assert(Tok.is(tok::l_paren) && "Expected '('"); 284a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis 285a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis // declarator 286a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis TPR = TryParseDeclarator(false/*mayBeAbstract*/); 287a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis 288a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis // In case of an error, let the declaration parsing code handle it. 289b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis if (TPR == TPResult::Error()) 290b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis TPR = TPResult::True(); 291a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis 292b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis if (TPR == TPResult::Ambiguous()) { 293a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis // '=' 294a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis // [GNU] simple-asm-expr[opt] attributes[opt] 295a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis if (Tok.is(tok::equal) || 296a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis Tok.is(tok::kw_asm) || Tok.is(tok::kw___attribute)) 297b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis TPR = TPResult::True(); 2984e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie else if (getLangOpts().CPlusPlus0x && Tok.is(tok::l_brace)) 299d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith TPR = TPResult::True(); 300a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis else 301b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis TPR = TPResult::False(); 302a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis } 303a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis 304ca35baa788ccba7a213365b9d64d6b2f7bdb9afeArgyrios Kyrtzidis PA.Revert(); 305ca35baa788ccba7a213365b9d64d6b2f7bdb9afeArgyrios Kyrtzidis 306b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis assert(TPR == TPResult::True() || TPR == TPResult::False()); 307b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPR == TPResult::True(); 308a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis} 309a8a4598b6f2a07339ab8a1248295a07d771a2b2aArgyrios Kyrtzidis 3101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Determine whether the next set of tokens contains a type-id. 3118b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// 3128b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// The context parameter states what context we're parsing right 3138b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// now, which affects how this routine copes with the token 3148b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// following the type-id. If the context is TypeIdInParens, we have 3158b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// already parsed the '(' and we will cease lookahead when we hit 3168b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// the corresponding ')'. If the context is 3178b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// TypeIdAsTemplateArgument, we've already parsed the '<' or ',' 3188b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// before this template argument, and will cease lookahead when we 3198b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// hit a '>', '>>' (in C++0x), or ','. Returns true for a type-id 3208b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// and false for an expression. If during the disambiguation 3218b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// process a parsing error is encountered, the function returns 3228b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// true to let the declaration parsing code handle it. 3238b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// 3248b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// type-id: 3258b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// type-specifier-seq abstract-declarator[opt] 3268b642592a35167a3780074e78674e0bece87c40cDouglas Gregor /// 327f58f45e6d76792df8c643ce1c6d364dce5db4826Argyrios Kyrtzidisbool Parser::isCXXTypeId(TentativeCXXTypeIdContext Context, bool &isAmbiguous) { 3281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 329f58f45e6d76792df8c643ce1c6d364dce5db4826Argyrios Kyrtzidis isAmbiguous = false; 330d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis 331d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis // C++ 8.2p2: 332d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis // The ambiguity arising from the similarity between a function-style cast and 333d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis // a type-id can occur in different contexts. The ambiguity appears as a 334d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis // choice between a function-style cast expression and a declaration of a 335d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis // type. The resolution is that any construct that could possibly be a type-id 336d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis // in its syntactic context shall be considered a type-id. 337d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis 33878c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis TPResult TPR = isCXXDeclarationSpecifier(); 33978c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis if (TPR != TPResult::Ambiguous()) 34078c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis return TPR != TPResult::False(); // Returns true for TPResult::True() or 34178c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis // TPResult::Error(). 34278c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis 34378c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis // FIXME: Add statistics about the number of ambiguous statements encountered 34478c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis // and how they were resolved (number of declarations+number of expressions). 34578c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis 34678c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis // Ok, we have a simple-type-specifier/typename-specifier followed by a '('. 34778c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis // We need tentative parsing... 34878c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis 34978c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis TentativeParsingAction PA(*this); 35078c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis 35178c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis // type-specifier-seq 35278c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis if (Tok.is(tok::kw_typeof)) 35378c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis TryParseTypeofSpecifier(); 3549bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor else { 35578c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis ConsumeToken(); 3569bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor 3574e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().ObjC1 && Tok.is(tok::less)) 3589bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor TryParseProtocolQualifiers(); 3599bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor } 3609bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor 36178c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis assert(Tok.is(tok::l_paren) && "Expected '('"); 36278c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis 36378c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis // declarator 36478c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis TPR = TryParseDeclarator(true/*mayBeAbstract*/, false/*mayHaveIdentifier*/); 36578c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis 36678c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis // In case of an error, let the declaration parsing code handle it. 36778c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis if (TPR == TPResult::Error()) 36878c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis TPR = TPResult::True(); 36978c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis 37078c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis if (TPR == TPResult::Ambiguous()) { 37178c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis // We are supposed to be inside parens, so if after the abstract declarator 37278c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis // we encounter a ')' this is a type-id, otherwise it's an expression. 373f58f45e6d76792df8c643ce1c6d364dce5db4826Argyrios Kyrtzidis if (Context == TypeIdInParens && Tok.is(tok::r_paren)) { 3748b642592a35167a3780074e78674e0bece87c40cDouglas Gregor TPR = TPResult::True(); 375f58f45e6d76792df8c643ce1c6d364dce5db4826Argyrios Kyrtzidis isAmbiguous = true; 376f58f45e6d76792df8c643ce1c6d364dce5db4826Argyrios Kyrtzidis 3778b642592a35167a3780074e78674e0bece87c40cDouglas Gregor // We are supposed to be inside a template argument, so if after 3788b642592a35167a3780074e78674e0bece87c40cDouglas Gregor // the abstract declarator we encounter a '>', '>>' (in C++0x), or 3798b642592a35167a3780074e78674e0bece87c40cDouglas Gregor // ',', this is a type-id. Otherwise, it's an expression. 380f58f45e6d76792df8c643ce1c6d364dce5db4826Argyrios Kyrtzidis } else if (Context == TypeIdAsTemplateArgument && 381f58f45e6d76792df8c643ce1c6d364dce5db4826Argyrios Kyrtzidis (Tok.is(tok::greater) || Tok.is(tok::comma) || 3824e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie (getLangOpts().CPlusPlus0x && Tok.is(tok::greatergreater)))) { 38378c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis TPR = TPResult::True(); 384f58f45e6d76792df8c643ce1c6d364dce5db4826Argyrios Kyrtzidis isAmbiguous = true; 385f58f45e6d76792df8c643ce1c6d364dce5db4826Argyrios Kyrtzidis 386f58f45e6d76792df8c643ce1c6d364dce5db4826Argyrios Kyrtzidis } else 38778c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis TPR = TPResult::False(); 38878c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis } 38978c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis 39078c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis PA.Revert(); 39178c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis 39278c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis assert(TPR == TPResult::True() || TPR == TPResult::False()); 39378c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis return TPR == TPResult::True(); 39478c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis} 39578c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis 3966ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// \brief Returns true if this is a C++11 attribute-specifier. Per 3976ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// C++11 [dcl.attr.grammar]p6, two consecutive left square bracket tokens 3986ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// always introduce an attribute. In Objective-C++11, this rule does not 3996ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// apply if either '[' begins a message-send. 400bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// 4016ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// If Disambiguate is true, we try harder to determine whether a '[[' starts 4026ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// an attribute-specifier, and return CAK_InvalidAttributeSpecifier if not. 403bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// 4046ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// If OuterMightBeMessageSend is true, we assume the outer '[' is either an 4056ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// Obj-C message send or the start of an attribute. Otherwise, we assume it 4066ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// is not an Obj-C message send. 407bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// 4086ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// C++11 [dcl.attr.grammar]: 4096ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// 4106ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// attribute-specifier: 411bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// '[' '[' attribute-list ']' ']' 41282d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne/// alignment-specifier 413bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// 4146ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// attribute-list: 415bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// attribute[opt] 416bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// attribute-list ',' attribute[opt] 4176ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// attribute '...' 4186ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// attribute-list ',' attribute '...' 419bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// 4206ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// attribute: 421bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// attribute-token attribute-argument-clause[opt] 422bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// 4236ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// attribute-token: 424bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// identifier 4256ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// identifier '::' identifier 426bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// 4276ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// attribute-argument-clause: 428bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt/// '(' balanced-token-seq ')' 4296ee326af4e77e6f05973486097884d7431f2108dRichard SmithParser::CXX11AttributeKind 4306ee326af4e77e6f05973486097884d7431f2108dRichard SmithParser::isCXX11AttributeSpecifier(bool Disambiguate, 4316ee326af4e77e6f05973486097884d7431f2108dRichard Smith bool OuterMightBeMessageSend) { 43282d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne if (Tok.is(tok::kw_alignas)) 4336ee326af4e77e6f05973486097884d7431f2108dRichard Smith return CAK_AttributeSpecifier; 43482d0b0aab9088e977c2a44c4a5a90479c63149fePeter Collingbourne 435bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt if (Tok.isNot(tok::l_square) || NextToken().isNot(tok::l_square)) 4366ee326af4e77e6f05973486097884d7431f2108dRichard Smith return CAK_NotAttributeSpecifier; 437bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 4386ee326af4e77e6f05973486097884d7431f2108dRichard Smith // No tentative parsing if we don't need to look for ']]' or a lambda. 4396ee326af4e77e6f05973486097884d7431f2108dRichard Smith if (!Disambiguate && !getLangOpts().ObjC1) 4406ee326af4e77e6f05973486097884d7431f2108dRichard Smith return CAK_AttributeSpecifier; 4416ee326af4e77e6f05973486097884d7431f2108dRichard Smith 4426ee326af4e77e6f05973486097884d7431f2108dRichard Smith TentativeParsingAction PA(*this); 443bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 444bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt // Opening brackets were checked for above. 445bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt ConsumeBracket(); 446bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 4476ee326af4e77e6f05973486097884d7431f2108dRichard Smith // Outside Obj-C++11, treat anything with a matching ']]' as an attribute. 4486ee326af4e77e6f05973486097884d7431f2108dRichard Smith if (!getLangOpts().ObjC1) { 4496ee326af4e77e6f05973486097884d7431f2108dRichard Smith ConsumeBracket(); 4506ee326af4e77e6f05973486097884d7431f2108dRichard Smith 4516ee326af4e77e6f05973486097884d7431f2108dRichard Smith bool IsAttribute = SkipUntil(tok::r_square, false); 4526ee326af4e77e6f05973486097884d7431f2108dRichard Smith IsAttribute &= Tok.is(tok::r_square); 4536ee326af4e77e6f05973486097884d7431f2108dRichard Smith 4546ee326af4e77e6f05973486097884d7431f2108dRichard Smith PA.Revert(); 4556ee326af4e77e6f05973486097884d7431f2108dRichard Smith 4566ee326af4e77e6f05973486097884d7431f2108dRichard Smith return IsAttribute ? CAK_AttributeSpecifier : CAK_InvalidAttributeSpecifier; 4576ee326af4e77e6f05973486097884d7431f2108dRichard Smith } 4586ee326af4e77e6f05973486097884d7431f2108dRichard Smith 4596ee326af4e77e6f05973486097884d7431f2108dRichard Smith // In Obj-C++11, we need to distinguish four situations: 4606ee326af4e77e6f05973486097884d7431f2108dRichard Smith // 1a) int x[[attr]]; C++11 attribute. 4616ee326af4e77e6f05973486097884d7431f2108dRichard Smith // 1b) [[attr]]; C++11 statement attribute. 4626ee326af4e77e6f05973486097884d7431f2108dRichard Smith // 2) int x[[obj](){ return 1; }()]; Lambda in array size/index. 4636ee326af4e77e6f05973486097884d7431f2108dRichard Smith // 3a) int x[[obj get]]; Message send in array size/index. 4646ee326af4e77e6f05973486097884d7431f2108dRichard Smith // 3b) [[Class alloc] init]; Message send in message send. 4656ee326af4e77e6f05973486097884d7431f2108dRichard Smith // 4) [[obj]{ return self; }() doStuff]; Lambda in message send. 4666ee326af4e77e6f05973486097884d7431f2108dRichard Smith // (1) is an attribute, (2) is ill-formed, and (3) and (4) are accepted. 4676ee326af4e77e6f05973486097884d7431f2108dRichard Smith 4686ee326af4e77e6f05973486097884d7431f2108dRichard Smith // If we have a lambda-introducer, then this is definitely not a message send. 4696ee326af4e77e6f05973486097884d7431f2108dRichard Smith // FIXME: If this disambiguation is too slow, fold the tentative lambda parse 4706ee326af4e77e6f05973486097884d7431f2108dRichard Smith // into the tentative attribute parse below. 4716ee326af4e77e6f05973486097884d7431f2108dRichard Smith LambdaIntroducer Intro; 4726ee326af4e77e6f05973486097884d7431f2108dRichard Smith if (!TryParseLambdaIntroducer(Intro)) { 4736ee326af4e77e6f05973486097884d7431f2108dRichard Smith // A lambda cannot end with ']]', and an attribute must. 4746ee326af4e77e6f05973486097884d7431f2108dRichard Smith bool IsAttribute = Tok.is(tok::r_square); 4756ee326af4e77e6f05973486097884d7431f2108dRichard Smith 4766ee326af4e77e6f05973486097884d7431f2108dRichard Smith PA.Revert(); 4776ee326af4e77e6f05973486097884d7431f2108dRichard Smith 4786ee326af4e77e6f05973486097884d7431f2108dRichard Smith if (IsAttribute) 4796ee326af4e77e6f05973486097884d7431f2108dRichard Smith // Case 1: C++11 attribute. 4806ee326af4e77e6f05973486097884d7431f2108dRichard Smith return CAK_AttributeSpecifier; 4816ee326af4e77e6f05973486097884d7431f2108dRichard Smith 4826ee326af4e77e6f05973486097884d7431f2108dRichard Smith if (OuterMightBeMessageSend) 4836ee326af4e77e6f05973486097884d7431f2108dRichard Smith // Case 4: Lambda in message send. 4846ee326af4e77e6f05973486097884d7431f2108dRichard Smith return CAK_NotAttributeSpecifier; 4856ee326af4e77e6f05973486097884d7431f2108dRichard Smith 4866ee326af4e77e6f05973486097884d7431f2108dRichard Smith // Case 2: Lambda in array size / index. 4876ee326af4e77e6f05973486097884d7431f2108dRichard Smith return CAK_InvalidAttributeSpecifier; 4886ee326af4e77e6f05973486097884d7431f2108dRichard Smith } 489bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 490bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt ConsumeBracket(); 491bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 4926ee326af4e77e6f05973486097884d7431f2108dRichard Smith // If we don't have a lambda-introducer, then we have an attribute or a 4936ee326af4e77e6f05973486097884d7431f2108dRichard Smith // message-send. 4946ee326af4e77e6f05973486097884d7431f2108dRichard Smith bool IsAttribute = true; 4956ee326af4e77e6f05973486097884d7431f2108dRichard Smith while (Tok.isNot(tok::r_square)) { 4966ee326af4e77e6f05973486097884d7431f2108dRichard Smith if (Tok.is(tok::comma)) { 4976ee326af4e77e6f05973486097884d7431f2108dRichard Smith // Case 1: Stray commas can only occur in attributes. 4986ee326af4e77e6f05973486097884d7431f2108dRichard Smith PA.Revert(); 4996ee326af4e77e6f05973486097884d7431f2108dRichard Smith return CAK_AttributeSpecifier; 5006ee326af4e77e6f05973486097884d7431f2108dRichard Smith } 5016ee326af4e77e6f05973486097884d7431f2108dRichard Smith 5026ee326af4e77e6f05973486097884d7431f2108dRichard Smith // Parse the attribute-token, if present. 5036ee326af4e77e6f05973486097884d7431f2108dRichard Smith // C++11 [dcl.attr.grammar]: 5046ee326af4e77e6f05973486097884d7431f2108dRichard Smith // If a keyword or an alternative token that satisfies the syntactic 5056ee326af4e77e6f05973486097884d7431f2108dRichard Smith // requirements of an identifier is contained in an attribute-token, 5066ee326af4e77e6f05973486097884d7431f2108dRichard Smith // it is considered an identifier. 507c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith SourceLocation Loc; 508c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith if (!TryParseCXX11AttributeIdentifier(Loc)) { 5096ee326af4e77e6f05973486097884d7431f2108dRichard Smith IsAttribute = false; 5106ee326af4e77e6f05973486097884d7431f2108dRichard Smith break; 5116ee326af4e77e6f05973486097884d7431f2108dRichard Smith } 5126ee326af4e77e6f05973486097884d7431f2108dRichard Smith if (Tok.is(tok::coloncolon)) { 5136ee326af4e77e6f05973486097884d7431f2108dRichard Smith ConsumeToken(); 514c56298d87a9df507805a548d7d515e8b511df2c0Richard Smith if (!TryParseCXX11AttributeIdentifier(Loc)) { 5156ee326af4e77e6f05973486097884d7431f2108dRichard Smith IsAttribute = false; 5166ee326af4e77e6f05973486097884d7431f2108dRichard Smith break; 5176ee326af4e77e6f05973486097884d7431f2108dRichard Smith } 5186ee326af4e77e6f05973486097884d7431f2108dRichard Smith } 5196ee326af4e77e6f05973486097884d7431f2108dRichard Smith 5206ee326af4e77e6f05973486097884d7431f2108dRichard Smith // Parse the attribute-argument-clause, if present. 5216ee326af4e77e6f05973486097884d7431f2108dRichard Smith if (Tok.is(tok::l_paren)) { 5226ee326af4e77e6f05973486097884d7431f2108dRichard Smith ConsumeParen(); 5236ee326af4e77e6f05973486097884d7431f2108dRichard Smith if (!SkipUntil(tok::r_paren, false)) { 5246ee326af4e77e6f05973486097884d7431f2108dRichard Smith IsAttribute = false; 5256ee326af4e77e6f05973486097884d7431f2108dRichard Smith break; 5266ee326af4e77e6f05973486097884d7431f2108dRichard Smith } 5276ee326af4e77e6f05973486097884d7431f2108dRichard Smith } 5286ee326af4e77e6f05973486097884d7431f2108dRichard Smith 5296ee326af4e77e6f05973486097884d7431f2108dRichard Smith if (Tok.is(tok::ellipsis)) 5306ee326af4e77e6f05973486097884d7431f2108dRichard Smith ConsumeToken(); 5316ee326af4e77e6f05973486097884d7431f2108dRichard Smith 5326ee326af4e77e6f05973486097884d7431f2108dRichard Smith if (Tok.isNot(tok::comma)) 5336ee326af4e77e6f05973486097884d7431f2108dRichard Smith break; 5346ee326af4e77e6f05973486097884d7431f2108dRichard Smith 5356ee326af4e77e6f05973486097884d7431f2108dRichard Smith ConsumeToken(); 5366ee326af4e77e6f05973486097884d7431f2108dRichard Smith } 5376ee326af4e77e6f05973486097884d7431f2108dRichard Smith 5386ee326af4e77e6f05973486097884d7431f2108dRichard Smith // An attribute must end ']]'. 5396ee326af4e77e6f05973486097884d7431f2108dRichard Smith if (IsAttribute) { 5406ee326af4e77e6f05973486097884d7431f2108dRichard Smith if (Tok.is(tok::r_square)) { 5416ee326af4e77e6f05973486097884d7431f2108dRichard Smith ConsumeBracket(); 5426ee326af4e77e6f05973486097884d7431f2108dRichard Smith IsAttribute = Tok.is(tok::r_square); 5436ee326af4e77e6f05973486097884d7431f2108dRichard Smith } else { 5446ee326af4e77e6f05973486097884d7431f2108dRichard Smith IsAttribute = false; 5456ee326af4e77e6f05973486097884d7431f2108dRichard Smith } 5466ee326af4e77e6f05973486097884d7431f2108dRichard Smith } 5476ee326af4e77e6f05973486097884d7431f2108dRichard Smith 5486ee326af4e77e6f05973486097884d7431f2108dRichard Smith PA.Revert(); 5496ee326af4e77e6f05973486097884d7431f2108dRichard Smith 5506ee326af4e77e6f05973486097884d7431f2108dRichard Smith if (IsAttribute) 5516ee326af4e77e6f05973486097884d7431f2108dRichard Smith // Case 1: C++11 statement attribute. 5526ee326af4e77e6f05973486097884d7431f2108dRichard Smith return CAK_AttributeSpecifier; 553bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 5546ee326af4e77e6f05973486097884d7431f2108dRichard Smith // Case 3: Message send. 5556ee326af4e77e6f05973486097884d7431f2108dRichard Smith return CAK_NotAttributeSpecifier; 556bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt} 557bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 5585404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// declarator: 5595404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// direct-declarator 5605404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// ptr-operator declarator 5615404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 5625404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// direct-declarator: 5635404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// declarator-id 5645404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// direct-declarator '(' parameter-declaration-clause ')' 5655404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// cv-qualifier-seq[opt] exception-specification[opt] 5665404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// direct-declarator '[' constant-expression[opt] ']' 5675404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// '(' declarator ')' 5681ee2c43bc0c281b60b29f1883e1e206cae28aed6Argyrios Kyrtzidis/// [GNU] '(' attributes declarator ')' 5695404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 5705404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// abstract-declarator: 5715404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// ptr-operator abstract-declarator[opt] 5725404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// direct-abstract-declarator 573a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor/// ... 5745404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 5755404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// direct-abstract-declarator: 5765404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// direct-abstract-declarator[opt] 5775404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// '(' parameter-declaration-clause ')' cv-qualifier-seq[opt] 5785404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// exception-specification[opt] 5795404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// direct-abstract-declarator[opt] '[' constant-expression[opt] ']' 5805404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// '(' abstract-declarator ')' 5815404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 5825404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// ptr-operator: 5835404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// '*' cv-qualifier-seq[opt] 5845404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// '&' 5855404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// [C++0x] '&&' [TODO] 5868edef7c31d27fc9d5d163660702a8a7730a0d19fSebastian Redl/// '::'[opt] nested-name-specifier '*' cv-qualifier-seq[opt] 5875404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 5885404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// cv-qualifier-seq: 5895404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// cv-qualifier cv-qualifier-seq[opt] 5905404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 5915404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// cv-qualifier: 5925404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'const' 5935404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'volatile' 5945404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 5955404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// declarator-id: 596a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor/// '...'[opt] id-expression 5975404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 5985404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// id-expression: 5995404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// unqualified-id 6005404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// qualified-id [TODO] 6015404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 6025404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// unqualified-id: 6035404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// identifier 6045404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// operator-function-id [TODO] 6055404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// conversion-function-id [TODO] 6065404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// '~' class-name [TODO] 6075404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// template-id [TODO] 6085404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 60978c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios KyrtzidisParser::TPResult Parser::TryParseDeclarator(bool mayBeAbstract, 61078c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis bool mayHaveIdentifier) { 6115404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // declarator: 6125404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // direct-declarator 6135404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // ptr-operator declarator 6145404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 6155404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis while (1) { 6168edef7c31d27fc9d5d163660702a8a7730a0d19fSebastian Redl if (Tok.is(tok::coloncolon) || Tok.is(tok::identifier)) 6179ba6166f4a78722e7df8ffbd64eb788bfdf2764aJohn McCall if (TryAnnotateCXXScopeToken(true)) 6189ba6166f4a78722e7df8ffbd64eb788bfdf2764aJohn McCall return TPResult::Error(); 6198edef7c31d27fc9d5d163660702a8a7730a0d19fSebastian Redl 6209af5500f3f132f9a2f9abbe82113a7c7bb751472Chris Lattner if (Tok.is(tok::star) || Tok.is(tok::amp) || Tok.is(tok::caret) || 62169d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor Tok.is(tok::ampamp) || 6228edef7c31d27fc9d5d163660702a8a7730a0d19fSebastian Redl (Tok.is(tok::annot_cxxscope) && NextToken().is(tok::star))) { 6235404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // ptr-operator 6245404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeToken(); 6255404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis while (Tok.is(tok::kw_const) || 6265404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis Tok.is(tok::kw_volatile) || 6279af5500f3f132f9a2f9abbe82113a7c7bb751472Chris Lattner Tok.is(tok::kw_restrict)) 6285404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeToken(); 6295404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } else { 6305404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis break; 6315404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 6325404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 6335404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 6345404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // direct-declarator: 6355404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // direct-abstract-declarator: 636a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor if (Tok.is(tok::ellipsis)) 637a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor ConsumeToken(); 638a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor 6391e054213f8416a48866105216ad4a45f1e7c24deArgyrios Kyrtzidis if ((Tok.is(tok::identifier) || 6401e054213f8416a48866105216ad4a45f1e7c24deArgyrios Kyrtzidis (Tok.is(tok::annot_cxxscope) && NextToken().is(tok::identifier))) && 6411e054213f8416a48866105216ad4a45f1e7c24deArgyrios Kyrtzidis mayHaveIdentifier) { 6425404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // declarator-id 6431e054213f8416a48866105216ad4a45f1e7c24deArgyrios Kyrtzidis if (Tok.is(tok::annot_cxxscope)) 6441e054213f8416a48866105216ad4a45f1e7c24deArgyrios Kyrtzidis ConsumeToken(); 6450576681bac125be07f77f66b02a3dba2c3a24557Richard Smith else 6460576681bac125be07f77f66b02a3dba2c3a24557Richard Smith TentativelyDeclaredIdentifiers.push_back(Tok.getIdentifierInfo()); 6475404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeToken(); 6485404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } else if (Tok.is(tok::l_paren)) { 649d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis ConsumeParen(); 650d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis if (mayBeAbstract && 651d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis (Tok.is(tok::r_paren) || // 'int()' is a function. 6522259286fc5c1514089b17ec93e26ca56ba8ac2b6Richard Smith // 'int(...)' is a function. 6532259286fc5c1514089b17ec93e26ca56ba8ac2b6Richard Smith (Tok.is(tok::ellipsis) && NextToken().is(tok::r_paren)) || 654d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis isDeclarationSpecifier())) { // 'int(int)' is a function. 6555404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // '(' parameter-declaration-clause ')' cv-qualifier-seq[opt] 6565404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // exception-specification[opt] 657b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis TPResult TPR = TryParseFunctionDeclarator(); 658b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis if (TPR != TPResult::Ambiguous()) 6595404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis return TPR; 6605404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } else { 6615404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // '(' declarator ')' 6621ee2c43bc0c281b60b29f1883e1e206cae28aed6Argyrios Kyrtzidis // '(' attributes declarator ')' 6635404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // '(' abstract-declarator ')' 6646229c8e7ecccbc6b661df0b4399eb205587c61b4Chris Lattner if (Tok.is(tok::kw___attribute) || 6656229c8e7ecccbc6b661df0b4399eb205587c61b4Chris Lattner Tok.is(tok::kw___declspec) || 6666229c8e7ecccbc6b661df0b4399eb205587c61b4Chris Lattner Tok.is(tok::kw___cdecl) || 6676229c8e7ecccbc6b661df0b4399eb205587c61b4Chris Lattner Tok.is(tok::kw___stdcall) || 6686229c8e7ecccbc6b661df0b4399eb205587c61b4Chris Lattner Tok.is(tok::kw___fastcall) || 6693bd9aa4593b4332d477407d9b5a42f3c4ababb21Francois Pichet Tok.is(tok::kw___thiscall) || 6708d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor Tok.is(tok::kw___unaligned)) 671b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::True(); // attributes indicate declaration 67278c8d80f19cb0bccd4f3d590e71a230e727cfab5Argyrios Kyrtzidis TPResult TPR = TryParseDeclarator(mayBeAbstract, mayHaveIdentifier); 673b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis if (TPR != TPResult::Ambiguous()) 6745404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis return TPR; 6755404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (Tok.isNot(tok::r_paren)) 676b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::False(); 6775404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeParen(); 6785404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 6795404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } else if (!mayBeAbstract) { 680b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::False(); 6815404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 6825404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 6835404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis while (1) { 684b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis TPResult TPR(TPResult::Ambiguous()); 6855404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 686a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor // abstract-declarator: ... 687a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor if (Tok.is(tok::ellipsis)) 688a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor ConsumeToken(); 689a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor 6905404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (Tok.is(tok::l_paren)) { 691d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis // Check whether we have a function declarator or a possible ctor-style 692d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis // initializer that follows the declarator. Note that ctor-style 693d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis // initializers are not possible in contexts where abstract declarators 694d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis // are allowed. 695b9c6261d02f688d0a9a36b736ad5956fbc737854Richard Smith if (!mayBeAbstract && !isCXXFunctionDeclarator()) 696d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis break; 697d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis 6985404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // direct-declarator '(' parameter-declaration-clause ')' 6995404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // cv-qualifier-seq[opt] exception-specification[opt] 700d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis ConsumeParen(); 7015404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis TPR = TryParseFunctionDeclarator(); 7025404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } else if (Tok.is(tok::l_square)) { 7035404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // direct-declarator '[' constant-expression[opt] ']' 7045404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // direct-abstract-declarator[opt] '[' constant-expression[opt] ']' 7055404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis TPR = TryParseBracketDeclarator(); 7065404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } else { 7075404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis break; 7085404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 7095404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 710b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis if (TPR != TPResult::Ambiguous()) 7115404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis return TPR; 7125404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 7135404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 714b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Ambiguous(); 7155404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis} 7165404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 717a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas GregorParser::TPResult 718a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas GregorParser::isExpressionOrTypeSpecifierSimple(tok::TokenKind Kind) { 719a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor switch (Kind) { 720a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor // Obviously starts an expression. 721a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::numeric_constant: 722a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::char_constant: 7235cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case tok::wide_char_constant: 7245cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case tok::utf16_char_constant: 7255cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case tok::utf32_char_constant: 726a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::string_literal: 727a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::wide_string_literal: 7285cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case tok::utf8_string_literal: 7295cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case tok::utf16_string_literal: 7305cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case tok::utf32_string_literal: 731a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::l_square: 732a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::l_paren: 733a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::amp: 73469d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor case tok::ampamp: 735a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::star: 736a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::plus: 737a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::plusplus: 738a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::minus: 739a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::minusminus: 740a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::tilde: 741a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::exclaim: 742a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_sizeof: 743a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___func__: 744a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_const_cast: 745a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_delete: 746a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_dynamic_cast: 747a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_false: 748a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_new: 749a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_operator: 750a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_reinterpret_cast: 751a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_static_cast: 752a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_this: 753a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_throw: 754a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_true: 755a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_typeid: 756a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_alignof: 757a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_noexcept: 758a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_nullptr: 759f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose case tok::kw__Alignof: 760a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___null: 761a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___alignof: 762a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___builtin_choose_expr: 763a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___builtin_offsetof: 764a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___builtin_types_compatible_p: 765a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___builtin_va_arg: 766a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___imag: 767a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___real: 768a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___FUNCTION__: 76928ad063b279378b19cb0704f977429df366a151eNico Weber case tok::kw_L__FUNCTION__: 770a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___PRETTY_FUNCTION__: 771a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___has_nothrow_assign: 772a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___has_nothrow_copy: 773a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___has_nothrow_constructor: 774a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___has_trivial_assign: 775a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___has_trivial_copy: 776a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___has_trivial_constructor: 777a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___has_trivial_destructor: 778a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___has_virtual_destructor: 779a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___is_abstract: 780a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___is_base_of: 781a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___is_class: 7829f3611365d0f2297a910cf246e056708726ed10aDouglas Gregor case tok::kw___is_convertible_to: 783a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___is_empty: 784a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___is_enum: 7855e9392ba18f5925e26cc5714d1412eda0d219826Douglas Gregor case tok::kw___is_final: 7864e61ddd644e9c6293697a966d98d7c1905cf63a8Chandler Carruth case tok::kw___is_literal: 7873840281126e7d10552c55f6fd8b1ec9483898906Chandler Carruth case tok::kw___is_literal_type: 788a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___is_pod: 789a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___is_polymorphic: 790b7e9589bce9852b4db9575f55ac9137572147eb5Chandler Carruth case tok::kw___is_trivial: 79125d0a0f67d9e949ffbfc57bf487012f5cbfd886eDouglas Gregor case tok::kw___is_trivially_assignable: 7924ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor case tok::kw___is_trivially_constructible: 793feb375d31b7e9108b04a9f55b721d5e0c793a558Sean Hunt case tok::kw___is_trivially_copyable: 794a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___is_union: 795a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___uuidof: 796a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor return TPResult::True(); 797a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor 798a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor // Obviously starts a type-specifier-seq: 799a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_char: 800a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_const: 801a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_double: 802a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_enum: 803aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov case tok::kw_half: 804a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_float: 805a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_int: 806a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_long: 807338d7f7362d18fa9c39c6bb5282b4e20574a9309Francois Pichet case tok::kw___int64: 8085a5a971908a1fd064454db44c42333a3aecf3d5bRichard Smith case tok::kw___int128: 809a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_restrict: 810a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_short: 811a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_signed: 812a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_struct: 813a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_union: 814a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_unsigned: 815a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_void: 816a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_volatile: 817a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw__Bool: 818a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw__Complex: 819a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_class: 820a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_typename: 821a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_wchar_t: 822a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_char16_t: 823a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_char32_t: 824db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt case tok::kw___underlying_type: 825a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_thread_local: 826a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw__Decimal32: 827a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw__Decimal64: 828a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw__Decimal128: 829a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___thread: 830a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw_typeof: 831a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___cdecl: 832a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___stdcall: 833a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___fastcall: 834a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___thiscall: 8358d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor case tok::kw___unaligned: 836a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___vector: 837a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor case tok::kw___pixel: 838b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case tok::kw__Atomic: 839a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor return TPResult::False(); 840a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor 841a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor default: 842a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor break; 843a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor } 844a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor 845a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor return TPResult::Ambiguous(); 846a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor} 847a61b3e7443056f8d05b24ca4cbea90fe66235d6bDouglas Gregor 8480576681bac125be07f77f66b02a3dba2c3a24557Richard Smithbool Parser::isTentativelyDeclared(IdentifierInfo *II) { 8490576681bac125be07f77f66b02a3dba2c3a24557Richard Smith return std::find(TentativelyDeclaredIdentifiers.begin(), 8500576681bac125be07f77f66b02a3dba2c3a24557Richard Smith TentativelyDeclaredIdentifiers.end(), II) 8510576681bac125be07f77f66b02a3dba2c3a24557Richard Smith != TentativelyDeclaredIdentifiers.end(); 8520576681bac125be07f77f66b02a3dba2c3a24557Richard Smith} 8530576681bac125be07f77f66b02a3dba2c3a24557Richard Smith 854b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis/// isCXXDeclarationSpecifier - Returns TPResult::True() if it is a declaration 855b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis/// specifier, TPResult::False() if it is not, TPResult::Ambiguous() if it could 856b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis/// be either a decl-specifier or a function-style cast, and TPResult::Error() 857b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis/// if a parsing error was found and reported. 8585404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 85925582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith/// If HasMissingTypename is provided, a name with a dependent scope specifier 86025582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith/// will be treated as ambiguous if the 'typename' keyword is missing. If this 8610576681bac125be07f77f66b02a3dba2c3a24557Richard Smith/// happens, *HasMissingTypename will be set to 'true'. This will also be used 8620576681bac125be07f77f66b02a3dba2c3a24557Richard Smith/// as an indicator that undeclared identifiers (which will trigger a later 8630576681bac125be07f77f66b02a3dba2c3a24557Richard Smith/// parse error) should be treated as types. Returns TPResult::Ambiguous() in 8640576681bac125be07f77f66b02a3dba2c3a24557Richard Smith/// such cases. 86525582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith/// 8665404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// decl-specifier: 8675404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// storage-class-specifier 8685404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// type-specifier 8695404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// function-specifier 8705404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'friend' 8715404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'typedef' 8722ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl/// [C++0x] 'constexpr' 8735404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// [GNU] attributes declaration-specifiers[opt] 8745404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 8755404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// storage-class-specifier: 8765404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'register' 8775404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'static' 8785404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'extern' 8795404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'mutable' 8805404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'auto' 8815404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// [GNU] '__thread' 8825404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 8835404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// function-specifier: 8845404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'inline' 8855404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'virtual' 8865404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'explicit' 8875404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 8885404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// typedef-name: 8895404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// identifier 8905404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 8915404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// type-specifier: 8925404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// simple-type-specifier 8935404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// class-specifier 8945404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// enum-specifier 8955404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// elaborated-type-specifier 896d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor/// typename-specifier 8975404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// cv-qualifier 8985404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 8995404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// simple-type-specifier: 900d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor/// '::'[opt] nested-name-specifier[opt] type-name 9015404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// '::'[opt] nested-name-specifier 'template' 9025404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// simple-template-id [TODO] 9035404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'char' 9045404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'wchar_t' 9055404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'bool' 9065404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'short' 9075404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'int' 9085404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'long' 9095404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'signed' 9105404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'unsigned' 9115404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'float' 9125404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'double' 9135404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'void' 9145404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// [GNU] typeof-specifier 9155404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// [GNU] '_Complex' 9165404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// [C++0x] 'auto' [TODO] 9176fd634f4ac59f5923cffadadb99d19f23c18707aAnders Carlsson/// [C++0x] 'decltype' ( expression ) 9185404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 9195404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// type-name: 9205404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// class-name 9215404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// enum-name 9225404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// typedef-name 9235404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 9245404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// elaborated-type-specifier: 9255404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// class-key '::'[opt] nested-name-specifier[opt] identifier 9265404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// class-key '::'[opt] nested-name-specifier[opt] 'template'[opt] 9275404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// simple-template-id 9285404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'enum' '::'[opt] nested-name-specifier[opt] identifier 9295404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 9305404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// enum-name: 9315404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// identifier 9325404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 9335404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// enum-specifier: 9345404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'enum' identifier[opt] '{' enumerator-list[opt] '}' 9355404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'enum' identifier[opt] '{' enumerator-list ',' '}' 9365404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 9375404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// class-specifier: 9385404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// class-head '{' member-specification[opt] '}' 9395404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 9405404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// class-head: 9415404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// class-key identifier[opt] base-clause[opt] 9425404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// class-key nested-name-specifier identifier base-clause[opt] 9435404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// class-key nested-name-specifier[opt] simple-template-id 9445404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// base-clause[opt] 9455404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 9465404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// class-key: 9475404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'class' 9485404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'struct' 9495404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'union' 9505404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 9515404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// cv-qualifier: 9525404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'const' 9535404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'volatile' 9545404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// [GNU] restrict 9555404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 956d81e961f905e3ea57f6808e5a5686a8324270984Richard SmithParser::TPResult 95725582fc0aeac053cdc115ee95cbed53f28bf592eRichard SmithParser::isCXXDeclarationSpecifier(Parser::TPResult BracedCastResult, 95825582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith bool *HasMissingTypename) { 9595404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis switch (Tok.getKind()) { 9600576681bac125be07f77f66b02a3dba2c3a24557Richard Smith case tok::identifier: { 96182287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson // Check for need to substitute AltiVec __vector keyword 96282287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson // for "vector" identifier. 96382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson if (TryAltiVecVectorToken()) 96482287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson return TPResult::True(); 9650576681bac125be07f77f66b02a3dba2c3a24557Richard Smith 9660576681bac125be07f77f66b02a3dba2c3a24557Richard Smith const Token &Next = NextToken(); 9670576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // In 'foo bar', 'foo' is always a type name outside of Objective-C. 9680576681bac125be07f77f66b02a3dba2c3a24557Richard Smith if (!getLangOpts().ObjC1 && Next.is(tok::identifier)) 9690576681bac125be07f77f66b02a3dba2c3a24557Richard Smith return TPResult::True(); 9700576681bac125be07f77f66b02a3dba2c3a24557Richard Smith 9710576681bac125be07f77f66b02a3dba2c3a24557Richard Smith if (Next.isNot(tok::coloncolon) && Next.isNot(tok::less)) { 9720576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // Determine whether this is a valid expression. If not, we will hit 9730576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // a parse error one way or another. In that case, tell the caller that 9740576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // this is ambiguous. Typo-correct to type and expression keywords and 9750576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // to types and identifiers, in order to try to recover from errors. 9760576681bac125be07f77f66b02a3dba2c3a24557Richard Smith CorrectionCandidateCallback TypoCorrection; 9770576681bac125be07f77f66b02a3dba2c3a24557Richard Smith TypoCorrection.WantRemainingKeywords = false; 9780576681bac125be07f77f66b02a3dba2c3a24557Richard Smith switch (TryAnnotateName(false /* no nested name specifier */, 9790576681bac125be07f77f66b02a3dba2c3a24557Richard Smith &TypoCorrection)) { 9800576681bac125be07f77f66b02a3dba2c3a24557Richard Smith case ANK_Error: 9810576681bac125be07f77f66b02a3dba2c3a24557Richard Smith return TPResult::Error(); 9820576681bac125be07f77f66b02a3dba2c3a24557Richard Smith case ANK_TentativeDecl: 9830576681bac125be07f77f66b02a3dba2c3a24557Richard Smith return TPResult::False(); 9840576681bac125be07f77f66b02a3dba2c3a24557Richard Smith case ANK_TemplateName: 9850576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // A bare type template-name which can't be a template template 9860576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // argument is an error, and was probably intended to be a type. 9870576681bac125be07f77f66b02a3dba2c3a24557Richard Smith return GreaterThanIsOperator ? TPResult::True() : TPResult::False(); 9880576681bac125be07f77f66b02a3dba2c3a24557Richard Smith case ANK_Unresolved: 9890576681bac125be07f77f66b02a3dba2c3a24557Richard Smith return HasMissingTypename ? TPResult::Ambiguous() : TPResult::False(); 9900576681bac125be07f77f66b02a3dba2c3a24557Richard Smith case ANK_Success: 9910576681bac125be07f77f66b02a3dba2c3a24557Richard Smith break; 9920576681bac125be07f77f66b02a3dba2c3a24557Richard Smith } 9930576681bac125be07f77f66b02a3dba2c3a24557Richard Smith assert(Tok.isNot(tok::identifier) && 9940576681bac125be07f77f66b02a3dba2c3a24557Richard Smith "TryAnnotateName succeeded without producing an annotation"); 9950576681bac125be07f77f66b02a3dba2c3a24557Richard Smith } else { 9960576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // This might possibly be a type with a dependent scope specifier and 9970576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // a missing 'typename' keyword. Don't use TryAnnotateName in this case, 9980576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // since it will annotate as a primary expression, and we want to use the 9990576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // "missing 'typename'" logic. 10000576681bac125be07f77f66b02a3dba2c3a24557Richard Smith if (TryAnnotateTypeOrScopeToken()) 10010576681bac125be07f77f66b02a3dba2c3a24557Richard Smith return TPResult::Error(); 10020576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // If annotation failed, assume it's a non-type. 10030576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // FIXME: If this happens due to an undeclared identifier, treat it as 10040576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // ambiguous. 10050576681bac125be07f77f66b02a3dba2c3a24557Richard Smith if (Tok.is(tok::identifier)) 10060576681bac125be07f77f66b02a3dba2c3a24557Richard Smith return TPResult::False(); 10070576681bac125be07f77f66b02a3dba2c3a24557Richard Smith } 10080576681bac125be07f77f66b02a3dba2c3a24557Richard Smith 10090576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // We annotated this token as something. Recurse to handle whatever we got. 10100576681bac125be07f77f66b02a3dba2c3a24557Richard Smith return isCXXDeclarationSpecifier(BracedCastResult, HasMissingTypename); 10110576681bac125be07f77f66b02a3dba2c3a24557Richard Smith } 10120576681bac125be07f77f66b02a3dba2c3a24557Richard Smith 1013d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor case tok::kw_typename: // typename T::type 1014e584926b8602c26d442f34090dfd5293695f4af5Chris Lattner // Annotate typenames and C++ scope specifiers. If we get one, just 1015e584926b8602c26d442f34090dfd5293695f4af5Chris Lattner // recurse to handle whatever we get. 1016e584926b8602c26d442f34090dfd5293695f4af5Chris Lattner if (TryAnnotateTypeOrScopeToken()) 10179ba6166f4a78722e7df8ffbd64eb788bfdf2764aJohn McCall return TPResult::Error(); 101825582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith return isCXXDeclarationSpecifier(BracedCastResult, HasMissingTypename); 1019e584926b8602c26d442f34090dfd5293695f4af5Chris Lattner 10202ee9b408a5cf3055fd974f01025b80fb3fd5f7e6Chris Lattner case tok::coloncolon: { // ::foo::bar 10212ee9b408a5cf3055fd974f01025b80fb3fd5f7e6Chris Lattner const Token &Next = NextToken(); 10222ee9b408a5cf3055fd974f01025b80fb3fd5f7e6Chris Lattner if (Next.is(tok::kw_new) || // ::new 10232ee9b408a5cf3055fd974f01025b80fb3fd5f7e6Chris Lattner Next.is(tok::kw_delete)) // ::delete 1024ae03cb5a84d13c7a0d4b21865bd63aabd18120d2John McCall return TPResult::False(); 102542d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie } 102642d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie // Fall through. 102742d6d0c91ab089cb252ab2f91c16d4557f458a2cDavid Blaikie case tok::kw_decltype: 1028e584926b8602c26d442f34090dfd5293695f4af5Chris Lattner // Annotate typenames and C++ scope specifiers. If we get one, just 1029e584926b8602c26d442f34090dfd5293695f4af5Chris Lattner // recurse to handle whatever we get. 1030e584926b8602c26d442f34090dfd5293695f4af5Chris Lattner if (TryAnnotateTypeOrScopeToken()) 10319ba6166f4a78722e7df8ffbd64eb788bfdf2764aJohn McCall return TPResult::Error(); 103225582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith return isCXXDeclarationSpecifier(BracedCastResult, HasMissingTypename); 1033443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky 10345404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // decl-specifier: 10355404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // storage-class-specifier 10365404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // type-specifier 10375404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // function-specifier 10385404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // 'friend' 10395404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // 'typedef' 10402ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl // 'constexpr' 10415404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_friend: 10425404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_typedef: 10432ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl case tok::kw_constexpr: 10445404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // storage-class-specifier 10455404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_register: 10465404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_static: 10475404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_extern: 10485404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_mutable: 10495404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_auto: 10505404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw___thread: 10515404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // function-specifier 10525404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_inline: 10535404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_virtual: 10545404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_explicit: 10555404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 10568d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor // Modules 10578d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor case tok::kw___module_private__: 10588d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 10595404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // type-specifier: 10605404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // simple-type-specifier 10615404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // class-specifier 10625404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // enum-specifier 10635404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // elaborated-type-specifier 10645404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // typename-specifier 10655404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // cv-qualifier 10665404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 10675404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // class-specifier 10685404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // elaborated-type-specifier 10695404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_class: 10705404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_struct: 10715404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_union: 10725404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // enum-specifier 10735404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_enum: 10745404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // cv-qualifier 10755404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_const: 10765404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_volatile: 10775404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 10785404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // GNU 10795404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_restrict: 10805404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw__Complex: 10815404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw___attribute: 1082b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::True(); 10831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10847ec5658f92fd5b65f682b6e942b95210426fc6e2Steve Naroff // Microsoft 108547f5209a80c7c75592e87eb296d2b51e03208ae0Steve Naroff case tok::kw___declspec: 10867ec5658f92fd5b65f682b6e942b95210426fc6e2Steve Naroff case tok::kw___cdecl: 10877ec5658f92fd5b65f682b6e942b95210426fc6e2Steve Naroff case tok::kw___stdcall: 10887ec5658f92fd5b65f682b6e942b95210426fc6e2Steve Naroff case tok::kw___fastcall: 1089f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas Gregor case tok::kw___thiscall: 1090290eeb0ec2b6b91f3621e05ef541deb257fbea73Eli Friedman case tok::kw___w64: 1091290eeb0ec2b6b91f3621e05ef541deb257fbea73Eli Friedman case tok::kw___ptr64: 109258fd97a6f4f7c909aeef46b501ab46f3d6eac671Francois Pichet case tok::kw___ptr32: 1093290eeb0ec2b6b91f3621e05ef541deb257fbea73Eli Friedman case tok::kw___forceinline: 10948d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor case tok::kw___unaligned: 1095290eeb0ec2b6b91f3621e05ef541deb257fbea73Eli Friedman return TPResult::True(); 109652fc314e1b5e1baee6305067cf831763d02bd243Dawn Perchik 109752fc314e1b5e1baee6305067cf831763d02bd243Dawn Perchik // Borland 109852fc314e1b5e1baee6305067cf831763d02bd243Dawn Perchik case tok::kw___pascal: 109952fc314e1b5e1baee6305067cf831763d02bd243Dawn Perchik return TPResult::True(); 110082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson 110182287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson // AltiVec 110282287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson case tok::kw___vector: 110382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson return TPResult::True(); 11045404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 110551e2a5d45d321c53355fe038b3a3e7a2f502afa4John McCall case tok::annot_template_id: { 110625a767651d14db87aa03dd5fe3e011d877dd4100Argyrios Kyrtzidis TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok); 110751e2a5d45d321c53355fe038b3a3e7a2f502afa4John McCall if (TemplateId->Kind != TNK_Type_template) 110851e2a5d45d321c53355fe038b3a3e7a2f502afa4John McCall return TPResult::False(); 110951e2a5d45d321c53355fe038b3a3e7a2f502afa4John McCall CXXScopeSpec SS; 1110059101f922de6eb765601459925f4c8914420b23Douglas Gregor AnnotateTemplateIdTokenAsType(); 111151e2a5d45d321c53355fe038b3a3e7a2f502afa4John McCall assert(Tok.is(tok::annot_typename)); 111251e2a5d45d321c53355fe038b3a3e7a2f502afa4John McCall goto case_typename; 111351e2a5d45d321c53355fe038b3a3e7a2f502afa4John McCall } 111451e2a5d45d321c53355fe038b3a3e7a2f502afa4John McCall 1115ae03cb5a84d13c7a0d4b21865bd63aabd18120d2John McCall case tok::annot_cxxscope: // foo::bar or ::foo::bar, but already parsed 1116ae03cb5a84d13c7a0d4b21865bd63aabd18120d2John McCall // We've already annotated a scope; try to annotate a type. 11179ba6166f4a78722e7df8ffbd64eb788bfdf2764aJohn McCall if (TryAnnotateTypeOrScopeToken()) 11189ba6166f4a78722e7df8ffbd64eb788bfdf2764aJohn McCall return TPResult::Error(); 1119443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky if (!Tok.is(tok::annot_typename)) { 1120443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky // If the next token is an identifier or a type qualifier, then this 1121443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky // can't possibly be a valid expression either. 1122443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky if (Tok.is(tok::annot_cxxscope) && NextToken().is(tok::identifier)) { 1123443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky CXXScopeSpec SS; 1124443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky Actions.RestoreNestedNameSpecifierAnnotation(Tok.getAnnotationValue(), 1125443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky Tok.getAnnotationRange(), 1126443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky SS); 1127443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky if (SS.getScopeRep() && SS.getScopeRep()->isDependent()) { 1128443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky TentativeParsingAction PA(*this); 1129443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky ConsumeToken(); 1130443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky ConsumeToken(); 1131443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky bool isIdentifier = Tok.is(tok::identifier); 1132443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky TPResult TPR = TPResult::False(); 1133443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky if (!isIdentifier) 113425582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith TPR = isCXXDeclarationSpecifier(BracedCastResult, 113525582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith HasMissingTypename); 1136443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky PA.Revert(); 1137443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky 1138443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky if (isIdentifier || 1139443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky TPR == TPResult::True() || TPR == TPResult::Error()) 1140443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky return TPResult::Error(); 114125582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith 114225582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith if (HasMissingTypename) { 114325582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith // We can't tell whether this is a missing 'typename' or a valid 114425582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith // expression. 114525582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith *HasMissingTypename = true; 114625582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith return TPResult::Ambiguous(); 114725582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith } 11480576681bac125be07f77f66b02a3dba2c3a24557Richard Smith } else { 11490576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // Try to resolve the name. If it doesn't exist, assume it was 11500576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // intended to name a type and keep disambiguating. 11510576681bac125be07f77f66b02a3dba2c3a24557Richard Smith switch (TryAnnotateName(false /* SS is not dependent */)) { 11520576681bac125be07f77f66b02a3dba2c3a24557Richard Smith case ANK_Error: 11530576681bac125be07f77f66b02a3dba2c3a24557Richard Smith return TPResult::Error(); 11540576681bac125be07f77f66b02a3dba2c3a24557Richard Smith case ANK_TentativeDecl: 11550576681bac125be07f77f66b02a3dba2c3a24557Richard Smith return TPResult::False(); 11560576681bac125be07f77f66b02a3dba2c3a24557Richard Smith case ANK_TemplateName: 11570576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // A bare type template-name which can't be a template template 11580576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // argument is an error, and was probably intended to be a type. 11590576681bac125be07f77f66b02a3dba2c3a24557Richard Smith return GreaterThanIsOperator ? TPResult::True() : TPResult::False(); 11600576681bac125be07f77f66b02a3dba2c3a24557Richard Smith case ANK_Unresolved: 11610576681bac125be07f77f66b02a3dba2c3a24557Richard Smith return HasMissingTypename ? TPResult::Ambiguous() 11620576681bac125be07f77f66b02a3dba2c3a24557Richard Smith : TPResult::False(); 11630576681bac125be07f77f66b02a3dba2c3a24557Richard Smith case ANK_Success: 11640576681bac125be07f77f66b02a3dba2c3a24557Richard Smith // Annotated it, check again. 11650576681bac125be07f77f66b02a3dba2c3a24557Richard Smith assert(Tok.isNot(tok::annot_cxxscope) || 11660576681bac125be07f77f66b02a3dba2c3a24557Richard Smith NextToken().isNot(tok::identifier)); 11670576681bac125be07f77f66b02a3dba2c3a24557Richard Smith return isCXXDeclarationSpecifier(BracedCastResult, 11680576681bac125be07f77f66b02a3dba2c3a24557Richard Smith HasMissingTypename); 11690576681bac125be07f77f66b02a3dba2c3a24557Richard Smith } 1170443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky } 1171443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky } 1172ae03cb5a84d13c7a0d4b21865bd63aabd18120d2John McCall return TPResult::False(); 1173443aac9bd22624c6abb1fe7e581ac30c4e654eeaNick Lewycky } 1174ae03cb5a84d13c7a0d4b21865bd63aabd18120d2John McCall // If that succeeded, fallthrough into the generic simple-type-id case. 1175ae03cb5a84d13c7a0d4b21865bd63aabd18120d2John McCall 11765404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // The ambiguity resides in a simple-type-specifier/typename-specifier 11775404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // followed by a '('. The '(' could either be the start of: 11785404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // 11795404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // direct-declarator: 11805404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // '(' declarator ')' 11815404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // 11825404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // direct-abstract-declarator: 11835404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // '(' parameter-declaration-clause ')' cv-qualifier-seq[opt] 11845404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // exception-specification[opt] 11855404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // '(' abstract-declarator ')' 11865404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // 11875404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // or part of a function-style cast expression: 11885404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // 11895404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // simple-type-specifier '(' expression-list[opt] ')' 11905404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // 11915404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 11925404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // simple-type-specifier: 11935404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 11949bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor case tok::annot_typename: 11959bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor case_typename: 11969bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor // In Objective-C, we might have a protocol-qualified type. 11974e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().ObjC1 && NextToken().is(tok::less)) { 11989bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor // Tentatively parse the 11999bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor TentativeParsingAction PA(*this); 12009bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor ConsumeToken(); // The type token 12019bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor 12029bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor TPResult TPR = TryParseProtocolQualifiers(); 12039bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor bool isFollowedByParen = Tok.is(tok::l_paren); 1204d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith bool isFollowedByBrace = Tok.is(tok::l_brace); 12059bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor 12069bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor PA.Revert(); 12079bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor 12089bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor if (TPR == TPResult::Error()) 12099bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor return TPResult::Error(); 12109bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor 12119bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor if (isFollowedByParen) 12129bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor return TPResult::Ambiguous(); 1213d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith 12144e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus0x && isFollowedByBrace) 1215d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith return BracedCastResult; 12169bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor 12179bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor return TPResult::True(); 12189bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor } 12199bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor 12205404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_char: 12215404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_wchar_t: 1222f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith case tok::kw_char16_t: 1223f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith case tok::kw_char32_t: 12245404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_bool: 12255404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_short: 12265404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_int: 12275404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_long: 1228338d7f7362d18fa9c39c6bb5282b4e20574a9309Francois Pichet case tok::kw___int64: 12295a5a971908a1fd064454db44c42333a3aecf3d5bRichard Smith case tok::kw___int128: 12305404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_signed: 12315404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_unsigned: 1232aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov case tok::kw_half: 12335404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_float: 12345404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_double: 12355404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_void: 12365e089fe1affb63d670ea02010b104bd9fa3477a1David Blaikie case tok::annot_decltype: 12375404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (NextToken().is(tok::l_paren)) 1238b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Ambiguous(); 12395404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1240d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith // This is a function-style cast in all cases we disambiguate other than 1241d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith // one: 1242d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith // struct S { 1243d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith // enum E : int { a = 4 }; // enum 1244d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith // enum E : int { 4 }; // bit-field 1245d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith // }; 12464e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus0x && NextToken().is(tok::l_brace)) 1247d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith return BracedCastResult; 1248d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith 12499497a73ad0d54859edbf48beb93ebb19a7ae50c9Douglas Gregor if (isStartOfObjCClassMessageMissingOpenBracket()) 12509497a73ad0d54859edbf48beb93ebb19a7ae50c9Douglas Gregor return TPResult::False(); 12519497a73ad0d54859edbf48beb93ebb19a7ae50c9Douglas Gregor 1252b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::True(); 12535404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 12546fd634f4ac59f5923cffadadb99d19f23c18707aAnders Carlsson // GNU typeof support. 12555404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis case tok::kw_typeof: { 12565404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (NextToken().isNot(tok::l_paren)) 1257b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::True(); 12585404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 12595404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis TentativeParsingAction PA(*this); 12605404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1261b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis TPResult TPR = TryParseTypeofSpecifier(); 12625404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis bool isFollowedByParen = Tok.is(tok::l_paren); 1263d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith bool isFollowedByBrace = Tok.is(tok::l_brace); 12645404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 12655404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis PA.Revert(); 12665404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1267b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis if (TPR == TPResult::Error()) 1268b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Error(); 12695404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 12705404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (isFollowedByParen) 1271b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Ambiguous(); 12725404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 12734e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus0x && isFollowedByBrace) 1274d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith return BracedCastResult; 1275d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith 1276b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::True(); 12775404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 12785404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1279db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt // C++0x type traits support 1280db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt case tok::kw___underlying_type: 1281db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt return TPResult::True(); 1282db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt 1283ffbe9b9c64ab2e94b9d48ec56e511f75826fc80aBenjamin Kramer // C11 _Atomic 1284b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case tok::kw__Atomic: 1285b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman return TPResult::True(); 1286b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 12875404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis default: 1288b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::False(); 12895404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 12905404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis} 12915404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 12925404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// [GNU] typeof-specifier: 12935404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'typeof' '(' expressions ')' 12945404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'typeof' '(' type-name ')' 12955404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 1296b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios KyrtzidisParser::TPResult Parser::TryParseTypeofSpecifier() { 12975404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis assert(Tok.is(tok::kw_typeof) && "Expected 'typeof'!"); 12985404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeToken(); 12995404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 13005404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis assert(Tok.is(tok::l_paren) && "Expected '('"); 13015404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // Parse through the parens after 'typeof'. 13025404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeParen(); 13035404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (!SkipUntil(tok::r_paren)) 1304b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Error(); 13055404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1306b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Ambiguous(); 13075404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis} 13085404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 13099bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor/// [ObjC] protocol-qualifiers: 13109bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor//// '<' identifier-list '>' 13119bd1d8d174a9d15ae343246c8322299248b9e92aDouglas GregorParser::TPResult Parser::TryParseProtocolQualifiers() { 13129bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor assert(Tok.is(tok::less) && "Expected '<' for qualifier list"); 13139bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor ConsumeToken(); 13149bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor do { 13159bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor if (Tok.isNot(tok::identifier)) 13169bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor return TPResult::Error(); 13179bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor ConsumeToken(); 13189bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor 13199bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor if (Tok.is(tok::comma)) { 13209bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor ConsumeToken(); 13219bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor continue; 13229bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor } 13239bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor 13249bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor if (Tok.is(tok::greater)) { 13259bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor ConsumeToken(); 13269bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor return TPResult::Ambiguous(); 13279bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor } 13289bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor } while (false); 13299bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor 13309bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor return TPResult::Error(); 13319bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor} 13329bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor 133325582fc0aeac053cdc115ee95cbed53f28bf592eRichard SmithParser::TPResult 133425582fc0aeac053cdc115ee95cbed53f28bf592eRichard SmithParser::TryParseDeclarationSpecifier(bool *HasMissingTypename) { 133525582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith TPResult TPR = isCXXDeclarationSpecifier(TPResult::False(), 133625582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith HasMissingTypename); 1337b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis if (TPR != TPResult::Ambiguous()) 13385404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis return TPR; 13395404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 13405404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (Tok.is(tok::kw_typeof)) 13415404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis TryParseTypeofSpecifier(); 13429bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor else { 134325582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith if (Tok.is(tok::annot_cxxscope)) 134425582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith ConsumeToken(); 13455404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeToken(); 13469bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor 13474e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().ObjC1 && Tok.is(tok::less)) 13489bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor TryParseProtocolQualifiers(); 13499bd1d8d174a9d15ae343246c8322299248b9e92aDouglas Gregor } 13501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1351b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Ambiguous(); 13525404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis} 13535404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 13545404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// isCXXFunctionDeclarator - Disambiguates between a function declarator or 13555404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// a constructor-style initializer, when parsing declaration statements. 13565404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// Returns true for function declarator and false for constructor-style 13575404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// initializer. 13585404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// If during the disambiguation process a parsing error is encountered, 13595404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// the function returns true to let the declaration parsing code handle it. 13605404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 13615404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// '(' parameter-declaration-clause ')' cv-qualifier-seq[opt] 13625404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// exception-specification[opt] 13635404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 1364b9c6261d02f688d0a9a36b736ad5956fbc737854Richard Smithbool Parser::isCXXFunctionDeclarator(bool *IsAmbiguous) { 1365d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis 1366d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis // C++ 8.2p1: 1367d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis // The ambiguity arising from the similarity between a function-style cast and 1368d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis // a declaration mentioned in 6.8 can also occur in the context of a 1369d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis // declaration. In that context, the choice is between a function declaration 1370d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis // with a redundant set of parentheses around a parameter name and an object 1371d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis // declaration with a function-style cast as the initializer. Just as for the 1372d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis // ambiguities mentioned in 6.8, the resolution is to consider any construct 1373d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis // that could possibly be a declaration a declaration. 1374d3dbbb68b1050da2f58d4bea6b23016f451968c9Argyrios Kyrtzidis 13755404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis TentativeParsingAction PA(*this); 13765404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 13775404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeParen(); 137825582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith bool InvalidAsDeclaration = false; 137925582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith TPResult TPR = TryParseParameterDeclarationClause(&InvalidAsDeclaration); 138025582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith if (TPR == TPResult::Ambiguous()) { 138125582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith if (Tok.isNot(tok::r_paren)) 138225582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith TPR = TPResult::False(); 138325582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith else { 138425582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith const Token &Next = NextToken(); 138525582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith if (Next.is(tok::amp) || Next.is(tok::ampamp) || 138625582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith Next.is(tok::kw_const) || Next.is(tok::kw_volatile) || 138725582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith Next.is(tok::kw_throw) || Next.is(tok::kw_noexcept) || 138825582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith Next.is(tok::l_square) || isCXX0XVirtSpecifier(Next) || 138925582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith Next.is(tok::l_brace) || Next.is(tok::kw_try) || 13905969a5f1b730775af4afb8f95f6c8c306ab08227Richard Smith Next.is(tok::equal) || Next.is(tok::arrow)) 139125582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith // The next token cannot appear after a constructor-style initializer, 139225582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith // and can appear next in a function definition. This must be a function 139325582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith // declarator. 139425582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith TPR = TPResult::True(); 139525582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith else if (InvalidAsDeclaration) 139625582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith // Use the absence of 'typename' as a tie-breaker. 139725582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith TPR = TPResult::False(); 139825582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith } 139925582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith } 14005404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 14015404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis PA.Revert(); 14025404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1403b9c6261d02f688d0a9a36b736ad5956fbc737854Richard Smith if (IsAmbiguous && TPR == TPResult::Ambiguous()) 1404b9c6261d02f688d0a9a36b736ad5956fbc737854Richard Smith *IsAmbiguous = true; 1405b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis 1406b9c6261d02f688d0a9a36b736ad5956fbc737854Richard Smith // In case of an error, let the declaration parsing code handle it. 1407b9c6261d02f688d0a9a36b736ad5956fbc737854Richard Smith return TPR != TPResult::False(); 14085404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis} 14095404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 14105404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// parameter-declaration-clause: 14115404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// parameter-declaration-list[opt] '...'[opt] 14125404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// parameter-declaration-list ',' '...' 14135404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 14145404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// parameter-declaration-list: 14155404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// parameter-declaration 14165404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// parameter-declaration-list ',' parameter-declaration 14175404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 14185404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// parameter-declaration: 14196ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// attribute-specifier-seq[opt] decl-specifier-seq declarator attributes[opt] 14206ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// attribute-specifier-seq[opt] decl-specifier-seq declarator attributes[opt] 1421346af03b21db01264852afb8a86719c9284855feArgyrios Kyrtzidis/// '=' assignment-expression 14226ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// attribute-specifier-seq[opt] decl-specifier-seq abstract-declarator[opt] 14236ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// attributes[opt] 14246ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// attribute-specifier-seq[opt] decl-specifier-seq abstract-declarator[opt] 14256ee326af4e77e6f05973486097884d7431f2108dRichard Smith/// attributes[opt] '=' assignment-expression 14265404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 142725582fc0aeac053cdc115ee95cbed53f28bf592eRichard SmithParser::TPResult 142825582fc0aeac053cdc115ee95cbed53f28bf592eRichard SmithParser::TryParseParameterDeclarationClause(bool *InvalidAsDeclaration) { 14295404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 14305404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (Tok.is(tok::r_paren)) 1431b9c6261d02f688d0a9a36b736ad5956fbc737854Richard Smith return TPResult::Ambiguous(); 14325404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 14335404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // parameter-declaration-list[opt] '...'[opt] 14345404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // parameter-declaration-list ',' '...' 14355404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // 14365404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // parameter-declaration-list: 14375404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // parameter-declaration 14385404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // parameter-declaration-list ',' parameter-declaration 14395404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // 14405404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis while (1) { 14415404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // '...'[opt] 14425404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (Tok.is(tok::ellipsis)) { 14435404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeToken(); 14442259286fc5c1514089b17ec93e26ca56ba8ac2b6Richard Smith if (Tok.is(tok::r_paren)) 14452259286fc5c1514089b17ec93e26ca56ba8ac2b6Richard Smith return TPResult::True(); // '...)' is a sign of a function declarator. 14462259286fc5c1514089b17ec93e26ca56ba8ac2b6Richard Smith else 14472259286fc5c1514089b17ec93e26ca56ba8ac2b6Richard Smith return TPResult::False(); 14485404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 14495404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 14506ce48a70ace62eb0eaf7b2769d05c5f13b7c7b6cRichard Smith // An attribute-specifier-seq here is a sign of a function declarator. 14516ce48a70ace62eb0eaf7b2769d05c5f13b7c7b6cRichard Smith if (isCXX11AttributeSpecifier(/*Disambiguate*/false, 14526ce48a70ace62eb0eaf7b2769d05c5f13b7c7b6cRichard Smith /*OuterMightBeMessageSend*/true)) 14536ce48a70ace62eb0eaf7b2769d05c5f13b7c7b6cRichard Smith return TPResult::True(); 14546ce48a70ace62eb0eaf7b2769d05c5f13b7c7b6cRichard Smith 14550b7e678a11ece4288dc01aebb5b17e5eef8f8d2dJohn McCall ParsedAttributes attrs(AttrFactory); 14567f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall MaybeParseMicrosoftAttributes(attrs); 1457334d47e92e9f241576fdeb7477b69a03136ba854Francois Pichet 14585404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // decl-specifier-seq 1459d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith // A parameter-declaration's initializer must be preceded by an '=', so 1460d81e961f905e3ea57f6808e5a5686a8324270984Richard Smith // decl-specifier-seq '{' is not a parameter in C++11. 146125582fc0aeac053cdc115ee95cbed53f28bf592eRichard Smith TPResult TPR = TryParseDeclarationSpecifier(InvalidAsDeclaration); 1462b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis if (TPR != TPResult::Ambiguous()) 14635404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis return TPR; 14645404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 14655404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // declarator 14665404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // abstract-declarator[opt] 14675404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis TPR = TryParseDeclarator(true/*mayBeAbstract*/); 1468b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis if (TPR != TPResult::Ambiguous()) 14695404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis return TPR; 14705404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1471346af03b21db01264852afb8a86719c9284855feArgyrios Kyrtzidis // [GNU] attributes[opt] 1472346af03b21db01264852afb8a86719c9284855feArgyrios Kyrtzidis if (Tok.is(tok::kw___attribute)) 1473346af03b21db01264852afb8a86719c9284855feArgyrios Kyrtzidis return TPResult::True(); 1474346af03b21db01264852afb8a86719c9284855feArgyrios Kyrtzidis 14755404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (Tok.is(tok::equal)) { 14765404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // '=' assignment-expression 14775404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // Parse through assignment-expression. 1478eb52f86a62db523e3c993686b3ed92c55d59d53cDavid Blaikie if (!SkipUntil(tok::comma, tok::r_paren, true/*StopAtSemi*/, 1479eb52f86a62db523e3c993686b3ed92c55d59d53cDavid Blaikie true/*DontConsume*/)) 1480b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Error(); 14815404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 14825404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 14835404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (Tok.is(tok::ellipsis)) { 14845404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeToken(); 14852259286fc5c1514089b17ec93e26ca56ba8ac2b6Richard Smith if (Tok.is(tok::r_paren)) 14862259286fc5c1514089b17ec93e26ca56ba8ac2b6Richard Smith return TPResult::True(); // '...)' is a sign of a function declarator. 14872259286fc5c1514089b17ec93e26ca56ba8ac2b6Richard Smith else 14882259286fc5c1514089b17ec93e26ca56ba8ac2b6Richard Smith return TPResult::False(); 14895404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 14905404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 14915404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (Tok.isNot(tok::comma)) 14925404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis break; 14935404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeToken(); // the comma. 14945404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 14955404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1496b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Ambiguous(); 14975404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis} 14985404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1499d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis/// TryParseFunctionDeclarator - We parsed a '(' and we want to try to continue 1500d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis/// parsing as a function declarator. 1501d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis/// If TryParseFunctionDeclarator fully parsed the function declarator, it will 1502d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis/// return TPResult::Ambiguous(), otherwise it will return either False() or 1503d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis/// Error(). 15041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// 15055404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// '(' parameter-declaration-clause ')' cv-qualifier-seq[opt] 15065404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// exception-specification[opt] 15075404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 15085404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// exception-specification: 15095404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 'throw' '(' type-id-list[opt] ')' 15105404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 1511b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios KyrtzidisParser::TPResult Parser::TryParseFunctionDeclarator() { 1512d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis 1513d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis // The '(' is already parsed. 1514d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis 1515d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis TPResult TPR = TryParseParameterDeclarationClause(); 1516d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis if (TPR == TPResult::Ambiguous() && Tok.isNot(tok::r_paren)) 1517d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis TPR = TPResult::False(); 1518d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis 1519d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis if (TPR == TPResult::False() || TPR == TPResult::Error()) 1520d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis return TPR; 1521d3616a8d0b1506966cb669c19dbfc91bf42c810aArgyrios Kyrtzidis 15225404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // Parse through the parens. 15235404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (!SkipUntil(tok::r_paren)) 1524b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Error(); 15255404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 15265404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // cv-qualifier-seq 15275404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis while (Tok.is(tok::kw_const) || 15285404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis Tok.is(tok::kw_volatile) || 15295404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis Tok.is(tok::kw_restrict) ) 15305404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeToken(); 15315404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1532e3c7a7ca66c02567543dbb5ec493818e00e8b177Douglas Gregor // ref-qualifier[opt] 1533e3c7a7ca66c02567543dbb5ec493818e00e8b177Douglas Gregor if (Tok.is(tok::amp) || Tok.is(tok::ampamp)) 1534e3c7a7ca66c02567543dbb5ec493818e00e8b177Douglas Gregor ConsumeToken(); 1535e3c7a7ca66c02567543dbb5ec493818e00e8b177Douglas Gregor 15365404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // exception-specification 15375404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (Tok.is(tok::kw_throw)) { 15385404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeToken(); 15395404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (Tok.isNot(tok::l_paren)) 1540b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Error(); 15415404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 15425404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis // Parse through the parens after 'throw'. 15435404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeParen(); 15445404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (!SkipUntil(tok::r_paren)) 1545b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Error(); 15465404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis } 154760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (Tok.is(tok::kw_noexcept)) { 154860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl ConsumeToken(); 154960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl // Possibly an expression as well. 155060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (Tok.is(tok::l_paren)) { 155160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl // Find the matching rparen. 155260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl ConsumeParen(); 155360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (!SkipUntil(tok::r_paren)) 155460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return TPResult::Error(); 155560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } 155660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } 15575404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1558b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Ambiguous(); 15595404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis} 15605404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 15615404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// '[' constant-expression[opt] ']' 15625404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis/// 1563b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios KyrtzidisParser::TPResult Parser::TryParseBracketDeclarator() { 15645404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis ConsumeBracket(); 15655404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis if (!SkipUntil(tok::r_square)) 1566b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Error(); 15675404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis 1568b9f341916e484ff6ba2c2d28c8b2dd5fa12b0015Argyrios Kyrtzidis return TPResult::Ambiguous(); 15695404a156be26de1c63ca9916187f970848bb4dbbArgyrios Kyrtzidis} 1570