aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Support/CommandLineTest.cpp
diff options
context:
space:
mode:
authorYi-Hong Lyu <yilyu@microsoft.com>2020-04-16 23:45:45 -0700
committerYi-Hong Lyu <yilyu@microsoft.com>2020-04-17 02:12:54 -0700
commit54cfc6944e2669d7a41a164fc4f3d923a71e701d (patch)
treee5d8710e9d8176c646683fcfab15218465629562 /llvm/unittests/Support/CommandLineTest.cpp
parent91c10f50f38d4897146c3490d9881c7e39d0d2a5 (diff)
downloadllvm-54cfc6944e2669d7a41a164fc4f3d923a71e701d.zip
llvm-54cfc6944e2669d7a41a164fc4f3d923a71e701d.tar.gz
llvm-54cfc6944e2669d7a41a164fc4f3d923a71e701d.tar.bz2
[CommandLine] Fix cl::ConsumeAfter support with more than one positional argument
Summary: 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. Reviewers: bkramer, Mordante, rnk, lattner, beanz, craig.topper Reviewed By: rnk Subscribers: JosephTremoulet, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D77242
Diffstat (limited to 'llvm/unittests/Support/CommandLineTest.cpp')
-rw-r--r--llvm/unittests/Support/CommandLineTest.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/llvm/unittests/Support/CommandLineTest.cpp b/llvm/unittests/Support/CommandLineTest.cpp
index b6fc699..a6b26b3 100644
--- a/llvm/unittests/Support/CommandLineTest.cpp
+++ b/llvm/unittests/Support/CommandLineTest.cpp
@@ -1793,4 +1793,49 @@ static cl::bits<Enum> ExampleBits(
clEnumValN(Val1, "bits-val1", "The Val1 value"),
clEnumValN(Val1, "bits-val2", "The Val2 value")));
+TEST(CommandLineTest, ConsumeAfterOnePositional) {
+ cl::ResetCommandLineParser();
+
+ // input [args]
+ StackOption<std::string, cl::opt<std::string>> Input(cl::Positional,
+ cl::Required);
+ StackOption<std::string, cl::list<std::string>> ExtraArgs(cl::ConsumeAfter);
+
+ const char *Args[] = {"prog", "input", "arg1", "arg2"};
+
+ std::string Errs;
+ raw_string_ostream OS(Errs);
+ EXPECT_TRUE(cl::ParseCommandLineOptions(4, Args, StringRef(), &OS));
+ OS.flush();
+ EXPECT_EQ("input", Input);
+ EXPECT_TRUE(ExtraArgs.size() == 2);
+ EXPECT_TRUE(ExtraArgs[0] == "arg1");
+ EXPECT_TRUE(ExtraArgs[1] == "arg2");
+ EXPECT_TRUE(Errs.empty());
+}
+
+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>> ExtraArgs(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(ExtraArgs.size() == 2);
+ EXPECT_TRUE(ExtraArgs[0] == "arg1");
+ EXPECT_TRUE(ExtraArgs[1] == "arg2");
+ EXPECT_TRUE(Errs.empty());
+}
+
} // anonymous namespace