From: Eli Friedman Date: Mon, 25 May 2009 19:41:42 +0000 (+0000) Subject: PR4122: Tweak the ambiguity handling to handle (S())() correctly. I've X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b53f08ac87f1e1f4bc2fbfa4560c2183a82020ee;p=clang PR4122: Tweak the ambiguity handling to handle (S())() correctly. I've left out handling for stuff like (S())++ for the moment. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72394 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseExprCXX.cpp b/lib/Parse/ParseExprCXX.cpp index 5e6ba68067..681c6adb2e 100644 --- a/lib/Parse/ParseExprCXX.cpp +++ b/lib/Parse/ParseExprCXX.cpp @@ -1088,12 +1088,17 @@ Parser::ParseCXXAmbiguousParenExpression(ParenParseOption &ExprType, ParseAs = CompoundLiteral; } else { bool NotCastExpr; - // Try parsing the cast-expression that may follow. - // If it is not a cast-expression, NotCastExpr will be true and no token - // will be consumed. - Result = ParseCastExpression(false/*isUnaryExpression*/, - false/*isAddressofOperand*/, - NotCastExpr); + // FIXME: Special-case ++ and --: "(S())++;" is not a cast-expression + if (Tok.is(tok::l_paren) && NextToken().is(tok::r_paren)) { + NotCastExpr = true; + } else { + // Try parsing the cast-expression that may follow. + // If it is not a cast-expression, NotCastExpr will be true and no token + // will be consumed. + Result = ParseCastExpression(false/*isUnaryExpression*/, + false/*isAddressofOperand*/, + NotCastExpr); + } // If we parsed a cast-expression, it's really a type-id, otherwise it's // an expression. diff --git a/test/Parser/cxx-ambig-paren-expr.cpp b/test/Parser/cxx-ambig-paren-expr.cpp index 0069561256..6f23b35d3e 100644 --- a/test/Parser/cxx-ambig-paren-expr.cpp +++ b/test/Parser/cxx-ambig-paren-expr.cpp @@ -16,4 +16,11 @@ void f() { typedef int *PT; // Make sure stuff inside the parens are parsed only once (only one warning). x = (PT()[(int){1}]); // expected-warning {{compound literals}} + + // Special case: empty parens is a call, not an expression + struct S{int operator()();}; + (S())(); + + // FIXME: Special case: "++" is postfix here, not prefix + // (S())++; }