diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-07-28 18:22:12 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-07-28 18:22:12 +0000 |
commit | 2a3a1bd20e62205260eb2ba3f91a2b6b2db3ffb8 (patch) | |
tree | e2367101cc7da9e28789ada773f4334c1401d358 | |
parent | 7e86b28924a171a26d970bed5a163b39d3629577 (diff) |
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
-rw-r--r-- | lib/Parse/ParseExpr.cpp | 11 | ||||
-rw-r--r-- | test/Parser/typeof.c | 7 |
2 files changed, 14 insertions, 4 deletions
diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index 40748a7019..589bf4a35f 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -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. diff --git a/test/Parser/typeof.c b/test/Parser/typeof.c index cf0e47a6b1..7953a69fed 100644 --- a/test/Parser/typeof.c +++ b/test/Parser/typeof.c @@ -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)); +} |