Index: clang/lib/AST/ExprConstant.cpp =================================================================== --- clang/lib/AST/ExprConstant.cpp +++ clang/lib/AST/ExprConstant.cpp @@ -2808,9 +2808,9 @@ } /// 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: @@ -2831,7 +2831,8 @@ 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 Index: clang/lib/AST/Interp/Interp.h =================================================================== --- clang/lib/AST/Interp/Interp.h +++ clang/lib/AST/Interp/Interp.h @@ -152,8 +152,9 @@ template 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(S.Current->getExpr(OpPC)); + S.FFDiag(Op, diag::note_expr_divide_by_zero) + << Op->getRHS()->getSourceRange(); return false; } Index: clang/test/Misc/constexpr-source-ranges.cpp =================================================================== --- clang/test/Misc/constexpr-source-ranges.cpp +++ clang/test/Misc/constexpr-source-ranges.cpp @@ -23,3 +23,16 @@ } static_assert(ints(1, div(true, false), 2, div(false, true)) == 1, ""); // CHECK: constexpr-source-ranges.cpp:24:23:{24:23-24:39} + + +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:32:12:{32:14-32:20} +// CHECK: constexpr-source-ranges.cpp:32:12:{32:14-32:20}