The grammar for GNU typeof in C requires an expression to be

parenthesized, unlike in C++, e.g.,

  C has: typeof ( expression) 
  C++ has: typeof unary-expression

So, once we've parsed a parenthesized expression after typeof, we
should only go on to parse the postfix expression suffix if we're in
C++. Fixes <rdar://problem/8237491>.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109606 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Douglas Gregor 2010-07-28 18:22:12 +00:00
parent 7e86b28924
commit 2a3a1bd20e
2 changed files with 14 additions and 4 deletions

View File

@ -1170,10 +1170,13 @@ Parser::ParseExprAfterTypeofSizeofAlignof(const Token &OpTok,
return ExprEmpty();
}
// If this is a parenthesized expression, it is the start of a
// unary-expression, but doesn't include any postfix pieces. Parse these
// now if present.
Operand = ParsePostfixExpressionSuffix(move(Operand));
if (getLang().CPlusPlus || OpTok.isNot(tok::kw_typeof)) {
// GNU typeof in C requires the expression to be parenthesized. Not so for
// sizeof/alignof or in C++. Therefore, the parenthesized expression is
// the start of a unary-expression, but doesn't include any postfix
// pieces. Parse these now if present.
Operand = ParsePostfixExpressionSuffix(move(Operand));
}
}
// If we get here, the operand to the typeof/sizeof/alignof was an expresion.

View File

@ -17,3 +17,10 @@ static void test() {
int xx;
int *i;
}
// <rdar://problem/8237491>
void test2() {
int a;
short b;
__typeof__(a) (*f)(__typeof__(b));
}