diff options
author | Yi-Hong Lyu <yilyu@microsoft.com> | 2020-04-16 23:45:45 -0700 |
---|---|---|
committer | Yi-Hong Lyu <yilyu@microsoft.com> | 2020-04-17 02:12:54 -0700 |
commit | 54cfc6944e2669d7a41a164fc4f3d923a71e701d (patch) | |
tree | e5d8710e9d8176c646683fcfab15218465629562 /llvm/unittests/Support/CommandLineTest.cpp | |
parent | 91c10f50f38d4897146c3490d9881c7e39d0d2a5 (diff) | |
download | llvm-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.cpp | 45 |
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 |