return TPR == TPResult::True();
}
-/// isCXXTypeIdInParens - Assumes that a '(' was parsed and now we want to\r
-/// know whether the parens contain an expression or a type-id.\r
-/// Returns true for a type-id and false for an expression.\r
-/// If during the disambiguation process a parsing error is encountered,\r
-/// the function returns true to let the declaration parsing code handle it.\r
-///\r
-/// type-id:\r
+/// isCXXTypeIdInParens - Assumes that a '(' was parsed and now we want to
+/// know whether the parens contain an expression or a type-id.
+/// Returns true for a type-id and false for an expression.
+/// If during the disambiguation process a parsing error is encountered,
+/// the function returns true to let the declaration parsing code handle it.
+///
+/// type-id:
/// type-specifier-seq abstract-declarator[opt]
///
bool Parser::isCXXTypeIdInParens() {
+
+ // C++ 8.2p2:
+ // The ambiguity arising from the similarity between a function-style cast and
+ // a type-id can occur in different contexts. The ambiguity appears as a
+ // choice between a function-style cast expression and a declaration of a
+ // type. The resolution is that any construct that could possibly be a type-id
+ // in its syntactic context shall be considered a type-id.
+
TPResult TPR = isCXXDeclarationSpecifier();
if (TPR != TPResult::Ambiguous())
return TPR != TPResult::False(); // Returns true for TPResult::True() or
/// exception-specification[opt]
///
bool Parser::isCXXFunctionDeclarator() {
+
+ // C++ 8.2p1:
+ // The ambiguity arising from the similarity between a function-style cast and
+ // a declaration mentioned in 6.8 can also occur in the context of a
+ // declaration. In that context, the choice is between a function declaration
+ // with a redundant set of parentheses around a parameter name and an object
+ // declaration with a function-style cast as the initializer. Just as for the
+ // ambiguities mentioned in 6.8, the resolution is to consider any construct
+ // that could possibly be a declaration a declaration.
+
TentativeParsingAction PA(*this);
ConsumeParen();
-// RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -verify -pedantic-errors %s
void f() {
int a;
if (int(a)+1) {}
for (int(a)+1;;) {}
a = sizeof(int()+1);
+ a = sizeof(int(1));
typeof(int()+1) a2;
+ (int(1)); // expected-warning {{expression result unused}}
+
+ // type-id
+ (int())1; // expected-error {{used type 'int ()' where arithmetic or pointer type is required}}
// Declarations.
T(*d)(int(p)); // expected-warning {{statement was disambiguated as declaration}} expected-error {{previous definition is here}}
if (int(a)=1) {}
int(d3(int())); // expected-warning {{statement was disambiguated as declaration}}
}
+
+class C { };
+void fn(int(C)) { } // void fn(int(*fp)(C c)) { }
+ // not: void fn(int C);
+int g(C);
+
+void foo() {
+ fn(1); // expected-error {{incompatible integer to pointer conversion passing 'int', expected 'int (*)(class C)'}}
+ fn(g); // OK
+}