From: Nuno Lopes Date: Mon, 2 Feb 2009 16:07:41 +0000 (+0000) Subject: allow cast from array to int to be considered as constant X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=839508150a7a595b6172217eeddc4d024fc201c5;p=clang allow cast from array to int to be considered as constant git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63519 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 7d7badd2cb..fe7ab92b6a 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -2075,8 +2075,7 @@ bool Sema::CheckArithmeticConstantExpression(const Expr* Init) { if (SubExpr->getType()->isPointerType()) { const Expr* Base = FindExpressionBaseAddress(SubExpr); // If the pointer has a null base, this is an offsetof-like construct - if (!Base) - return CheckAddressConstantExpression(SubExpr); + return Base ? false : CheckAddressConstantExpression(SubExpr); } InitializerElementNotConstant(Init); diff --git a/test/Sema/static-init.c b/test/Sema/static-init.c index 2f1380062d..a4035e69df 100644 --- a/test/Sema/static-init.c +++ b/test/Sema/static-init.c @@ -2,6 +2,18 @@ static int f = 10; static int b = f; // expected-error {{initializer element is not a compile-time constant}} -float r = (float) &r; // expected-error {{initializer element is not a compile-time constant}} +float r = (float) &r; // FIXME: should give an error: ptr value used where a float was expected long long s = (long long) &s; _Bool t = &t; + + +union bar { + int i; +}; + +struct foo { + unsigned ptr; +}; + +union bar u[1]; +struct foo x = {(int) u}; // no-error