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
}
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();
// RUN: clang -fsyntax-only -verify %s
-char *a = (void*)(unsigned long long)(void*)&a;
+#include <stdint.h>
+
+char *a = (void*)(uintptr_t)(void*)&a;
// 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;
};
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}}