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