From: Steve Naroff Date: Wed, 9 Jan 2008 00:05:37 +0000 (+0000) Subject: Teach Expr::isConstantExpr() about CompoundLiterals. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b8f13a8baff3df080fe024fec47746e9a79fe649;p=clang Teach Expr::isConstantExpr() about CompoundLiterals. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45764 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/AST/Expr.cpp b/AST/Expr.cpp index 236c783922..726e4939cc 100644 --- a/AST/Expr.cpp +++ b/AST/Expr.cpp @@ -469,6 +469,10 @@ bool Expr::isConstantExpr(ASTContext &Ctx, SourceLocation *Loc) const { return TR->isArrayType(); return false; } + case CompoundLiteralExprClass: + if (Loc) *Loc = getLocStart(); + // Allow "(int []){2,4}", since the array will be converted to a pointer. + return TR->isArrayType(); case UnaryOperatorClass: { const UnaryOperator *Exp = cast(this); diff --git a/test/Sema/compound-literal.c b/test/Sema/compound-literal.c index f57159ac6a..2c9595c50e 100644 --- a/test/Sema/compound-literal.c +++ b/test/Sema/compound-literal.c @@ -2,9 +2,16 @@ struct foo { int a, b; }; +static struct foo t = (struct foo){0,0}; // -expected-error {{initializer element is not constant}} +static struct foo t2 = {0,0}; +static struct foo t3 = t2; // -expected-error {{initializer element is not constant}} +static int *p = (int []){2,4}; +static int x = (int){1}; // -expected-error {{initializer element is not constant}} -expected-warning{{braces around scalar initializer}} + extern void fooFunc(struct foo *pfoo); int main(int argc, char **argv) { fooFunc(&(struct foo){ 1, 2 }); } +