PR4122: Tweak the ambiguity handling to handle (S())() correctly. I've

left out handling for stuff like (S())++ for the moment.

llvm-svn: 72394
This commit is contained in:
Eli Friedman 2009-05-25 19:41:42 +00:00
parent 23464b8f14
commit cf7530ff43
2 changed files with 18 additions and 6 deletions

View File

@ -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.

View File

@ -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())++;
}