diff options
author | Brad King <brad.king@kitware.com> | 2022-02-10 14:11:07 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2022-02-10 14:11:13 (GMT) |
commit | fe5b2e8beb17ef119e447df6073dca0dabafaa54 (patch) | |
tree | 2ef2040916edd1728ce67276d763294bf43b71ca | |
parent | 5b480172c369eaec81bbae8305b418b9a48558d4 (diff) | |
parent | 41adfc6b041474f6985ab72efcfb02b2b64a6b8d (diff) | |
download | CMake-fe5b2e8beb17ef119e447df6073dca0dabafaa54.zip CMake-fe5b2e8beb17ef119e447df6073dca0dabafaa54.tar.gz CMake-fe5b2e8beb17ef119e447df6073dca0dabafaa54.tar.bz2 |
Merge topic 'doc-if-AND-OR' into release-3.23
41adfc6b04 Help: Clarify precedence of AND and OR in 'if' conditions
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !6970
-rw-r--r-- | Help/command/if.rst | 23 | ||||
-rw-r--r-- | Tests/RunCMake/if/AndOr-stdout.txt | 1 | ||||
-rw-r--r-- | Tests/RunCMake/if/AndOr.cmake | 6 | ||||
-rw-r--r-- | Tests/RunCMake/if/RunCMakeTest.cmake | 2 |
4 files changed, 24 insertions, 8 deletions
diff --git a/Help/command/if.rst b/Help/command/if.rst index a729b1e..4f955db 100644 --- a/Help/command/if.rst +++ b/Help/command/if.rst @@ -38,14 +38,21 @@ The following syntax applies to the ``condition`` argument of the ``if``, ``elseif`` and :command:`while` clauses. Compound conditions are evaluated in the following order of precedence: -Innermost parentheses are evaluated first. Next come unary tests such -as `EXISTS`_, `COMMAND`_, and `DEFINED`_. Then binary tests such as -`EQUAL`_, `LESS`_, `LESS_EQUAL`_, `GREATER`_, `GREATER_EQUAL`_, -`STREQUAL`_, `STRLESS`_, `STRLESS_EQUAL`_, `STRGREATER`_, -`STRGREATER_EQUAL`_, `VERSION_EQUAL`_, `VERSION_LESS`_, -`VERSION_LESS_EQUAL`_, `VERSION_GREATER`_, `VERSION_GREATER_EQUAL`_, -and `MATCHES`_. Then the boolean operators in the order `NOT`_, `AND`_, -and finally `OR`_. + +1. Parentheses. + +2. Unary tests such as `EXISTS`_, `COMMAND`_, and `DEFINED`_. + +3. Binary tests such as `EQUAL`_, `LESS`_, `LESS_EQUAL`_, `GREATER`_, + `GREATER_EQUAL`_, `STREQUAL`_, `STRLESS`_, `STRLESS_EQUAL`_, + `STRGREATER`_, `STRGREATER_EQUAL`_, `VERSION_EQUAL`_, `VERSION_LESS`_, + `VERSION_LESS_EQUAL`_, `VERSION_GREATER`_, `VERSION_GREATER_EQUAL`_, + and `MATCHES`_. + +4. Unary logical operator `NOT`_. + +5. Binary logical operators `AND`_ and `OR`_, from left to right, + without any short-circuit. Basic Expressions """"""""""""""""" diff --git a/Tests/RunCMake/if/AndOr-stdout.txt b/Tests/RunCMake/if/AndOr-stdout.txt new file mode 100644 index 0000000..9fd395b --- /dev/null +++ b/Tests/RunCMake/if/AndOr-stdout.txt @@ -0,0 +1 @@ +-- OR and AND correctly evaluated left to right diff --git a/Tests/RunCMake/if/AndOr.cmake b/Tests/RunCMake/if/AndOr.cmake new file mode 100644 index 0000000..847d6f2 --- /dev/null +++ b/Tests/RunCMake/if/AndOr.cmake @@ -0,0 +1,6 @@ +# AND and OR are the same precedence +if(1 OR 0 AND 0) # equivalent to ((1 OR 0) AND 0) + message(FATAL_ERROR "AND incorrectly evaluated before OR") +else() + message(STATUS "OR and AND correctly evaluated left to right") +endif() diff --git a/Tests/RunCMake/if/RunCMakeTest.cmake b/Tests/RunCMake/if/RunCMakeTest.cmake index 6baa840..de9cb57 100644 --- a/Tests/RunCMake/if/RunCMakeTest.cmake +++ b/Tests/RunCMake/if/RunCMakeTest.cmake @@ -17,3 +17,5 @@ run_cmake(IncompleteMatchesFail) run_cmake(TestNameThatExists) run_cmake(TestNameThatDoesNotExist) + +run_cmake_script(AndOr) |