summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-04-25 22:26:58 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-04-25 22:26:58 +0000
commitbb967cc98d6774ad6f4a423824f17ace8220e22d (patch)
tree6305cde5cd99d86752c210416e7f2ed612441fe8
parent1c1595f9ef074521ef363040b9e3d54ed3d1527e (diff)
downloadbcm5719-llvm-bb967cc98d6774ad6f4a423824f17ace8220e22d.tar.gz
bcm5719-llvm-bb967cc98d6774ad6f4a423824f17ace8220e22d.zip
Make VerifyIntegerConstantExpr print extension warnings for non-ICEs.
Overall, I'm not particularly happy with the current situation regarding constant expression diagnostics, but I plan to improve it at some point. llvm-svn: 70089
-rw-r--r--clang/lib/Sema/SemaExpr.cpp19
-rw-r--r--clang/test/Sema/PR2963-enum-constant.c2
2 files changed, 13 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index e7d5ee18ff8..6e86e71bd4a 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -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();
diff --git a/clang/test/Sema/PR2963-enum-constant.c b/clang/test/Sema/PR2963-enum-constant.c
index 7a088148155..78f2326dae1 100644
--- a/clang/test/Sema/PR2963-enum-constant.c
+++ b/clang/test/Sema/PR2963-enum-constant.c
@@ -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}}
};
OpenPOWER on IntegriCloud