Sfoglia il codice sorgente

Merge topic 'correct_arg_parsing'

79d7bcaf40 cmCommandLineArgument: correctly compute next parse index

Acked-by: Kitware Robot <[email protected]>
Merge-request: !5936
Brad King 4 anni fa
parent
commit
c4f8005454

+ 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
@@ -137,7 +139,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++];
@@ -149,6 +152,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

@@ -212,6 +212,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 ..