Skip to content

Commit 41825fb

Browse files
[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.
1 parent c9b4169 commit 41825fb

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

llvm/lib/Option/ArgList.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,8 @@ StringRef ArgList::getSubCommand(
230230
HandleMultipleSubcommands(SubCommands);
231231
return {};
232232
}
233-
if (!OtherPositionals.empty()) {
233+
if (!OtherPositionals.empty())
234234
HandleOtherPositionals(OtherPositionals);
235-
return {};
236-
}
237235

238236
if (SubCommands.size() == 1)
239237
return SubCommands.front();

llvm/unittests/Option/OptionSubCommandsTest.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,19 @@ TYPED_TEST(OptSubCommandTableTest, SubCommandParsing) {
192192
std::string::npos,
193193
ErrMsg.find("Option [lowercase] is not valid for SubCommand [bar]"));
194194
}
195+
196+
{
197+
// Test case 7: Check valid use of a valid subcommand following more
198+
// positional arguments.
199+
const char *Args[] = {"bar", "input"};
200+
InputArgList AL = T.ParseArgs(Args, MAI, MAC);
201+
StringRef SC = AL.getSubCommand(
202+
T.getSubCommands(), HandleMultipleSubcommands, HandleOtherPositionals);
203+
EXPECT_EQ(SC, "bar"); // valid subcommand
204+
EXPECT_NE(std::string::npos,
205+
ErrMsg.find("Unregistered positionals passed"));
206+
EXPECT_NE(std::string::npos, ErrMsg.find("input"));
207+
}
195208
}
196209

197210
TYPED_TEST(OptSubCommandTableTest, SubCommandHelp) {

0 commit comments

Comments
 (0)