From 2a3a1bd20e62205260eb2ba3f91a2b6b2db3ffb8 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Wed, 28 Jul 2010 18:22:12 +0000 Subject: [PATCH] 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 . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109606 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Parse/ParseExpr.cpp | 11 +++++++---- 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; } + +// +void test2() { + int a; + short b; + __typeof__(a) (*f)(__typeof__(b)); +} -- 2.40.0