//===----------------------------------------------------------------------===//
// Constant expressions
-DIAG(err_expr_not_constant, ERROR,
- "expression is invalid in a constant expression")
-DIAG(err_expr_divide_by_zero, ERROR,
- "division by zero")
-DIAG(ext_comma_in_constant_expr, EXTENSION,
- "C does not permit evaluated commas in constant expression")
+DIAG(err_expr_not_ice, ERROR,
+ "expression is not an integer constant expression")
+DIAG(ext_expr_not_ice, EXTENSION,
+ "expression is not integer constant expression "
+ "(but is allowed as an extension)")
+
+DIAG(note_comma_in_ice, NOTE,
+ "C does not permit evaluated commas in an integer constant expression")
+DIAG(note_invalid_subexpr_in_ice, NOTE,
+ "subexpression not valid in an integer constant expression")
+DIAG(note_expr_divide_by_zero, NOTE,
+ "division by zero")
// Semantic analysis of string and character constant literals.
DIAG(ext_nonstandard_escape, EXTENSION,
}
bool VisitExpr(Expr *E) {
- return Error(E->getLocStart(), diag::err_expr_not_constant, E);
+ return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
}
bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
}
// Otherwise, random variable references are not constants.
- return Error(E->getLocStart(), diag::err_expr_not_constant, E);
+ return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
}
/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way
switch (E->isBuiltinCall()) {
default:
- return Error(E->getLocStart(), diag::err_expr_not_constant, E);
+ return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
case Builtin::BI__builtin_classify_type:
Result.setIsSigned(true);
Result = EvaluateBuiltinClassifyType(E);
return true;
if (Info.ShortCircuit)
- return Extension(E->getOperatorLoc(), diag::ext_comma_in_constant_expr,E);
+ return Extension(E->getOperatorLoc(), diag::note_comma_in_ice, E);
return false;
}
switch (E->getOpcode()) {
default:
- return Error(E->getOperatorLoc(), diag::err_expr_not_constant, E);
+ return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
case BinaryOperator::Mul: Result *= RHS; return true;
case BinaryOperator::Add: Result += RHS; return true;
case BinaryOperator::Sub: Result -= RHS; return true;
case BinaryOperator::Or: Result |= RHS; return true;
case BinaryOperator::Div:
if (RHS == 0)
- return Error(E->getOperatorLoc(), diag::err_expr_divide_by_zero,
- E);
+ return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
Result /= RHS;
break;
case BinaryOperator::Rem:
if (RHS == 0)
- return Error(E->getOperatorLoc(), diag::err_expr_divide_by_zero, E);
+ return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
Result %= RHS;
break;
case BinaryOperator::Shl:
default:
// Address, indirect, pre/post inc/dec, etc are not valid constant exprs.
// See C99 6.6p3.
- return Error(E->getOperatorLoc(), diag::err_expr_not_constant, E);
+ return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
case UnaryOperator::Extension:
// FIXME: Should extension allow i-c-e extension expressions in its scope?
// If so, we could clear the diagnostic ID.
}
if (!SubExpr->getType()->isRealFloatingType())
- return Error(E->getExprLoc(), diag::err_expr_not_constant, E);
+ return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
APFloat F(0.0);
if (!EvaluateFloat(SubExpr, F, Info))
- return Error(E->getExprLoc(), diag::err_expr_not_constant, E);
+ return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
// Determine whether we are converting to unsigned or signed.
bool DestSigned = DestType->isSignedIntegerType();