[PATCH] D77242: [CommandLine] Fix cl::ConsumeAfter support with more than one positional argument
Yi-Hong Lyu via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 1 14:05:07 PDT 2020
Yi-Hong.Lyu created this revision.
Yi-Hong.Lyu added reviewers: bkramer, Mordante, rnk, lattner, beanz, craig.topper.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.
Currently, cl::ConsumeAfter only works for the case that has exactly one
positional argument. Without the fix, it skip fulfilling first positional
argument and put that additional positional argument in interpreter arguments.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D77242
Files:
llvm/lib/Support/CommandLine.cpp
llvm/unittests/Support/CommandLineTest.cpp
Index: llvm/unittests/Support/CommandLineTest.cpp
===================================================================
--- llvm/unittests/Support/CommandLineTest.cpp
+++ llvm/unittests/Support/CommandLineTest.cpp
@@ -1793,4 +1793,28 @@
clEnumValN(Val1, "bits-val1", "The Val1 value"),
clEnumValN(Val1, "bits-val2", "The Val2 value")));
+TEST(CommandLineTest, ConsumeAfterTwoPositionals) {
+ cl::ResetCommandLineParser();
+
+ // input1 input2 [args]
+ StackOption<std::string, cl::opt<std::string>> Input1(cl::Positional,
+ cl::Required);
+ StackOption<std::string, cl::opt<std::string>> Input2(cl::Positional,
+ cl::Required);
+ StackOption<std::string, cl::list<std::string>> IntArgs(cl::ConsumeAfter);
+
+ const char *args[] = {"prog", "input1", "input2", "arg1", "arg2"};
+
+ std::string Errs;
+ raw_string_ostream OS(Errs);
+ EXPECT_TRUE(cl::ParseCommandLineOptions(5, args, StringRef(), &OS));
+ OS.flush();
+ EXPECT_EQ("input1", Input1);
+ EXPECT_EQ("input2", Input2);
+ EXPECT_TRUE(IntArgs.size() == 2);
+ EXPECT_TRUE(IntArgs[0] == "arg1");
+ EXPECT_TRUE(IntArgs[1] == "arg2");
+ EXPECT_TRUE(Errs.empty());
+}
+
} // anonymous namespace
Index: llvm/lib/Support/CommandLine.cpp
===================================================================
--- llvm/lib/Support/CommandLine.cpp
+++ llvm/lib/Support/CommandLine.cpp
@@ -1581,7 +1581,7 @@
} else {
assert(ConsumeAfterOpt && NumPositionalRequired <= PositionalVals.size());
unsigned ValNo = 0;
- for (size_t j = 1, e = PositionalOpts.size(); j != e; ++j)
+ for (size_t j = 0, e = PositionalOpts.size(); j != e; ++j)
if (RequiresValue(PositionalOpts[j])) {
ErrorParsing |= ProvidePositionalOption(PositionalOpts[j],
PositionalVals[ValNo].first,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D77242.254300.patch
Type: text/x-patch
Size: 1928 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200401/c908e864/attachment.bin>
More information about the llvm-commits
mailing list