summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Turbov <i.zaufi@gmail.com>2021-08-09 17:58:27 (GMT)
committerAlex Turbov <i.zaufi@gmail.com>2021-08-09 19:35:11 (GMT)
commit880ca66b51551d5ee732c7b81349c1a5f724d093 (patch)
treefd40673ed1a024227edcc53a310ff52dc1eaaae8
parent61b33c3f4eae3ce81df36c79ec69630cd9fcefdc (diff)
downloadCMake-880ca66b51551d5ee732c7b81349c1a5f724d093.zip
CMake-880ca66b51551d5ee732c7b81349c1a5f724d093.tar.gz
CMake-880ca66b51551d5ee732c7b81349c1a5f724d093.tar.bz2
Fix: `while()` can silently ignore incorrect condition
When `conditionEvaluator.IsTrue(...)` returns `false` it just didn't print the error occured.
-rw-r--r--Source/cmWhileCommand.cxx36
-rw-r--r--Tests/RunCMake/while/unbalanced-parenthesis-result.txt1
-rw-r--r--Tests/RunCMake/while/unbalanced-parenthesis-stderr.txt5
-rw-r--r--Tests/RunCMake/while/unbalanced-parenthesis.cmake2
4 files changed, 25 insertions, 19 deletions
diff --git a/Source/cmWhileCommand.cxx b/Source/cmWhileCommand.cxx
index 327c1c7..1363386 100644
--- a/Source/cmWhileCommand.cxx
+++ b/Source/cmWhileCommand.cxx
@@ -75,24 +75,6 @@ bool cmWhileFunctionBlocker::Replay(std::vector<cmListFileFunction> functions,
conditionEvaluator.IsTrue(expandedArguments, errorString, messageType);
while (isTrue) {
- if (!errorString.empty()) {
- std::string err = "had incorrect arguments: ";
- for (cmListFileArgument const& arg : this->Args) {
- err += (arg.Delim ? "\"" : "");
- err += arg.Value;
- err += (arg.Delim ? "\"" : "");
- err += " ";
- }
- err += "(";
- err += errorString;
- err += ").";
- mf.GetCMakeInstance()->IssueMessage(messageType, err, whileBT);
- if (messageType == MessageType::FATAL_ERROR) {
- cmSystemTools::SetFatalErrorOccured();
- return true;
- }
- }
-
// Invoke all the functions that were collected in the block.
for (cmListFileFunction const& fn : functions) {
cmExecutionStatus status(mf);
@@ -116,6 +98,24 @@ bool cmWhileFunctionBlocker::Replay(std::vector<cmListFileFunction> functions,
isTrue =
conditionEvaluator.IsTrue(expandedArguments, errorString, messageType);
}
+
+ if (!isTrue && !errorString.empty()) {
+ std::string err = "had incorrect arguments: ";
+ for (cmListFileArgument const& arg : this->Args) {
+ err += (arg.Delim ? "\"" : "");
+ err += arg.Value;
+ err += (arg.Delim ? "\"" : "");
+ err += " ";
+ }
+ err += "(";
+ err += errorString;
+ err += ").";
+ mf.GetCMakeInstance()->IssueMessage(messageType, err, whileBT);
+ if (messageType == MessageType::FATAL_ERROR) {
+ cmSystemTools::SetFatalErrorOccured();
+ }
+ }
+
return true;
}
diff --git a/Tests/RunCMake/while/unbalanced-parenthesis-result.txt b/Tests/RunCMake/while/unbalanced-parenthesis-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/while/unbalanced-parenthesis-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/while/unbalanced-parenthesis-stderr.txt b/Tests/RunCMake/while/unbalanced-parenthesis-stderr.txt
new file mode 100644
index 0000000..33ac54a
--- /dev/null
+++ b/Tests/RunCMake/while/unbalanced-parenthesis-stderr.txt
@@ -0,0 +1,5 @@
+CMake Error at unbalanced-parenthesis.cmake:[0-9]+ \(while\):
+ had incorrect arguments: NOT \$\{var_with_paren\} IN_LIST some_list
+ \(mismatched parenthesis in condition\).
+Call Stack \(most recent call first\):
+ CMakeLists\.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/while/unbalanced-parenthesis.cmake b/Tests/RunCMake/while/unbalanced-parenthesis.cmake
index 4b6a5cd..7a12701 100644
--- a/Tests/RunCMake/while/unbalanced-parenthesis.cmake
+++ b/Tests/RunCMake/while/unbalanced-parenthesis.cmake
@@ -5,4 +5,4 @@ while(NOT ${var_with_paren} IN_LIST some_list)
message(STATUS "Never prints")
endwhile()
-message(STATUS "It prints but in fact `while()` have to fail")
+message(STATUS "Never prints")