]> granicus.if.org Git - clang/commitdiff
Make Sema::CheckForConstantInitializer use Expr::Evaluate. This fixes PR3130.
authorAnders Carlsson <andersca@mac.com>
Fri, 5 Dec 2008 05:09:56 +0000 (05:09 +0000)
committerAnders Carlsson <andersca@mac.com>
Fri, 5 Dec 2008 05:09:56 +0000 (05:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60580 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/CodeGen/PR3130-cond-constant.c [new file with mode: 0644]
test/Sema/constant-builtins.c

index 65abc36cb0b6cb15259917a67e4ad3513c77a158..411307522be73e1dd6959430994142466f539a15 100644 (file)
@@ -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/test/CodeGen/PR3130-cond-constant.c b/test/CodeGen/PR3130-cond-constant.c
new file mode 100644 (file)
index 0000000..7aa2ce1
--- /dev/null
@@ -0,0 +1,3 @@
+// RUN: clang -emit-llvm %s -o -
+
+int a = 2.0 ? 1 : 2;
index d6cf45755daa19d8c1ba59b9cfd81be5b142ea8d..b1c5e2af108ab9e82fd068110bda29610031f3b9 100644 (file)
@@ -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();
+