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 <baranniko...@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 { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits