diff --git a/Help/command/math.rst b/Help/command/math.rst index 6989ebcacd..33a93ae22a 100644 --- a/Help/command/math.rst +++ b/Help/command/math.rst @@ -1,7 +1,10 @@ math ---- -Evaluate a mathematical expression. +Perform mathematical operations. + +Expression Evaluation +^^^^^^^^^^^^^^^^^^^^^ .. code-block:: cmake @@ -37,3 +40,16 @@ For example math(EXPR value "100 * 0xA" OUTPUT_FORMAT DECIMAL) # value is set to "1000" math(EXPR value "100 * 0xA" OUTPUT_FORMAT HEXADECIMAL) # value is set to "0x3e8" + +Increment/Decrement +^^^^^^^^^^^^^^^^^^^ + +.. code-block:: cmake + + math(INCREMENT ) + math(DECREMENT ) + +.. versionadded:: 4.5 + +Take the value of ````, increment/decrement it, and store the result back +in ````. The variable must be defined and be a valid base-10 integer. diff --git a/Help/release/dev/math-increment-decrement.rst b/Help/release/dev/math-increment-decrement.rst new file mode 100644 index 0000000000..acbe70d245 --- /dev/null +++ b/Help/release/dev/math-increment-decrement.rst @@ -0,0 +1,4 @@ +math-increment-decrement +------------------------ + +* The :command:`math` command gained new ``INCREMENT`` and ``DECREMENT`` modes. diff --git a/Source/cmMathCommand.cxx b/Source/cmMathCommand.cxx index 75d046445a..5fe91ae3a1 100644 --- a/Source/cmMathCommand.cxx +++ b/Source/cmMathCommand.cxx @@ -3,6 +3,11 @@ #include "cmMathCommand.h" #include +#include +#include + +#include +#include #include @@ -10,10 +15,16 @@ #include "cmExecutionStatus.h" #include "cmExprParserHelper.h" #include "cmMakefile.h" +#include "cmStringAlgorithms.h" +#include "cmValue.h" namespace { bool HandleExprCommand(std::vector const& args, cmExecutionStatus& status); +bool HandleIncDecCommand(std::vector const& args, + cmExecutionStatus& status, int amount, + long long overflowFrom, long long overflowTo, + cm::string_view verbing); } bool cmMathCommand(std::vector const& args, @@ -27,6 +38,16 @@ bool cmMathCommand(std::vector const& args, if (subCommand == "EXPR") { return HandleExprCommand(args, status); } + if (subCommand == "INCREMENT") { + return HandleIncDecCommand( + args, status, 1, std::numeric_limits::max(), + std::numeric_limits::min(), "incrementing"_s); + } + if (subCommand == "DECREMENT") { + return HandleIncDecCommand( + args, status, -1, std::numeric_limits::min(), + std::numeric_limits::max(), "decrementing"_s); + } std::string e = "does not recognize sub-command " + subCommand; status.SetError(e); return false; @@ -117,4 +138,50 @@ bool HandleExprCommand(std::vector const& args, status.GetMakefile().AddDefinition(outputVariable, buffer); return true; } + +bool HandleIncDecCommand(std::vector const& args, + cmExecutionStatus& status, int amount, + long long overflowFrom, long long overflowTo, + cm::string_view verbing) +{ + std::string const messageHint = cmStrCat("sub-command ", args[0], " "); + if (args.size() != 2) { + status.SetError(cmStrCat(messageHint, "wrong number of arguments")); + return false; + } + auto value = status.GetMakefile().GetDefinition(args[1]); + if (!value) { + status.SetError( + cmStrCat(messageHint, "variable \"", args[1], "\" is not defined")); + return false; + } + if (value->empty()) { + status.SetError( + cmStrCat(messageHint, "value \"\" is not a valid integer")); + return false; + } + std::size_t pos = 0; + long long intValue = 0; + try { + intValue = std::stoll(*value, &pos, 10); + } catch (std::invalid_argument&) { + // Do nothing, leave pos as is, which will trigger the error + } + if (pos != value->length()) { + status.SetError( + cmStrCat(messageHint, "value \"", *value, "\" is not a valid integer")); + return false; + } + auto newValue = intValue + amount; + if (intValue == overflowFrom) { + status.GetMakefile().IssueDiagnostic( + cmDiagnosticCategory::CMD_AUTHOR, + cmStrCat("signed integer overflow while ", verbing, ":\n ", intValue, + "\n")); + // Overflow is undefined behavior in C++, so define it manually + newValue = overflowTo; + } + status.GetMakefile().AddDefinition(args[1], std::to_string(newValue)); + return true; +} } diff --git a/Tests/RunCMake/math/MATH-DECREMENT-Empty-result.txt b/Tests/RunCMake/math/MATH-DECREMENT-Empty-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-Empty-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/math/MATH-DECREMENT-Empty-stderr.txt b/Tests/RunCMake/math/MATH-DECREMENT-Empty-stderr.txt new file mode 100644 index 0000000000..a0fb8f710f --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-Empty-stderr.txt @@ -0,0 +1,4 @@ +^CMake Error at MATH-DECREMENT-Empty\.cmake:[0-9]+ \(math\): + math sub-command DECREMENT value "" is not a valid integer +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/math/MATH-DECREMENT-Empty.cmake b/Tests/RunCMake/math/MATH-DECREMENT-Empty.cmake new file mode 100644 index 0000000000..d22bfa6ba7 --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-Empty.cmake @@ -0,0 +1,2 @@ +set(value "") +math(DECREMENT value) diff --git a/Tests/RunCMake/math/MATH-DECREMENT-Extra-result.txt b/Tests/RunCMake/math/MATH-DECREMENT-Extra-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-Extra-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/math/MATH-DECREMENT-Extra-stderr.txt b/Tests/RunCMake/math/MATH-DECREMENT-Extra-stderr.txt new file mode 100644 index 0000000000..ead167a22b --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-Extra-stderr.txt @@ -0,0 +1,4 @@ +^CMake Error at MATH-DECREMENT-Extra\.cmake:[0-9]+ \(math\): + math sub-command DECREMENT value "0a" is not a valid integer +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/math/MATH-DECREMENT-Extra.cmake b/Tests/RunCMake/math/MATH-DECREMENT-Extra.cmake new file mode 100644 index 0000000000..20a17822ca --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-Extra.cmake @@ -0,0 +1,2 @@ +set(value 0a) +math(DECREMENT value) diff --git a/Tests/RunCMake/math/MATH-DECREMENT-Invalid-result.txt b/Tests/RunCMake/math/MATH-DECREMENT-Invalid-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-Invalid-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/math/MATH-DECREMENT-Invalid-stderr.txt b/Tests/RunCMake/math/MATH-DECREMENT-Invalid-stderr.txt new file mode 100644 index 0000000000..8ee34af66a --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-Invalid-stderr.txt @@ -0,0 +1,4 @@ +^CMake Error at MATH-DECREMENT-Invalid\.cmake:[0-9]+ \(math\): + math sub-command DECREMENT value "notanint" is not a valid integer +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/math/MATH-DECREMENT-Invalid.cmake b/Tests/RunCMake/math/MATH-DECREMENT-Invalid.cmake new file mode 100644 index 0000000000..57f7984ca2 --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-Invalid.cmake @@ -0,0 +1,2 @@ +set(value notanint) +math(DECREMENT value) diff --git a/Tests/RunCMake/math/MATH-DECREMENT-NotEnoughArgs-result.txt b/Tests/RunCMake/math/MATH-DECREMENT-NotEnoughArgs-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-NotEnoughArgs-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/math/MATH-DECREMENT-NotEnoughArgs-stderr.txt b/Tests/RunCMake/math/MATH-DECREMENT-NotEnoughArgs-stderr.txt new file mode 100644 index 0000000000..2254f3edd6 --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-NotEnoughArgs-stderr.txt @@ -0,0 +1,4 @@ +^CMake Error at MATH-DECREMENT-NotEnoughArgs\.cmake:[0-9]+ \(math\): + math sub-command DECREMENT wrong number of arguments +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/math/MATH-DECREMENT-NotEnoughArgs.cmake b/Tests/RunCMake/math/MATH-DECREMENT-NotEnoughArgs.cmake new file mode 100644 index 0000000000..f2a813feb3 --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-NotEnoughArgs.cmake @@ -0,0 +1 @@ +math(DECREMENT) diff --git a/Tests/RunCMake/math/MATH-DECREMENT-TooManyArgs-result.txt b/Tests/RunCMake/math/MATH-DECREMENT-TooManyArgs-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-TooManyArgs-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/math/MATH-DECREMENT-TooManyArgs-stderr.txt b/Tests/RunCMake/math/MATH-DECREMENT-TooManyArgs-stderr.txt new file mode 100644 index 0000000000..daca340dac --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-TooManyArgs-stderr.txt @@ -0,0 +1,4 @@ +^CMake Error at MATH-DECREMENT-TooManyArgs\.cmake:[0-9]+ \(math\): + math sub-command DECREMENT wrong number of arguments +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/math/MATH-DECREMENT-TooManyArgs.cmake b/Tests/RunCMake/math/MATH-DECREMENT-TooManyArgs.cmake new file mode 100644 index 0000000000..9f68b77896 --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-TooManyArgs.cmake @@ -0,0 +1 @@ +math(DECREMENT value 1) diff --git a/Tests/RunCMake/math/MATH-DECREMENT-Undefined-result.txt b/Tests/RunCMake/math/MATH-DECREMENT-Undefined-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-Undefined-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/math/MATH-DECREMENT-Undefined-stderr.txt b/Tests/RunCMake/math/MATH-DECREMENT-Undefined-stderr.txt new file mode 100644 index 0000000000..e08b04cfde --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-Undefined-stderr.txt @@ -0,0 +1,4 @@ +^CMake Error at MATH-DECREMENT-Undefined\.cmake:[0-9]+ \(math\): + math sub-command DECREMENT variable "value" is not defined +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/math/MATH-DECREMENT-Undefined.cmake b/Tests/RunCMake/math/MATH-DECREMENT-Undefined.cmake new file mode 100644 index 0000000000..706a47c9ae --- /dev/null +++ b/Tests/RunCMake/math/MATH-DECREMENT-Undefined.cmake @@ -0,0 +1,2 @@ +set(value) +math(DECREMENT value) diff --git a/Tests/RunCMake/math/MATH-INCREMENT-Empty-result.txt b/Tests/RunCMake/math/MATH-INCREMENT-Empty-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-Empty-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/math/MATH-INCREMENT-Empty-stderr.txt b/Tests/RunCMake/math/MATH-INCREMENT-Empty-stderr.txt new file mode 100644 index 0000000000..d67a540d2f --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-Empty-stderr.txt @@ -0,0 +1,4 @@ +^CMake Error at MATH-INCREMENT-Empty\.cmake:[0-9]+ \(math\): + math sub-command INCREMENT value "" is not a valid integer +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/math/MATH-INCREMENT-Empty.cmake b/Tests/RunCMake/math/MATH-INCREMENT-Empty.cmake new file mode 100644 index 0000000000..136c8e2b70 --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-Empty.cmake @@ -0,0 +1,2 @@ +set(value "") +math(INCREMENT value) diff --git a/Tests/RunCMake/math/MATH-INCREMENT-Extra-result.txt b/Tests/RunCMake/math/MATH-INCREMENT-Extra-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-Extra-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/math/MATH-INCREMENT-Extra-stderr.txt b/Tests/RunCMake/math/MATH-INCREMENT-Extra-stderr.txt new file mode 100644 index 0000000000..5b07644be8 --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-Extra-stderr.txt @@ -0,0 +1,4 @@ +^CMake Error at MATH-INCREMENT-Extra\.cmake:[0-9]+ \(math\): + math sub-command INCREMENT value "0a" is not a valid integer +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/math/MATH-INCREMENT-Extra.cmake b/Tests/RunCMake/math/MATH-INCREMENT-Extra.cmake new file mode 100644 index 0000000000..2f7fada007 --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-Extra.cmake @@ -0,0 +1,2 @@ +set(value 0a) +math(INCREMENT value) diff --git a/Tests/RunCMake/math/MATH-INCREMENT-Invalid-result.txt b/Tests/RunCMake/math/MATH-INCREMENT-Invalid-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-Invalid-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/math/MATH-INCREMENT-Invalid-stderr.txt b/Tests/RunCMake/math/MATH-INCREMENT-Invalid-stderr.txt new file mode 100644 index 0000000000..5d965c50c2 --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-Invalid-stderr.txt @@ -0,0 +1,4 @@ +^CMake Error at MATH-INCREMENT-Invalid\.cmake:[0-9]+ \(math\): + math sub-command INCREMENT value "notanint" is not a valid integer +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/math/MATH-INCREMENT-Invalid.cmake b/Tests/RunCMake/math/MATH-INCREMENT-Invalid.cmake new file mode 100644 index 0000000000..11db66d019 --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-Invalid.cmake @@ -0,0 +1,2 @@ +set(value notanint) +math(INCREMENT value) diff --git a/Tests/RunCMake/math/MATH-INCREMENT-NotEnoughArgs-result.txt b/Tests/RunCMake/math/MATH-INCREMENT-NotEnoughArgs-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-NotEnoughArgs-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/math/MATH-INCREMENT-NotEnoughArgs-stderr.txt b/Tests/RunCMake/math/MATH-INCREMENT-NotEnoughArgs-stderr.txt new file mode 100644 index 0000000000..c854473641 --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-NotEnoughArgs-stderr.txt @@ -0,0 +1,4 @@ +^CMake Error at MATH-INCREMENT-NotEnoughArgs\.cmake:[0-9]+ \(math\): + math sub-command INCREMENT wrong number of arguments +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/math/MATH-INCREMENT-NotEnoughArgs.cmake b/Tests/RunCMake/math/MATH-INCREMENT-NotEnoughArgs.cmake new file mode 100644 index 0000000000..264b367971 --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-NotEnoughArgs.cmake @@ -0,0 +1 @@ +math(INCREMENT) diff --git a/Tests/RunCMake/math/MATH-INCREMENT-TooManyArgs-result.txt b/Tests/RunCMake/math/MATH-INCREMENT-TooManyArgs-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-TooManyArgs-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/math/MATH-INCREMENT-TooManyArgs-stderr.txt b/Tests/RunCMake/math/MATH-INCREMENT-TooManyArgs-stderr.txt new file mode 100644 index 0000000000..5a2e798a6e --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-TooManyArgs-stderr.txt @@ -0,0 +1,4 @@ +^CMake Error at MATH-INCREMENT-TooManyArgs\.cmake:[0-9]+ \(math\): + math sub-command INCREMENT wrong number of arguments +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/math/MATH-INCREMENT-TooManyArgs.cmake b/Tests/RunCMake/math/MATH-INCREMENT-TooManyArgs.cmake new file mode 100644 index 0000000000..10da62eea2 --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-TooManyArgs.cmake @@ -0,0 +1 @@ +math(INCREMENT value 1) diff --git a/Tests/RunCMake/math/MATH-INCREMENT-Undefined-result.txt b/Tests/RunCMake/math/MATH-INCREMENT-Undefined-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-Undefined-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/math/MATH-INCREMENT-Undefined-stderr.txt b/Tests/RunCMake/math/MATH-INCREMENT-Undefined-stderr.txt new file mode 100644 index 0000000000..fb1e03b44b --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-Undefined-stderr.txt @@ -0,0 +1,4 @@ +^CMake Error at MATH-INCREMENT-Undefined\.cmake:[0-9]+ \(math\): + math sub-command INCREMENT variable "value" is not defined +Call Stack \(most recent call first\): + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/math/MATH-INCREMENT-Undefined.cmake b/Tests/RunCMake/math/MATH-INCREMENT-Undefined.cmake new file mode 100644 index 0000000000..40271e3177 --- /dev/null +++ b/Tests/RunCMake/math/MATH-INCREMENT-Undefined.cmake @@ -0,0 +1,2 @@ +set(value) +math(INCREMENT value) diff --git a/Tests/RunCMake/math/MATH.cmake b/Tests/RunCMake/math/MATH.cmake index a5f50cd903..4f628e8b97 100644 --- a/Tests/RunCMake/math/MATH.cmake +++ b/Tests/RunCMake/math/MATH.cmake @@ -10,3 +10,21 @@ math_test("100 * 10" 1000) math_test("100 * 10" 1000 OUTPUT_FORMAT DECIMAL) math_test("100 * 0xA" 1000 OUTPUT_FORMAT DECIMAL) math_test("100 * 0xA" 0x3e8 OUTPUT_FORMAT HEXADECIMAL) + +function(inc_dec_test command initial_value expected) + set(value "${initial_value}") + math("${command}" value) + if(NOT value STREQUAL "${expected}") + message(FATAL_ERROR "wrong ${command} result: ${value} != ${expected}") + endif() +endfunction() + +inc_dec_test(INCREMENT 0 1) +inc_dec_test(INCREMENT 4 5) +inc_dec_test(INCREMENT -04 -3) +inc_dec_test(INCREMENT -9223372036854775808 -9223372036854775807) + +inc_dec_test(DECREMENT 0 -1) +inc_dec_test(DECREMENT 4 3) +inc_dec_test(DECREMENT -04 -5) +inc_dec_test(DECREMENT 9223372036854775807 9223372036854775806) diff --git a/Tests/RunCMake/math/Overflow-stderr.txt b/Tests/RunCMake/math/Overflow-stderr.txt index d469bc283f..b65495650a 100644 --- a/Tests/RunCMake/math/Overflow-stderr.txt +++ b/Tests/RunCMake/math/Overflow-stderr.txt @@ -68,4 +68,26 @@ CMake Warning \(author\) at [^ -9223372036854775808 +This warning is for project developers\. Use -Wno-author to suppress it\. + +CMake Warning \(author\) at [^ +]+/Tests/RunCMake/math/Overflow\.cmake:[0-9]+ \(math\): + signed integer overflow while incrementing: + + 9223372036854775807 + +Call Stack \(most recent call first\): + [^ +]+/Tests/RunCMake/math/Overflow\.cmake:[0-9]+ \(inc_dec\) +This warning is for project developers\. Use -Wno-author to suppress it\. + +CMake Warning \(author\) at [^ +]+/Tests/RunCMake/math/Overflow\.cmake:[0-9]+ \(math\): + signed integer overflow while decrementing: + + -9223372036854775808 + +Call Stack \(most recent call first\): + [^ +]+/Tests/RunCMake/math/Overflow\.cmake:[0-9]+ \(inc_dec\) This warning is for project developers\. Use -Wno-author to suppress it\.$ diff --git a/Tests/RunCMake/math/Overflow-stdout.txt b/Tests/RunCMake/math/Overflow-stdout.txt index 5bcdcca8d7..74ece39b09 100644 --- a/Tests/RunCMake/math/Overflow-stdout.txt +++ b/Tests/RunCMake/math/Overflow-stdout.txt @@ -7,4 +7,6 @@ -- 0x7FFFFFFFFFFFFFFF \+ 1: -9223372036854775808 -- -0x7FFFFFFFFFFFFFFF - 2: 9223372036854775807 -- 0x7FFFFFFFFFFFFFFF \* 2: -2 --- -~0x7FFFFFFFFFFFFFFF: -9223372036854775808$ +-- -~0x7FFFFFFFFFFFFFFF: -9223372036854775808 +-- INCREMENT 9223372036854775807: -9223372036854775808 +-- DECREMENT -9223372036854775808: 9223372036854775807$ diff --git a/Tests/RunCMake/math/Overflow.cmake b/Tests/RunCMake/math/Overflow.cmake index c5a7464561..b1a43bdc50 100644 --- a/Tests/RunCMake/math/Overflow.cmake +++ b/Tests/RunCMake/math/Overflow.cmake @@ -13,3 +13,12 @@ foreach(expr IN ITEMS math(EXPR result "${expr}") message(STATUS "${expr}: ${result}") endforeach() + +function(inc_dec command value) + set(new_value "${value}") + math("${command}" new_value) + message(STATUS "${command} ${value}: ${new_value}") +endfunction() + +inc_dec(INCREMENT 9223372036854775807) +inc_dec(DECREMENT -9223372036854775808) diff --git a/Tests/RunCMake/math/RunCMakeTest.cmake b/Tests/RunCMake/math/RunCMakeTest.cmake index 3e8a4990fb..8fe048ccb4 100644 --- a/Tests/RunCMake/math/RunCMakeTest.cmake +++ b/Tests/RunCMake/math/RunCMakeTest.cmake @@ -10,6 +10,18 @@ run_cmake(MATH-DivideByZero) run_cmake(MATH-ModByZero) run_cmake(MATH-DivideMinByMinusOne) run_cmake(MATH-ModMinByMinusOne) +run_cmake(MATH-INCREMENT-NotEnoughArgs) +run_cmake(MATH-INCREMENT-TooManyArgs) +run_cmake(MATH-INCREMENT-Undefined) +run_cmake(MATH-INCREMENT-Empty) +run_cmake(MATH-INCREMENT-Invalid) +run_cmake(MATH-INCREMENT-Extra) +run_cmake(MATH-DECREMENT-NotEnoughArgs) +run_cmake(MATH-DECREMENT-TooManyArgs) +run_cmake(MATH-DECREMENT-Undefined) +run_cmake(MATH-DECREMENT-Empty) +run_cmake(MATH-DECREMENT-Invalid) +run_cmake(MATH-DECREMENT-Extra) if(CMake_TEST_MATH_OVERFLOW) run_cmake_script(Overflow)