From: Chris Lattner Date: Tue, 13 Nov 2007 20:50:37 +0000 (+0000) Subject: Parse "sizeof(arr)[0]" as a sizeof of an expr if arr X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4c1a2a97b203d7db248b7a83bb3f471c1aa37e26;p=clang Parse "sizeof(arr)[0]" as a sizeof of an expr if arr is an expression. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44065 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Parse/ParseExpr.cpp b/Parse/ParseExpr.cpp index 2bc1d62fcf..c1a200cd71 100644 --- a/Parse/ParseExpr.cpp +++ b/Parse/ParseExpr.cpp @@ -748,11 +748,15 @@ Parser::ExprResult Parser::ParseSizeofAlignofExpression() { // If ParseParenExpression parsed a '(typename)' sequence only, the this is // sizeof/alignof a type. Otherwise, it is sizeof/alignof an expression. - if (ExprType == CastExpr) { + if (ExprType == CastExpr) return Actions.ActOnSizeOfAlignOfTypeExpr(OpTok.getLocation(), OpTok.is(tok::kw_sizeof), LParenLoc, CastTy, RParenLoc); - } + + // 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(Operand); } // If we get here, the operand to the sizeof/alignof was an expresion. diff --git a/test/Parser/expressions.c b/test/Parser/expressions.c index 3fb8c1c89d..3b47260c32 100644 --- a/test/Parser/expressions.c +++ b/test/Parser/expressions.c @@ -28,3 +28,12 @@ int test_offsetof() { // FIXME: change into something that is semantically correct. __builtin_offsetof(int, a.b.c[4][5]); } + +void test_sizeof(){ + int arr[10]; + sizeof arr[0]; + sizeof(arr[0]); + sizeof(arr)[0]; +} + +