mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-02 14:16:07 +00:00
[clang][ExprConst] Add RHS source range to div by zero diags
Differential Revision: https://reviews.llvm.org/D157074
This commit is contained in:
parent
860d38bf57
commit
f6ee4e3f55
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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}
|
||||
|
Loading…
x
Reference in New Issue
Block a user