aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-02-22 06:45:27 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-02-22 06:45:27 +0000
commit578a97249c10eb83f25b408de1edfb70f5a4233c (patch)
treeacb8a7a848aa0a7c2ca6e17a929e7e3ec2668b83
parente28099bf301ad8b0b77cb11f94caad3c38d97dda (diff)
Throw the switch to exclusively use Evaluate (along with the small
helper isConstantInitializer) to check whether an initializer is constant. This passes tests, but it's possible that it'll cause regressions with real-world code. Future work: 1. The diagnostics obtained this way are lower quality at the moment; some work both here and in Evaluate is needed for accurate diagnostics. 2. We probably need some extra code when we're in -pedantic mode so we can strictly enforce the rules in C99 6.6p7. 3. Dead code cleanup (this should wait until after 2, because we might want to re-use some of the code). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65265 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaDecl.cpp6
-rw-r--r--test/Sema/const-ptr-int-ptr-cast.c4
-rw-r--r--test/Sema/static-init.c9
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}}