diff --git a/Source/cmExprParserHelper.cxx b/Source/cmExprParserHelper.cxx index 7c946f2a34..71c55d576e 100644 --- a/Source/cmExprParserHelper.cxx +++ b/Source/cmExprParserHelper.cxx @@ -190,6 +190,9 @@ std::int64_t cmExprParserHelper::Div(std::int64_t l, std::int64_t r) if (r == 0) { throw std::overflow_error("divide by zero"); } + if (l == INT64_MIN && r == -1) { + throw std::overflow_error("signed integer overflow in division"); + } return l / r; } @@ -198,6 +201,9 @@ std::int64_t cmExprParserHelper::Mod(std::int64_t l, std::int64_t r) if (r == 0) { throw std::overflow_error("modulo by zero"); } + if (l == INT64_MIN && r == -1) { + throw std::overflow_error("signed integer overflow in modulo"); + } return l % r; } diff --git a/Tests/RunCMake/math/MATH-DivideMinByMinusOne-result.txt b/Tests/RunCMake/math/MATH-DivideMinByMinusOne-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/math/MATH-DivideMinByMinusOne-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/math/MATH-DivideMinByMinusOne-stderr.txt b/Tests/RunCMake/math/MATH-DivideMinByMinusOne-stderr.txt new file mode 100644 index 0000000000..7ea1553f57 --- /dev/null +++ b/Tests/RunCMake/math/MATH-DivideMinByMinusOne-stderr.txt @@ -0,0 +1,5 @@ +^CMake Error at MATH-DivideMinByMinusOne\.cmake:1 \(math\): + math cannot evaluate the expression: "~9223372036854775807/-1": signed + integer overflow in division\. +Call Stack \(most recent call first\): + CMakeLists\.txt:3 \(include\)$ diff --git a/Tests/RunCMake/math/MATH-DivideMinByMinusOne.cmake b/Tests/RunCMake/math/MATH-DivideMinByMinusOne.cmake new file mode 100644 index 0000000000..38277b8e47 --- /dev/null +++ b/Tests/RunCMake/math/MATH-DivideMinByMinusOne.cmake @@ -0,0 +1 @@ +math(EXPR var "~9223372036854775807/-1") diff --git a/Tests/RunCMake/math/MATH-ModMinByMinusOne-result.txt b/Tests/RunCMake/math/MATH-ModMinByMinusOne-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/math/MATH-ModMinByMinusOne-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/math/MATH-ModMinByMinusOne-stderr.txt b/Tests/RunCMake/math/MATH-ModMinByMinusOne-stderr.txt new file mode 100644 index 0000000000..f2d7a1b7d0 --- /dev/null +++ b/Tests/RunCMake/math/MATH-ModMinByMinusOne-stderr.txt @@ -0,0 +1,5 @@ +^CMake Error at MATH-ModMinByMinusOne\.cmake:1 \(math\): + math cannot evaluate the expression: "~9223372036854775807%-1": signed + integer overflow in modulo\. +Call Stack \(most recent call first\): + CMakeLists\.txt:3 \(include\)$ diff --git a/Tests/RunCMake/math/MATH-ModMinByMinusOne.cmake b/Tests/RunCMake/math/MATH-ModMinByMinusOne.cmake new file mode 100644 index 0000000000..27e5f467fa --- /dev/null +++ b/Tests/RunCMake/math/MATH-ModMinByMinusOne.cmake @@ -0,0 +1 @@ +math(EXPR var "~9223372036854775807%-1") diff --git a/Tests/RunCMake/math/RunCMakeTest.cmake b/Tests/RunCMake/math/RunCMakeTest.cmake index cda0094384..3e8a4990fb 100644 --- a/Tests/RunCMake/math/RunCMakeTest.cmake +++ b/Tests/RunCMake/math/RunCMakeTest.cmake @@ -8,6 +8,8 @@ run_cmake(MATH-InvalidExpression) run_cmake(MATH-ToleratedExpression) run_cmake(MATH-DivideByZero) run_cmake(MATH-ModByZero) +run_cmake(MATH-DivideMinByMinusOne) +run_cmake(MATH-ModMinByMinusOne) if(CMake_TEST_MATH_OVERFLOW) run_cmake_script(Overflow)