[llvm] 93c55d5 - Reset all options in cl::ResetCommandLineParser()
Christian Sigg via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 16 00:56:37 PDT 2021
Author: Christian Sigg
Date: 2021-08-16T09:56:22+02:00
New Revision: 93c55d5ea24b8f455b0621bac373f142e0008739
URL: https://github.com/llvm/llvm-project/commit/93c55d5ea24b8f455b0621bac373f142e0008739
DIFF: https://github.com/llvm/llvm-project/commit/93c55d5ea24b8f455b0621bac373f142e0008739.diff
LOG: Reset all options in cl::ResetCommandLineParser()
Reset cl::Positional, cl::Sink and cl::ConsumeAfter options as well in cl::ResetCommandLineParser().
Reviewed By: rriddle, sammccall
Differential Revision: https://reviews.llvm.org/D103356
Added:
Modified:
llvm/lib/Support/CommandLine.cpp
llvm/unittests/Support/CommandLineTest.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Support/CommandLine.cpp b/llvm/lib/Support/CommandLine.cpp
index 6c140863b13cc..e64934aa90cc8 100644
--- a/llvm/lib/Support/CommandLine.cpp
+++ b/llvm/lib/Support/CommandLine.cpp
@@ -1321,12 +1321,20 @@ bool cl::ParseCommandLineOptions(int argc, const char *const *argv,
Errs, LongOptionsUseDoubleDash);
}
+/// Reset all options at least once, so that we can parse
diff erent options.
void CommandLineParser::ResetAllOptionOccurrences() {
- // So that we can parse
diff erent command lines multiple times in succession
- // we reset all option values to look like they have never been seen before.
+ // Reset all option values to look like they have never been seen before.
+ // Options might be reset twice (they can be reference in both OptionsMap
+ // and one of the other members), but that does not harm.
for (auto *SC : RegisteredSubCommands) {
for (auto &O : SC->OptionsMap)
O.second->reset();
+ for (Option *O : SC->PositionalOpts)
+ O->reset();
+ for (Option *O : SC->SinkOpts)
+ O->reset();
+ if (SC->ConsumeAfterOpt)
+ SC->ConsumeAfterOpt->reset();
}
}
diff --git a/llvm/unittests/Support/CommandLineTest.cpp b/llvm/unittests/Support/CommandLineTest.cpp
index a0352bc8a4c5e..d8fd6f6516cdd 100644
--- a/llvm/unittests/Support/CommandLineTest.cpp
+++ b/llvm/unittests/Support/CommandLineTest.cpp
@@ -1894,4 +1894,34 @@ TEST(CommandLineTest, ConsumeAfterTwoPositionals) {
EXPECT_TRUE(Errs.empty());
}
+TEST(CommandLineTest, ResetAllOptionOccurrences) {
+ cl::ResetCommandLineParser();
+
+ // -option [sink] input [args]
+ StackOption<bool> Option("option");
+ StackOption<std::string, cl::list<std::string>> Sink(cl::Sink);
+ StackOption<std::string> Input(cl::Positional);
+ StackOption<std::string, cl::list<std::string>> ExtraArgs(cl::ConsumeAfter);
+
+ const char *Args[] = {"prog", "-option", "-unknown", "input", "-arg"};
+
+ std::string Errs;
+ raw_string_ostream OS(Errs);
+ EXPECT_TRUE(cl::ParseCommandLineOptions(5, Args, StringRef(), &OS));
+ EXPECT_TRUE(OS.str().empty());
+
+ EXPECT_TRUE(Option);
+ EXPECT_EQ(1, (int)Sink.size());
+ EXPECT_EQ("-unknown", Sink[0]);
+ EXPECT_EQ("input", Input);
+ EXPECT_EQ(1, (int)ExtraArgs.size());
+ EXPECT_EQ("-arg", ExtraArgs[0]);
+
+ cl::ResetAllOptionOccurrences();
+ EXPECT_FALSE(Option);
+ EXPECT_EQ(0, (int)Sink.size());
+ EXPECT_EQ(0, Input.getNumOccurrences());
+ EXPECT_EQ(0, (int)ExtraArgs.size());
+}
+
} // anonymous namespace
More information about the llvm-commits
mailing list