]> granicus.if.org Git - clang/commitdiff
Make VerifyIntegerConstantExpr print extension warnings for non-ICEs.
authorEli Friedman <eli.friedman@gmail.com>
Sat, 25 Apr 2009 22:26:58 +0000 (22:26 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sat, 25 Apr 2009 22:26:58 +0000 (22:26 +0000)
Overall, I'm not particularly happy with the current situation regarding
constant expression diagnostics, but I plan to improve it at some point.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70089 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/Sema/PR2963-enum-constant.c

index e7d5ee18ff876f1940ee49c0d41cfdf717d34e0b..6e86e71bd4a9eec7721e9446dea793cdad4fcf0f 100644 (file)
@@ -4929,6 +4929,13 @@ bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy,
 }
 
 bool Sema::VerifyIntegerConstantExpression(const Expr *E, llvm::APSInt *Result){
+  llvm::APSInt ICEResult;
+  if (E->isIntegerConstantExpr(ICEResult, Context)) {
+    if (Result)
+      *Result = ICEResult;
+    return false;
+  }
+
   Expr::EvalResult EvalResult;
 
   if (!E->Evaluate(EvalResult, Context) || !EvalResult.Val.isInt() ||
@@ -4946,14 +4953,12 @@ bool Sema::VerifyIntegerConstantExpression(const Expr *E, llvm::APSInt *Result){
     return true;
   }
 
-  if (EvalResult.Diag) {
-    Diag(E->getExprLoc(), diag::ext_expr_not_ice) <<
-      E->getSourceRange();
+  Diag(E->getExprLoc(), diag::ext_expr_not_ice) <<
+    E->getSourceRange();
 
-    // Print the reason it's not a constant.
-    if (Diags.getDiagnosticLevel(diag::ext_expr_not_ice) != Diagnostic::Ignored)
-      Diag(EvalResult.DiagLoc, EvalResult.Diag);
-  }
+  if (EvalResult.Diag &&
+      Diags.getDiagnosticLevel(diag::ext_expr_not_ice) != Diagnostic::Ignored)
+    Diag(EvalResult.DiagLoc, EvalResult.Diag);
 
   if (Result)
     *Result = EvalResult.Val.getInt();
index 7a08814815541c10a6448f1c4c1392280b225749..78f2326dae1bb44f03d1d0c9b0a0697df4936305 100644 (file)
@@ -13,5 +13,5 @@ enum
 
 enum
 {
-        SOME_VALUE= FLOAT_TO_SHORT_FIXED(0.1)
+        SOME_VALUE= FLOAT_TO_SHORT_FIXED(0.1) // expected-warning{{expression is not integer constant expression}}
 };