diff options
author | Marc Chevrier <marc.chevrier@gmail.com> | 2022-08-22 14:10:56 (GMT) |
---|---|---|
committer | Marc Chevrier <marc.chevrier@gmail.com> | 2022-09-03 21:10:01 (GMT) |
commit | 838a5fae23cba0c9acf922164ff89fb6883d0f96 (patch) | |
tree | 27cf344771ff7266aa70cbf4ab3ddcba1d653a19 /Source/cmReturnCommand.cxx | |
parent | 8f0e1f2111c046aaa240a54c211404747c911698 (diff) | |
download | CMake-838a5fae23cba0c9acf922164ff89fb6883d0f96.zip CMake-838a5fae23cba0c9acf922164ff89fb6883d0f96.tar.gz CMake-838a5fae23cba0c9acf922164ff89fb6883d0f96.tar.bz2 |
return(): Propagate variables to result scope
Fixes: #23871
Diffstat (limited to 'Source/cmReturnCommand.cxx')
-rw-r--r-- | Source/cmReturnCommand.cxx | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/Source/cmReturnCommand.cxx b/Source/cmReturnCommand.cxx index 5905669..765b772 100644 --- a/Source/cmReturnCommand.cxx +++ b/Source/cmReturnCommand.cxx @@ -2,12 +2,52 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmReturnCommand.h" +#include <cm/string_view> +#include <cmext/string_view> + #include "cmExecutionStatus.h" +#include "cmMakefile.h" +#include "cmMessageType.h" +#include "cmPolicies.h" +#include "cmStringAlgorithms.h" +#include "cmSystemTools.h" // cmReturnCommand -bool cmReturnCommand(std::vector<std::string> const&, +bool cmReturnCommand(std::vector<std::string> const& args, cmExecutionStatus& status) { - status.SetReturnInvoked(); + if (!args.empty()) { + switch (status.GetMakefile().GetPolicyStatus(cmPolicies::CMP0140)) { + case cmPolicies::WARN: + status.GetMakefile().IssueMessage( + MessageType::AUTHOR_WARNING, + cmStrCat( + cmPolicies::GetPolicyWarning(cmPolicies::CMP0140), '\n', + "return() checks its arguments when the policy is set to NEW. " + "Since the policy is not set the OLD behavior will be used so " + "the arguments will be ignored.")); + CM_FALLTHROUGH; + case cmPolicies::OLD: + return true; + case cmPolicies::REQUIRED_IF_USED: + case cmPolicies::REQUIRED_ALWAYS: + status.GetMakefile().IssueMessage( + MessageType::FATAL_ERROR, + cmStrCat('\n', cmPolicies::GetPolicyWarning(cmPolicies::CMP0140))); + cmSystemTools::SetFatalErrorOccurred(); + return false; + default: + break; + } + if (args[0] != "PROPAGATE"_s) { + status.SetError( + cmStrCat("called with unsupported argument \"", args[0], '"')); + cmSystemTools::SetFatalErrorOccurred(); + return false; + } + status.SetReturnInvoked({ args.begin() + 1, args.end() }); + } else { + status.SetReturnInvoked(); + } return true; } |