aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaExpr.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2011-12-12 09:28:41 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2011-12-12 09:28:41 +0000
commitdd1f29b6d686899bfd033f26e16cb1621e5549e8 (patch)
tree8d9c131dd87c383779b7f03b114bebd12b193515 /lib/Sema/SemaExpr.cpp
parent50058ec63f38eabeb94391a61d2e7fb18a062173 (diff)
Prepare constant expression infrastructure for the generation of richer
diagnostics. No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146365 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExpr.cpp')
-rw-r--r--lib/Sema/SemaExpr.cpp28
1 files changed, 17 insertions, 11 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index f7e67cdf3e..d0aa0a6e7c 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -9190,6 +9190,8 @@ bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy,
}
bool Sema::VerifyIntegerConstantExpression(const Expr *E, llvm::APSInt *Result){
+ // FIXME: In C++11, this evaluates the expression even if it's not an ICE.
+ // Don't evaluate it a second time below just to get the diagnostics.
llvm::APSInt ICEResult;
if (E->isIntegerConstantExpr(ICEResult, Context)) {
if (Result)
@@ -9198,29 +9200,33 @@ bool Sema::VerifyIntegerConstantExpression(const Expr *E, llvm::APSInt *Result){
}
Expr::EvalResult EvalResult;
+ llvm::SmallVector<PartialDiagnosticAt, 8> Notes;
+ EvalResult.Diag = &Notes;
if (!E->EvaluateAsRValue(EvalResult, Context) || !EvalResult.Val.isInt() ||
EvalResult.HasSideEffects) {
Diag(E->getExprLoc(), diag::err_expr_not_ice) << E->getSourceRange();
- if (EvalResult.Diag) {
- // We only show the note if it's not the usual "invalid subexpression"
- // or if it's actually in a subexpression.
- if (EvalResult.Diag != diag::note_invalid_subexpr_in_const_expr ||
- E->IgnoreParens() != EvalResult.DiagExpr->IgnoreParens())
- Diag(EvalResult.DiagLoc, EvalResult.Diag);
+ // We only show the notes if they're not the usual "invalid subexpression"
+ // or if they are actually in a subexpression.
+ if (!Notes.empty() &&
+ (Notes.size() != 1 ||
+ Notes[0].second.getDiagID() != diag::note_invalid_subexpr_in_const_expr
+ || Notes[0].first != E->IgnoreParens()->getExprLoc())) {
+ for (unsigned I = 0, N = Notes.size(); I != N; ++I)
+ Diag(Notes[I].first, Notes[I].second);
}
return true;
}
- Diag(E->getExprLoc(), diag::ext_expr_not_ice) <<
- E->getSourceRange();
+ Diag(E->getExprLoc(), diag::ext_expr_not_ice) << E->getSourceRange();
- if (EvalResult.Diag &&
- Diags.getDiagnosticLevel(diag::ext_expr_not_ice, EvalResult.DiagLoc)
+ if (Notes.size() &&
+ Diags.getDiagnosticLevel(diag::ext_expr_not_ice, E->getExprLoc())
!= DiagnosticsEngine::Ignored)
- Diag(EvalResult.DiagLoc, EvalResult.Diag);
+ for (unsigned I = 0, N = Notes.size(); I != N; ++I)
+ Diag(Notes[I].first, Notes[I].second);
if (Result)
*Result = EvalResult.Val.getInt();