[clang][ExprConst] Add RHS source range to div by zero diags

Differential Revision: https://reviews.llvm.org/D157074
This commit is contained in:
Timm Bäder 2023-08-09 14:27:46 +02:00
parent 860d38bf57
commit f6ee4e3f55
3 changed files with 20 additions and 6 deletions

View File

@ -2805,9 +2805,9 @@ static bool CheckedIntArithmetic(EvalInfo &Info, const Expr *E,
}
/// Perform the given binary integer operation.
static bool handleIntIntBinOp(EvalInfo &Info, const Expr *E, const APSInt &LHS,
BinaryOperatorKind Opcode, APSInt RHS,
APSInt &Result) {
static bool handleIntIntBinOp(EvalInfo &Info, const BinaryOperator *E,
const APSInt &LHS, BinaryOperatorKind Opcode,
APSInt RHS, APSInt &Result) {
bool HandleOverflowResult = true;
switch (Opcode) {
default:
@ -2828,7 +2828,8 @@ static bool handleIntIntBinOp(EvalInfo &Info, const Expr *E, const APSInt &LHS,
case BO_Div:
case BO_Rem:
if (RHS == 0) {
Info.FFDiag(E, diag::note_expr_divide_by_zero);
Info.FFDiag(E, diag::note_expr_divide_by_zero)
<< E->getRHS()->getSourceRange();
return false;
}
// Check for overflow case: INT_MIN / -1 or INT_MIN % -1. APSInt supports

View File

@ -148,8 +148,9 @@ bool CheckShift(InterpState &S, CodePtr OpPC, const LT &LHS, const RT &RHS,
template <typename T>
bool CheckDivRem(InterpState &S, CodePtr OpPC, const T &LHS, const T &RHS) {
if (RHS.isZero()) {
const SourceInfo &Loc = S.Current->getSource(OpPC);
S.FFDiag(Loc, diag::note_expr_divide_by_zero);
const auto *Op = cast<BinaryOperator>(S.Current->getExpr(OpPC));
S.FFDiag(Op, diag::note_expr_divide_by_zero)
<< Op->getRHS()->getSourceRange();
return false;
}

View File

@ -13,3 +13,15 @@ constexpr int I = 12;
constexpr const int *P = &I;
constexpr long L = (long)P;
// CHECK: constexpr-source-ranges.cpp:14:20:{14:20-14:27}
constexpr int zero() {
return 0;
}
constexpr int divByZero() {
return 1 / zero();
}
static_assert(divByZero() == 0, "");
/// We see this twice. Once from sema and once when
/// evaluating the static_assert above.
// CHECK: constexpr-source-ranges.cpp:23:15:{23:15-23:31}
// CHECK: constexpr-source-ranges.cpp:21:12:{21:14-21:20}