mirror of https://github.com/microsoft/clang.git
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:
parent
7e86b28924
commit
2a3a1bd20e
|
@ -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.
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue