summaryrefslogtreecommitdiffstats
path: root/Source/cmWhileCommand.cxx
diff options
context:
space:
mode:
authorAlex Turbov <i.zaufi@gmail.com>2022-03-03 19:08:07 (GMT)
committerBrad King <brad.king@kitware.com>2022-03-03 21:51:34 (GMT)
commitda2361ffb35799319abca6f7c3138c916685fb2d (patch)
tree603d91719eeeadf9ae12db307f3dbfaba02f1651 /Source/cmWhileCommand.cxx
parent47d197745a44b20ee65edd0e3223464a43b3ee55 (diff)
downloadCMake-da2361ffb35799319abca6f7c3138c916685fb2d.zip
CMake-da2361ffb35799319abca6f7c3138c916685fb2d.tar.gz
CMake-da2361ffb35799319abca6f7c3138c916685fb2d.tar.bz2
while: Restore tolerance of condition error
Since commit 880ca66b51 (Fix: `while()` can silently ignore incorrect condition, 2021-08-09, v3.22.0-rc1~238^2~4) we correctly reject the code set(paren "(") while(${paren}) endwhile() However, rejecting it breaks compatibility with projects that used such code accidentally. In CMake 3.21 and below, any error in the condition was ignored because the `false` result exited the loop first. Restore tolerance of the error for now. A policy will be needed to make it an error later. Note that the same condition with `if` was always correctly rejected. Fixes: #22524 Issue: #23296 Co-authored-by: Brad King <brad.king@kitware.com>
Diffstat (limited to 'Source/cmWhileCommand.cxx')
-rw-r--r--Source/cmWhileCommand.cxx11
1 files changed, 8 insertions, 3 deletions
diff --git a/Source/cmWhileCommand.cxx b/Source/cmWhileCommand.cxx
index b8297ce..a93a81f 100644
--- a/Source/cmWhileCommand.cxx
+++ b/Source/cmWhileCommand.cxx
@@ -79,12 +79,17 @@ bool cmWhileFunctionBlocker::Replay(std::vector<cmListFileFunction> functions,
return out;
};
+ // FIXME(#23296): For compatibility with older versions of CMake, we
+ // tolerate condition errors that evaluate to false. We should add
+ // a policy to enforce such errors.
+ bool enforceError = true;
std::string errorString;
MessageType messageType;
for (cmConditionEvaluator conditionEvaluator(mf, whileBT);
- conditionEvaluator.IsTrue(expandArgs(this->Args, expandedArguments),
- errorString, messageType);) {
+ (enforceError = /* enforce condition errors that evaluate to true */
+ conditionEvaluator.IsTrue(expandArgs(this->Args, expandedArguments),
+ errorString, messageType));) {
// Invoke all the functions that were collected in the block.
for (cmListFileFunction const& fn : functions) {
cmExecutionStatus status(mf);
@@ -105,7 +110,7 @@ bool cmWhileFunctionBlocker::Replay(std::vector<cmListFileFunction> functions,
}
}
- if (!errorString.empty()) {
+ if (!errorString.empty() && enforceError) {
std::string err = "had incorrect arguments:\n ";
for (auto const& i : expandedArguments) {
err += " ";