[clang] dd40632 - [clang] fix divide by zero in ComplexExprEvaluator (#104666)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Aug 18 08:32:47 PDT 2024
Author: c8ef
Date: 2024-08-18T17:32:44+02:00
New Revision: dd40632b52d8da2146a12254afc900315ac3c2e4
URL: https://github.com/llvm/llvm-project/commit/dd40632b52d8da2146a12254afc900315ac3c2e4
DIFF: https://github.com/llvm/llvm-project/commit/dd40632b52d8da2146a12254afc900315ac3c2e4.diff
LOG: [clang] fix divide by zero in ComplexExprEvaluator (#104666)
fix: #55390.
---------
Co-authored-by: Sergei Barannikov <barannikov88 at gmail.com>
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/AST/ExprConstant.cpp
clang/test/SemaCXX/constant-expression-cxx11.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 11301e4c7dc4a2..a4257ea1f48c11 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -274,6 +274,8 @@ Bug Fixes to C++ Support
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
+- Fixed a crash that occurred when dividing by zero in complex integer division. (#GH55390).
+
Miscellaneous Bug Fixes
^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 31b65ff4bcc135..5540f58b526705 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -15615,12 +15615,12 @@ bool ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
HandleComplexComplexDiv(A, B, C, D, ResR, ResI);
}
} else {
- if (RHS.getComplexIntReal() == 0 && RHS.getComplexIntImag() == 0)
- return Error(E, diag::note_expr_divide_by_zero);
-
ComplexValue LHS = Result;
APSInt Den = RHS.getComplexIntReal() * RHS.getComplexIntReal() +
RHS.getComplexIntImag() * RHS.getComplexIntImag();
+ if (Den.isZero())
+ return Error(E, diag::note_expr_divide_by_zero);
+
Result.getComplexIntReal() =
(LHS.getComplexIntReal() * RHS.getComplexIntReal() +
LHS.getComplexIntImag() * RHS.getComplexIntImag()) / Den;
diff --git a/clang/test/SemaCXX/constant-expression-cxx11.cpp b/clang/test/SemaCXX/constant-expression-cxx11.cpp
index d888887bd8c6f3..44ef540f41fa8c 100644
--- a/clang/test/SemaCXX/constant-expression-cxx11.cpp
+++ b/clang/test/SemaCXX/constant-expression-cxx11.cpp
@@ -1268,6 +1268,9 @@ constexpr complex_wrap makeComplexWrap(int re, int im) {
static_assert(makeComplexWrap(1,0) == complex(1), "");
static_assert(makeComplexWrap(1,0) != complex(0, 1), "");
+constexpr auto GH55390 = 1 / 65536j; // expected-note {{division by zero}} \
+ // expected-error {{constexpr variable 'GH55390' must be initialized by a constant expression}} \
+ // expected-warning {{imaginary constants are a GNU extension}}
}
namespace PR11595 {
More information about the cfe-commits
mailing list