From 41825fbf0e869ba357c713971f20eb1fcdafd09c Mon Sep 17 00:00:00 2001 From: Steven Wu Date: Thu, 6 Nov 2025 20:57:56 -0800 Subject: [PATCH] [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. --- llvm/lib/Option/ArgList.cpp | 4 +--- llvm/unittests/Option/OptionSubCommandsTest.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Option/ArgList.cpp b/llvm/lib/Option/ArgList.cpp index 2f4e21257af0..9f9d63f212c8 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 e31a3262f135..d4744c90b006 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) {