[llvm] 41825fb - [Option] Fix simple subcommand with positional arguments (#166859)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 6 20:58:00 PST 2025
Author: Steven Wu
Date: 2025-11-06T20:57:56-08:00
New Revision: 41825fbf0e869ba357c713971f20eb1fcdafd09c
URL: https://github.com/llvm/llvm-project/commit/41825fbf0e869ba357c713971f20eb1fcdafd09c
DIFF: https://github.com/llvm/llvm-project/commit/41825fbf0e869ba357c713971f20eb1fcdafd09c.diff
LOG: [Option] Fix simple subcommand with positional arguments (#166859)
Fix subcommand detection when subcommand used with positional arguments.
When there is only one valid subcommand passed,
`ArgList::getSubCommand()` should return the correct subcommand even
there are other positionals passed.
Added:
Modified:
llvm/lib/Option/ArgList.cpp
llvm/unittests/Option/OptionSubCommandsTest.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Option/ArgList.cpp b/llvm/lib/Option/ArgList.cpp
index 2f4e21257af09..9f9d63f212c88 100644
--- a/llvm/lib/Option/ArgList.cpp
+++ b/llvm/lib/Option/ArgList.cpp
@@ -230,10 +230,8 @@ StringRef ArgList::getSubCommand(
HandleMultipleSubcommands(SubCommands);
return {};
}
- if (!OtherPositionals.empty()) {
+ if (!OtherPositionals.empty())
HandleOtherPositionals(OtherPositionals);
- return {};
- }
if (SubCommands.size() == 1)
return SubCommands.front();
diff --git a/llvm/unittests/Option/OptionSubCommandsTest.cpp b/llvm/unittests/Option/OptionSubCommandsTest.cpp
index e31a3262f135e..d4744c90b0069 100644
--- a/llvm/unittests/Option/OptionSubCommandsTest.cpp
+++ b/llvm/unittests/Option/OptionSubCommandsTest.cpp
@@ -192,6 +192,19 @@ TYPED_TEST(OptSubCommandTableTest, SubCommandParsing) {
std::string::npos,
ErrMsg.find("Option [lowercase] is not valid for SubCommand [bar]"));
}
+
+ {
+ // Test case 7: Check valid use of a valid subcommand following more
+ // positional arguments.
+ const char *Args[] = {"bar", "input"};
+ InputArgList AL = T.ParseArgs(Args, MAI, MAC);
+ StringRef SC = AL.getSubCommand(
+ T.getSubCommands(), HandleMultipleSubcommands, HandleOtherPositionals);
+ EXPECT_EQ(SC, "bar"); // valid subcommand
+ EXPECT_NE(std::string::npos,
+ ErrMsg.find("Unregistered positionals passed"));
+ EXPECT_NE(std::string::npos, ErrMsg.find("input"));
+ }
}
TYPED_TEST(OptSubCommandTableTest, SubCommandHelp) {
More information about the llvm-commits
mailing list