diff options
-rw-r--r-- | Source/cmConditionEvaluator.cxx | 10 | ||||
-rw-r--r-- | Tests/RunCMake/if/MatchesSelf.cmake | 4 | ||||
-rw-r--r-- | Tests/RunCMake/if/RunCMakeTest.cmake | 2 |
3 files changed, 16 insertions, 0 deletions
diff --git a/Source/cmConditionEvaluator.cxx b/Source/cmConditionEvaluator.cxx index 5330acd..6a0ebec 100644 --- a/Source/cmConditionEvaluator.cxx +++ b/Source/cmConditionEvaluator.cxx @@ -12,6 +12,7 @@ #include "cmConditionEvaluator.h" #include "cmOutputConverter.h" +#include "cmAlgorithms.h" cmConditionEvaluator::cmConditionEvaluator(cmMakefile& makefile, const cmListFileContext &context, @@ -578,6 +579,7 @@ bool cmConditionEvaluator::HandleLevel2(cmArgumentList &newArgs, cmake::MessageType &status) { int reducible; + std::string def_buf; const char *def; const char *def2; do @@ -594,6 +596,14 @@ bool cmConditionEvaluator::HandleLevel2(cmArgumentList &newArgs, IsKeyword("MATCHES", *argP1)) { def = this->GetVariableOrString(*arg); + if (def != arg->c_str() // yes, we compare the pointer value + && cmHasLiteralPrefix(arg->GetValue(), "CMAKE_MATCH_")) + { + // The string to match is owned by our match result variables. + // Move it to our own buffer before clearing them. + def_buf = def; + def = def_buf.c_str(); + } const char* rex = argP2->c_str(); this->Makefile.ClearMatches(); cmsys::RegularExpression regEntry; diff --git a/Tests/RunCMake/if/MatchesSelf.cmake b/Tests/RunCMake/if/MatchesSelf.cmake new file mode 100644 index 0000000..3131ac4 --- /dev/null +++ b/Tests/RunCMake/if/MatchesSelf.cmake @@ -0,0 +1,4 @@ +foreach(n 0 1 2 3 4 5 6 7 8 9 COUNT) + if(CMAKE_MATCH_${n} MATCHES "x") + endif() +endforeach() diff --git a/Tests/RunCMake/if/RunCMakeTest.cmake b/Tests/RunCMake/if/RunCMakeTest.cmake index 3f4d2a2..077d00a 100644 --- a/Tests/RunCMake/if/RunCMakeTest.cmake +++ b/Tests/RunCMake/if/RunCMakeTest.cmake @@ -5,5 +5,7 @@ run_cmake(IsDirectory) run_cmake(IsDirectoryLong) run_cmake(elseif-message) +run_cmake(MatchesSelf) + run_cmake(TestNameThatExists) run_cmake(TestNameThatDoesNotExist) |