diff options
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 6 | ||||
-rw-r--r-- | test/Sema/const-ptr-int-ptr-cast.c | 4 | ||||
-rw-r--r-- | test/Sema/static-init.c | 9 |
3 files changed, 15 insertions, 4 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 3130f02bef..4ec2dc6968 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -2371,6 +2371,12 @@ bool Sema::CheckArithmeticConstantExpression(const Expr* Init) { } bool Sema::CheckForConstantInitializer(Expr *Init, QualType DclT) { + if (Init->isConstantInitializer(Context)) { + return false; + } + InitializerElementNotConstant(Init); + return true; + if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) Init = DIE->getInit(); diff --git a/test/Sema/const-ptr-int-ptr-cast.c b/test/Sema/const-ptr-int-ptr-cast.c index 6bf44b05b3..3590583cd5 100644 --- a/test/Sema/const-ptr-int-ptr-cast.c +++ b/test/Sema/const-ptr-int-ptr-cast.c @@ -1,3 +1,5 @@ // RUN: clang -fsyntax-only -verify %s -char *a = (void*)(unsigned long long)(void*)&a; +#include <stdint.h> + +char *a = (void*)(uintptr_t)(void*)&a; diff --git a/test/Sema/static-init.c b/test/Sema/static-init.c index f7648a6d35..9ab3146ee7 100644 --- a/test/Sema/static-init.c +++ b/test/Sema/static-init.c @@ -1,9 +1,12 @@ // RUN: clang -arch i386 -fsyntax-only -verify %s + +#include <stdint.h> + static int f = 10; static int b = f; // 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; +float r = (float) &r; // expected-error {{initializer element is not a compile-time constant}} +intptr_t s = (intptr_t) &s; _Bool t = &t; @@ -16,5 +19,5 @@ struct foo { }; union bar u[1]; -struct foo x = {(long) u}; // no-error +struct foo x = {(intptr_t) u}; // no-error struct foo y = {(char) u}; // expected-error {{initializer element is not a compile-time constant}} |