diff --git a/Source/cmExprParserHelper.cxx b/Source/cmExprParserHelper.cxx index 8e2dcc6455..7c946f2a34 100644 --- a/Source/cmExprParserHelper.cxx +++ b/Source/cmExprParserHelper.cxx @@ -203,6 +203,10 @@ std::int64_t cmExprParserHelper::Mod(std::int64_t l, std::int64_t r) std::int64_t cmExprParserHelper::Neg(std::int64_t x) { + if (static_cast(x) == 0x8000000000000000) { + this->Warning(cmStrCat("signed integer cannot negate:\n ", x)); + return x; + } return -x; } diff --git a/Tests/RunCMake/math/Overflow-stderr.txt b/Tests/RunCMake/math/Overflow-stderr.txt index b414fbce32..01ffffe016 100644 --- a/Tests/RunCMake/math/Overflow-stderr.txt +++ b/Tests/RunCMake/math/Overflow-stderr.txt @@ -60,4 +60,12 @@ CMake Warning \(dev\) at [^ 9223372036854775807 \* 2 +This warning is for project developers\. Use -Wno-dev to suppress it\. + +CMake Warning \(dev\) at [^ +]+/Tests/RunCMake/math/Overflow\.cmake:[0-9]+ \(math\): + signed integer cannot negate: + + -9223372036854775808 + This warning is for project developers\. Use -Wno-dev to suppress it\.$ diff --git a/Tests/RunCMake/math/Overflow-stdout.txt b/Tests/RunCMake/math/Overflow-stdout.txt index a95ebb294e..5bcdcca8d7 100644 --- a/Tests/RunCMake/math/Overflow-stdout.txt +++ b/Tests/RunCMake/math/Overflow-stdout.txt @@ -6,4 +6,5 @@ -- 4 >> 65: 2 -- 0x7FFFFFFFFFFFFFFF \+ 1: -9223372036854775808 -- -0x7FFFFFFFFFFFFFFF - 2: 9223372036854775807 --- 0x7FFFFFFFFFFFFFFF \* 2: -2$ +-- 0x7FFFFFFFFFFFFFFF \* 2: -2 +-- -~0x7FFFFFFFFFFFFFFF: -9223372036854775808$ diff --git a/Tests/RunCMake/math/Overflow.cmake b/Tests/RunCMake/math/Overflow.cmake index 0a251e6b6a..c5a7464561 100644 --- a/Tests/RunCMake/math/Overflow.cmake +++ b/Tests/RunCMake/math/Overflow.cmake @@ -8,6 +8,7 @@ foreach(expr IN ITEMS " 0x7FFFFFFFFFFFFFFF + 1" "-0x7FFFFFFFFFFFFFFF - 2" " 0x7FFFFFFFFFFFFFFF * 2" + "-~0x7FFFFFFFFFFFFFFF" ) math(EXPR result "${expr}") message(STATUS "${expr}: ${result}")