diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2009-04-25 22:26:58 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2009-04-25 22:26:58 +0000 |
commit | bb967cc98d6774ad6f4a423824f17ace8220e22d (patch) | |
tree | 6305cde5cd99d86752c210416e7f2ed612441fe8 /clang | |
parent | 1c1595f9ef074521ef363040b9e3d54ed3d1527e (diff) | |
download | bcm5719-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
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 19 | ||||
-rw-r--r-- | clang/test/Sema/PR2963-enum-constant.c | 2 |
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}} }; |