瀏覽代碼

cmCommandLineArgument: correctly compute next parse index

Fixes #21966

Correctly compute the next parse index for `ZeroOrOne` when
it is zero, and for OneOrMore.
Robert Maynard 4 年之前
父節點
當前提交
79d7bcaf40

+ 9 - 5
Source/cmCommandLineArgument.h

@@ -76,8 +76,9 @@ struct cmCommandLineArgument
 
     } else if (this->Type == Values::One || this->Type == Values::ZeroOrOne) {
       if (input.size() == this->Name.size()) {
-        ++index;
-        if (index >= allArgs.size() || allArgs[index][0] == '-') {
+        auto nextValueIndex = index + 1;
+        if (nextValueIndex >= allArgs.size() ||
+            allArgs[nextValueIndex][0] == '-') {
           if (this->Type == Values::ZeroOrOne) {
             parseState =
               this->StoreCall(std::string{}, std::forward<CallState>(state)...)
@@ -87,10 +88,11 @@ struct cmCommandLineArgument
             parseState = ParseMode::ValueError;
           }
         } else {
-          parseState =
-            this->StoreCall(allArgs[index], std::forward<CallState>(state)...)
+          parseState = this->StoreCall(allArgs[nextValueIndex],
+                                       std::forward<CallState>(state)...)
             ? ParseMode::Valid
             : ParseMode::Invalid;
+          index = nextValueIndex;
         }
       } else {
         // parse the string to get the value
@@ -133,7 +135,8 @@ struct cmCommandLineArgument
     } else if (this->Type == Values::OneOrMore) {
       if (input.size() == this->Name.size()) {
         auto nextValueIndex = index + 1;
-        if (nextValueIndex >= allArgs.size() || allArgs[index + 1][0] == '-') {
+        if (nextValueIndex >= allArgs.size() ||
+            allArgs[nextValueIndex][0] == '-') {
           parseState = ParseMode::ValueError;
         } else {
           std::string buffer = allArgs[nextValueIndex++];
@@ -145,6 +148,7 @@ struct cmCommandLineArgument
             this->StoreCall(buffer, std::forward<CallState>(state)...)
             ? ParseMode::Valid
             : ParseMode::Invalid;
+          index = (nextValueIndex - 1);
         }
       }
     }

+ 1 - 0
Tests/RunCMake/CommandLine/BuildDir--build-jobs-no-number-trailing--invalid-target-result.txt

@@ -0,0 +1 @@
+(1|2)

+ 1 - 0
Tests/RunCMake/CommandLine/BuildDir--build-jobs-no-number-trailing--invalid-target-stderr.txt

@@ -0,0 +1 @@
+.*(ninja: error: unknown target 'invalid-target'|No rule to make target [`']invalid-target').*

+ 4 - 0
Tests/RunCMake/CommandLine/RunCMakeTest.cmake

@@ -209,6 +209,10 @@ function(run_BuildDir)
       ${CMAKE_COMMAND} --build BuildDir-build -j)
     run_cmake_command(BuildDir--build-jobs-no-number-trailing--target ${CMAKE_COMMAND} -E chdir ..
       ${CMAKE_COMMAND} --build BuildDir-build -j --target CustomTarget)
+    if(RunCMake_GENERATOR MATCHES "Unix Makefiles" OR RunCMake_GENERATOR MATCHES "Ninja")
+      run_cmake_command(BuildDir--build-jobs-no-number-trailing--invalid-target ${CMAKE_COMMAND} -E chdir ..
+        ${CMAKE_COMMAND} --build BuildDir-build -j --target invalid-target)
+    endif()
     run_cmake_command(BuildDir--build--parallel-no-number ${CMAKE_COMMAND} -E chdir ..
       ${CMAKE_COMMAND} --build BuildDir-build --parallel)
     run_cmake_command(BuildDir--build--parallel-no-number-trailing--target ${CMAKE_COMMAND} -E chdir ..