[PATCH] D114645: [CommandLine] Keep option default value unset if no cl::init() is used
Yevgeny Rouban via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 9 01:25:56 PST 2021
yrouban updated this revision to Diff 393068.
yrouban added a comment.
Extracted a separate change D115433 <https://reviews.llvm.org/D115433>.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D114645/new/
https://reviews.llvm.org/D114645
Files:
llvm/include/llvm/Support/CommandLine.h
llvm/unittests/Support/CommandLineTest.cpp
Index: llvm/unittests/Support/CommandLineTest.cpp
===================================================================
--- llvm/unittests/Support/CommandLineTest.cpp
+++ llvm/unittests/Support/CommandLineTest.cpp
@@ -1933,4 +1933,60 @@
EXPECT_EQ(0, (int)ExtraArgs.size());
}
+TEST(CommandLineTest, DefaultValue) {
+ cl::ResetCommandLineParser();
+
+ StackOption<bool> BoolOption("bool-option");
+ StackOption<std::string> StrOption("str-option");
+ StackOption<bool> BoolInitOption("bool-init-option", cl::init(true));
+ StackOption<std::string> StrInitOption("str-init-option",
+ cl::init("str-default-value"));
+
+ const char *Args[] = {"prog"}; // no options
+
+ std::string Errs;
+ raw_string_ostream OS(Errs);
+ EXPECT_TRUE(cl::ParseCommandLineOptions(1, Args, StringRef(), &OS));
+ EXPECT_TRUE(OS.str().empty());
+
+ EXPECT_TRUE(!BoolOption);
+ EXPECT_FALSE(BoolOption.Default.hasValue());
+ EXPECT_EQ(0, BoolOption.getNumOccurrences());
+
+ EXPECT_EQ("", StrOption);
+ EXPECT_FALSE(StrOption.Default.hasValue());
+ EXPECT_EQ(0, StrOption.getNumOccurrences());
+
+ EXPECT_TRUE(BoolInitOption);
+ EXPECT_TRUE(BoolInitOption.Default.hasValue());
+ EXPECT_EQ(0, BoolInitOption.getNumOccurrences());
+
+ EXPECT_EQ("str-default-value", StrInitOption);
+ EXPECT_TRUE(StrInitOption.Default.hasValue());
+ EXPECT_EQ(0, StrInitOption.getNumOccurrences());
+
+ const char *Args2[] = {"prog", "-bool-option", "-str-option=str-value",
+ "-bool-init-option=0",
+ "-str-init-option=str-init-value"};
+
+ EXPECT_TRUE(cl::ParseCommandLineOptions(5, Args2, StringRef(), &OS));
+ EXPECT_TRUE(OS.str().empty());
+
+ EXPECT_TRUE(BoolOption);
+ EXPECT_FALSE(BoolOption.Default.hasValue());
+ EXPECT_EQ(1, BoolOption.getNumOccurrences());
+
+ EXPECT_EQ("str-value", StrOption);
+ EXPECT_FALSE(StrOption.Default.hasValue());
+ EXPECT_EQ(1, StrOption.getNumOccurrences());
+
+ EXPECT_FALSE(BoolInitOption);
+ EXPECT_TRUE(BoolInitOption.Default.hasValue());
+ EXPECT_EQ(1, BoolInitOption.getNumOccurrences());
+
+ EXPECT_EQ("str-init-value", StrInitOption);
+ EXPECT_TRUE(StrInitOption.Default.hasValue());
+ EXPECT_EQ(1, StrInitOption.getNumOccurrences());
+}
+
} // anonymous namespace
Index: llvm/include/llvm/Support/CommandLine.h
===================================================================
--- llvm/include/llvm/Support/CommandLine.h
+++ llvm/include/llvm/Support/CommandLine.h
@@ -1406,7 +1406,7 @@
// Make sure we initialize the value with the default constructor for the
// type.
- opt_storage() : Value(DataType()), Default(DataType()) {}
+ opt_storage() : Value(DataType()), Default() {}
template <class T> void setValue(const T &V, bool initial = false) {
Value = V;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D114645.393068.patch
Type: text/x-patch
Size: 2818 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211209/2f8bd75f/attachment-0001.bin>
More information about the llvm-commits
mailing list