summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2008-12-05 05:09:56 +0000
committerAnders Carlsson <andersca@mac.com>2008-12-05 05:09:56 +0000
commit1e495d986059e47e44dfe8ed70ef5137eb11f403 (patch)
treee3b2ad5db0e623169f5dbf198e5ea8ba82aeace4
parentbd4551cced6ac25e2b5a5c4126921462bf12b4fc (diff)
downloadbcm5719-llvm-1e495d986059e47e44dfe8ed70ef5137eb11f403.tar.gz
bcm5719-llvm-1e495d986059e47e44dfe8ed70ef5137eb11f403.zip
Make Sema::CheckForConstantInitializer use Expr::Evaluate. This fixes PR3130.
llvm-svn: 60580
-rw-r--r--clang/lib/Sema/SemaDecl.cpp8
-rw-r--r--clang/test/CodeGen/PR3130-cond-constant.c3
-rw-r--r--clang/test/Sema/constant-builtins.c3
3 files changed, 13 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 65abc36cb0b..411307522be 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -1651,8 +1651,13 @@ bool Sema::CheckArithmeticConstantExpression(const Expr* Init) {
}
bool Sema::CheckForConstantInitializer(Expr *Init, QualType DclT) {
+ Expr::EvalResult Result;
+
Init = Init->IgnoreParens();
+ if (Init->Evaluate(Result, Context) && !Result.HasSideEffects)
+ return false;
+
// Look through CXXDefaultArgExprs; they have no meaning in this context.
if (CXXDefaultArgExpr* DAE = dyn_cast<CXXDefaultArgExpr>(Init))
return CheckForConstantInitializer(DAE->getExpr(), DclT);
@@ -1672,6 +1677,9 @@ bool Sema::CheckForConstantInitializer(Expr *Init, QualType DclT) {
return false;
}
+ // FIXME: We can probably remove some of this code below, now that
+ // Expr::Evaluate is doing the heavy lifting for scalars.
+
if (Init->isNullPointerConstant(Context))
return false;
if (Init->getType()->isArithmeticType()) {
diff --git a/clang/test/CodeGen/PR3130-cond-constant.c b/clang/test/CodeGen/PR3130-cond-constant.c
new file mode 100644
index 00000000000..7aa2ce1bc06
--- /dev/null
+++ b/clang/test/CodeGen/PR3130-cond-constant.c
@@ -0,0 +1,3 @@
+// RUN: clang -emit-llvm %s -o -
+
+int a = 2.0 ? 1 : 2;
diff --git a/clang/test/Sema/constant-builtins.c b/clang/test/Sema/constant-builtins.c
index d6cf45755da..b1c5e2af108 100644
--- a/clang/test/Sema/constant-builtins.c
+++ b/clang/test/Sema/constant-builtins.c
@@ -19,5 +19,6 @@ int h0 = __builtin_types_compatible_p(int,float); // expected-warning {{extensio
short somefunc();
-short t = __builtin_constant_p(5353) ? 42 : somefunc(); // expected-warning {{expression is not a constant, but is accepted as one by GNU extensions}}
+short t = __builtin_constant_p(5353) ? 42 : somefunc();
+
OpenPOWER on IntegriCloud