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 | 5dc055350ead45dca64b5e6d542569baab330b35 (patch) | |
| tree | f421942ca00ea39bddbfd4182ca92fcd639f9c2c /clang/lib/Parse/ParseExpr.cpp | |
| parent | 59fba9d2b92b401b4937c5123490e071000ca596 (diff) | |
| download | bcm5719-llvm-5dc055350ead45dca64b5e6d542569baab330b35.tar.gz bcm5719-llvm-5dc055350ead45dca64b5e6d542569baab330b35.zip | |
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>.
llvm-svn: 109606
Diffstat (limited to 'clang/lib/Parse/ParseExpr.cpp')
| -rw-r--r-- | clang/lib/Parse/ParseExpr.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index 40748a70193..589bf4a35f8 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/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. |

