<div dir="ltr"><div dir="ltr">Reverted in r358414. And thanks for looking into it!</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Apr 15, 2019 at 4:34 PM Don Hinton <<a href="mailto:hintonda@gmail.com">hintonda@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi Ilya:<div><br></div><div>Looking, but might not be fast enough for you.  Feel free to revert if you need to.  Will let you know as soon as I find something.</div><div><br></div><div>thanks...</div><div>don</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Apr 15, 2019 at 7:03 AM Ilya Biryukov <<a href="mailto:ibiryukov@google.com" target="_blank">ibiryukov@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><a class="gmail_plusreply" id="gmail-m_-8585185188339566041gmail-m_3117323039318208062plusReplyChip-0" href="mailto:llvm-commits@lists.llvm.org" target="_blank">+llvm-commits</a> <br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Apr 15, 2019 at 3:56 PM Ilya Biryukov <<a href="mailto:ibiryukov@google.com" target="_blank">ibiryukov@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Hi Don,<div><br></div><div>This change produces a failure during our integrate. I'll have to revert the change to unbreak us. If you can provide a fix really quickly, let me know and I'll wait for it to land instead.</div><div><br></div><div>You can reproduce it under asan by running:</div><div>$ ninja SupportTests && unittests/Support/SupportTests</div><div><br></div><div>Here's the corresponding asan trace:<br></div><div>[ RUN      ] CommandLineTest.SetDefautValue<br></div><div><div><div>=================================================================</div><div>==167392==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffc680fecec at pc 0x7f2d8c7c3c51 bp 0x7ffc680fe980 sp 0x7ffc680fe978</div><div>READ of size 4 at 0x7ffc680fecec thread T0</div><div>    #0 0x7f2d8c7c3c50 in size ...llvm/include/llvm/ADT/SmallPtrSet.h:92:35</div><div>    #1 0x7f2d8c7c3c50 in empty ...llvm/include/llvm/ADT/SmallPtrSet.h:91</div><div>    #2 0x7f2d8c7c3c50 in (anonymous namespace)::CommandLineParser::addOption(llvm::cl::Option*, bool) ...llvm/lib/Support/CommandLine.cpp:204</div><div>    #3 0x7f2d8c7ce9c3 in ParseCommandLineOptions ...llvm/lib/Support/CommandLine.cpp:1202:5</div><div>    #4 0x7f2d8c7ce9c3 in llvm::cl::ParseCommandLineOptions(int, char const* const*, llvm::StringRef, llvm::raw_ostream*, char const*) ...llvm/lib/Support/CommandLine.cpp:1139</div><div>    #5 0x743717 in (anonymous namespace)::CommandLineTest_SetDefautValue_Test::TestBody() ...llvm/unittests/Support/CommandLineTest.cpp:794:3</div><div>    #6 0x7f2d8cc53430 in HandleExceptionsInMethodIfSupported<testing::Test, void> ...llvm/utils/unittest/googletest/src/gtest.cc</div><div>    #7 0x7f2d8cc53430 in testing::Test::Run() ...llvm/utils/unittest/googletest/src/gtest.cc:2474</div><div>    #8 0x7f2d8cc57a35 in testing::TestInfo::Run() ...llvm/utils/unittest/googletest/src/gtest.cc:2656:11</div><div>    #9 0x7f2d8cc59270 in testing::TestCase::Run() ...llvm/utils/unittest/googletest/src/gtest.cc:2774:28</div><div>    #10 0x7f2d8cc7a210 in testing::internal::UnitTestImpl::RunAllTests() ...llvm/utils/unittest/googletest/src/gtest.cc:4649:43</div><div>    #11 0x7f2d8cc793d6 in HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> ...llvm/utils/unittest/googletest/src/gtest.cc</div><div>    #12 0x7f2d8cc793d6 in testing::UnitTest::Run() ...llvm/utils/unittest/googletest/src/gtest.cc:4257</div><div>    #13 0x7f2d8ccf7256 in RUN_ALL_TESTS ...llvm/utils/unittest/googletest/include/gtest/gtest.h:2233:46</div><div>    #14 0x7f2d8ccf7256 in main ...llvm/utils/unittest/UnitTestMain/TestMain.cpp:50</div><div>    #15 0x7f2d8b2f52b0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202b0)</div><div>    #16 0x4c8029 in _start (...build-asan/unittests/Support/SupportTests+0x4c8029)</div><div><br></div><div><br></div></div><div><br></div></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Apr 13, 2019 at 6:53 PM Don Hinton via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: dhinton<br>
Date: Sat Apr 13 09:55:28 2019<br>
New Revision: 358337<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=358337&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=358337&view=rev</a><br>
Log:<br>
[CommandLineParser] Add DefaultOption flag<br>
<br>
Summary: Add DefaultOption flag to CommandLineParser which provides a<br>
default option or alias, but allows users to override it for some<br>
other purpose as needed.<br>
<br>
Also, add `-h` as a default alias to `-help`, which can be seamlessly<br>
overridden by applications like llvm-objdump and llvm-readobj which<br>
use `-h` as an alias for other options.<br>
<br>
Reviewers: alexfh, klimek<br>
<br>
Reviewed By: klimek<br>
<br>
Subscribers: MaskRay, mehdi_amini, inglorion, dexonsmith, hiraditya, llvm-commits, jhenderson, arphaman, cfe-commits<br>
<br>
Tags: #clang, #llvm<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D59746" rel="noreferrer" target="_blank">https://reviews.llvm.org/D59746</a><br>
<br>
Added:<br>
    llvm/trunk/test/Support/<br>
    llvm/trunk/test/Support/check-default-options.txt<br>
Modified:<br>
    llvm/trunk/docs/CommandLine.rst<br>
    llvm/trunk/include/llvm/Support/CommandLine.h<br>
    llvm/trunk/lib/Support/CommandLine.cpp<br>
    llvm/trunk/tools/llvm-opt-report/OptReport.cpp<br>
    llvm/trunk/unittests/Support/CommandLineTest.cpp<br>
<br>
Modified: llvm/trunk/docs/CommandLine.rst<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/CommandLine.rst?rev=358337&r1=358336&r2=358337&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/CommandLine.rst?rev=358337&r1=358336&r2=358337&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/docs/CommandLine.rst (original)<br>
+++ llvm/trunk/docs/CommandLine.rst Sat Apr 13 09:55:28 2019<br>
@@ -128,6 +128,7 @@ this:<br>
   USAGE: compiler [options]<br>
<br>
   OPTIONS:<br>
+    -h                - Alias for -help<br>
     -help             - display available options (-help-hidden for more)<br>
     -o <filename>     - Specify output filename<br>
<br>
@@ -194,6 +195,7 @@ declarations above, the ``-help`` option<br>
   USAGE: compiler [options] <input file><br>
<br>
   OPTIONS:<br>
+    -h                - Alias for -help<br>
     -help             - display available options (-help-hidden for more)<br>
     -o <filename>     - Specify output filename<br>
<br>
@@ -1251,6 +1253,14 @@ specify boolean properties that modify t<br>
   with ``cl::CommaSeparated``, this modifier only makes sense with a `cl::list`_<br>
   option.<br>
<br>
+.. _cl::DefaultOption:<br>
+<br>
+* The **cl::DefaultOption** modifier is used to specify that the option is a<br>
+  default that can be overridden by application specific parsers. For example,<br>
+  the ``-help`` alias, ``-h``, is registered this way, so it can be overridden<br>
+  by applications that need to use the ``-h`` option for another purpose,<br>
+  either as a regular option or an alias for another option.<br>
+<br>
 .. _response files:<br>
<br>
 Response files<br>
<br>
Modified: llvm/trunk/include/llvm/Support/CommandLine.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/CommandLine.h?rev=358337&r1=358336&r2=358337&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/CommandLine.h?rev=358337&r1=358336&r2=358337&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Support/CommandLine.h (original)<br>
+++ llvm/trunk/include/llvm/Support/CommandLine.h Sat Apr 13 09:55:28 2019<br>
@@ -175,7 +175,10 @@ enum MiscFlags {             // Miscella<br>
   // If this is enabled, multiple letter options are allowed to bunch together<br>
   // with only a single hyphen for the whole group.  This allows emulation<br>
   // of the behavior that ls uses for example: ls -la === ls -l -a<br>
-  Grouping = 0x08<br>
+  Grouping = 0x08,<br>
+<br>
+  // Default option<br>
+  DefaultOption = 0x10<br>
 };<br>
<br>
 //===----------------------------------------------------------------------===//<br>
@@ -270,7 +273,7 @@ class Option {<br>
   unsigned Value : 2;<br>
   unsigned HiddenFlag : 2; // enum OptionHidden<br>
   unsigned Formatting : 2; // enum FormattingFlags<br>
-  unsigned Misc : 4;<br>
+  unsigned Misc : 5;<br>
   unsigned Position = 0;       // Position of last occurrence of the option<br>
   unsigned AdditionalVals = 0; // Greater than 0 for multi-valued option.<br>
<br>
@@ -306,6 +309,7 @@ public:<br>
   bool hasArgStr() const { return !ArgStr.empty(); }<br>
   bool isPositional() const { return getFormattingFlag() == cl::Positional; }<br>
   bool isSink() const { return getMiscFlags() & cl::Sink; }<br>
+  bool isDefaultOption() const { return getMiscFlags() & cl::DefaultOption; }<br>
<br>
   bool isConsumeAfter() const {<br>
     return getNumOccurrencesFlag() == cl::ConsumeAfter;<br>
@@ -382,7 +386,7 @@ public:<br>
   }<br>
<br>
   inline int getNumOccurrences() const { return NumOccurrences; }<br>
-  inline void reset() { NumOccurrences = 0; }<br>
+  void reset();<br>
 };<br>
<br>
 //===----------------------------------------------------------------------===//<br>
@@ -1732,7 +1736,10 @@ class alias : public Option {<br>
       error("cl::alias must have argument name specified!");<br>
     if (!AliasFor)<br>
       error("cl::alias must have an cl::aliasopt(option) specified!");<br>
+    if (!Subs.empty())<br>
+      error("cl::alias must not have cl::sub(), aliased option's cl::sub() will be used!");<br>
     Subs = AliasFor->Subs;<br>
+    Category = AliasFor->Category;<br>
     addArgument();<br>
   }<br>
<br>
<br>
Modified: llvm/trunk/lib/Support/CommandLine.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CommandLine.cpp?rev=358337&r1=358336&r2=358337&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CommandLine.cpp?rev=358337&r1=358336&r2=358337&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Support/CommandLine.cpp (original)<br>
+++ llvm/trunk/lib/Support/CommandLine.cpp Sat Apr 13 09:55:28 2019<br>
@@ -98,6 +98,11 @@ public:<br>
   // This collects additional help to be printed.<br>
   std::vector<StringRef> MoreHelp;<br>
<br>
+  // This collects Options added with the cl::DefaultOption flag. Since they can<br>
+  // be overridden, they are not added to the appropriate SubCommands until<br>
+  // ParseCommandLineOptions actually runs.<br>
+  SmallVector<Option*, 4> DefaultOptions;<br>
+<br>
   // This collects the different option categories that have been registered.<br>
   SmallPtrSet<OptionCategory *, 16> RegisteredOptionCategories;<br>
<br>
@@ -146,6 +151,11 @@ public:<br>
   void addOption(Option *O, SubCommand *SC) {<br>
     bool HadErrors = false;<br>
     if (O->hasArgStr()) {<br>
+      // If it's a DefaultOption, check to make sure it isn't already there.<br>
+      if (O->isDefaultOption() &&<br>
+          SC->OptionsMap.find(O->ArgStr) != SC->OptionsMap.end())<br>
+        return;<br>
+<br>
       // Add argument to the argument map!<br>
       if (!SC->OptionsMap.insert(std::make_pair(O->ArgStr, O)).second) {<br>
         errs() << ProgramName << ": CommandLine Error: Option '" << O->ArgStr<br>
@@ -185,7 +195,12 @@ public:<br>
     }<br>
   }<br>
<br>
-  void addOption(Option *O) {<br>
+  void addOption(Option *O, bool ProcessDefaultOption = false) {<br>
+    if (!ProcessDefaultOption && O->isDefaultOption()) {<br>
+      DefaultOptions.push_back(O);<br>
+      return;<br>
+    }<br>
+<br>
     if (O->Subs.empty()) {<br>
       addOption(O, &*TopLevelSubCommand);<br>
     } else {<br>
@@ -201,8 +216,12 @@ public:<br>
       OptionNames.push_back(O->ArgStr);<br>
<br>
     SubCommand &Sub = *SC;<br>
-    for (auto Name : OptionNames)<br>
-      Sub.OptionsMap.erase(Name);<br>
+    auto End = Sub.OptionsMap.end();<br>
+    for (auto Name : OptionNames) {<br>
+      auto I = Sub.OptionsMap.find(Name);<br>
+      if (I != End && I->getValue() == O)<br>
+        Sub.OptionsMap.erase(I);<br>
+      }<br>
<br>
     if (O->getFormattingFlag() == cl::Positional)<br>
       for (auto Opt = Sub.PositionalOpts.begin();<br>
@@ -266,8 +285,13 @@ public:<br>
     if (O->Subs.empty())<br>
       updateArgStr(O, NewName, &*TopLevelSubCommand);<br>
     else {<br>
-      for (auto SC : O->Subs)<br>
-        updateArgStr(O, NewName, SC);<br>
+      if (O->isInAllSubCommands()) {<br>
+        for (auto SC : RegisteredSubCommands)<br>
+          updateArgStr(O, NewName, SC);<br>
+      } else {<br>
+        for (auto SC : O->Subs)<br>
+          updateArgStr(O, NewName, SC);<br>
+      }<br>
     }<br>
   }<br>
<br>
@@ -366,6 +390,13 @@ void Option::setArgStr(StringRef S) {<br>
   ArgStr = S;<br>
 }<br>
<br>
+void Option::reset() {<br>
+  NumOccurrences = 0;<br>
+  setDefault();<br>
+  if (isDefaultOption())<br>
+    removeArgument();<br>
+}<br>
+<br>
 // Initialise the general option category.<br>
 OptionCategory llvm::cl::GeneralCategory("General options");<br>
<br>
@@ -1167,6 +1198,10 @@ bool CommandLineParser::ParseCommandLine<br>
   auto &SinkOpts = ChosenSubCommand->SinkOpts;<br>
   auto &OptionsMap = ChosenSubCommand->OptionsMap;<br>
<br>
+  for (auto O: DefaultOptions) {<br>
+    addOption(O, true);<br>
+  }<br>
+<br>
   if (ConsumeAfterOpt) {<br>
     assert(PositionalOpts.size() > 0 &&<br>
            "Cannot specify cl::ConsumeAfter without a positional argument!");<br>
@@ -2146,6 +2181,9 @@ static cl::opt<HelpPrinterWrapper, true,<br>
         cl::location(WrappedNormalPrinter), cl::ValueDisallowed,<br>
         cl::cat(GenericCategory), cl::sub(*AllSubCommands));<br>
<br>
+static cl::alias HOpA("h", cl::desc("Alias for -help"), cl::aliasopt(HOp),<br>
+                      cl::DefaultOption);<br>
+<br>
 static cl::opt<HelpPrinterWrapper, true, parser<bool>><br>
     HHOp("help-hidden", cl::desc("Display all available options"),<br>
          cl::location(WrappedHiddenPrinter), cl::Hidden, cl::ValueDisallowed,<br>
<br>
Added: llvm/trunk/test/Support/check-default-options.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Support/check-default-options.txt?rev=358337&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Support/check-default-options.txt?rev=358337&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Support/check-default-options.txt (added)<br>
+++ llvm/trunk/test/Support/check-default-options.txt Sat Apr 13 09:55:28 2019<br>
@@ -0,0 +1,18 @@<br>
+# RUN: llvm-objdump -help-hidden %t | FileCheck --check-prefix=CHECK-OBJDUMP %s<br>
+# RUN: llvm-readobj -help-hidden %t | FileCheck --check-prefix=CHECK-READOBJ %s<br>
+# RUN: llvm-tblgen -help-hidden %t | FileCheck --check-prefix=CHECK-TBLGEN %s<br>
+# RUN: llvm-opt-report -help-hidden %t | FileCheck --check-prefix=CHECK-OPT-RPT %s<br>
+# RUN: llvm-dwarfdump -help-hidden %t | FileCheck --check-prefix=CHECK-DWARF %s<br>
+# RUN: llvm-dwarfdump -h %t | FileCheck --check-prefix=CHECK-DWARF-H %s<br>
+<br>
+<br>
+# CHECK-OBJDUMP: -h  - Alias for --section-headers<br>
+# CHECK-READOBJ: -h  - Alias for --file-headers<br>
+# CHECK-TBLGEN:  -h  - Alias for -help<br>
+# CHECK-OPT-RPT: -h  - Alias for -help<br>
+# CHECK-DWARF:   -h  - Alias for -help<br>
+<br>
+# llvm-dwarfdump declares `-h` option and prints special help in that case,<br>
+# which is weird, but makes for a good test, i.e., shows the default `-h`<br>
+# wasn't used.<br>
+# CHECK-DWARF-H-NOT: -help-list  - Display list of available options (-help-list-hidden for more)<br>
<br>
Modified: llvm/trunk/tools/llvm-opt-report/OptReport.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-opt-report/OptReport.cpp?rev=358337&r1=358336&r2=358337&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-opt-report/OptReport.cpp?rev=358337&r1=358336&r2=358337&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-opt-report/OptReport.cpp (original)<br>
+++ llvm/trunk/tools/llvm-opt-report/OptReport.cpp Sat Apr 13 09:55:28 2019<br>
@@ -36,8 +36,6 @@<br>
 using namespace llvm;<br>
 using namespace llvm::yaml;<br>
<br>
-static cl::opt<bool> Help("h", cl::desc("Alias for -help"), cl::Hidden);<br>
-<br>
 // Mark all our options with this category, everything else (except for -version<br>
 // and -help) will be hidden.<br>
 static cl::OptionCategory<br>
@@ -440,11 +438,6 @@ int main(int argc, const char **argv) {<br>
       "A tool to generate an optimization report from YAML optimization"<br>
       " record files.\n");<br>
<br>
-  if (Help) {<br>
-    cl::PrintHelpMessage();<br>
-    return 0;<br>
-  }<br>
-<br>
   LocationInfoTy LocationInfo;<br>
   if (!readLocationInfo(LocationInfo))<br>
     return 1;<br>
<br>
Modified: llvm/trunk/unittests/Support/CommandLineTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/CommandLineTest.cpp?rev=358337&r1=358336&r2=358337&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/CommandLineTest.cpp?rev=358337&r1=358336&r2=358337&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/unittests/Support/CommandLineTest.cpp (original)<br>
+++ llvm/trunk/unittests/Support/CommandLineTest.cpp Sat Apr 13 09:55:28 2019<br>
@@ -620,6 +620,67 @@ TEST(CommandLineTest, GetRegisteredSubco<br>
   }<br>
 }<br>
<br>
+TEST(CommandLineTest, DefaultOptions) {<br>
+  cl::ResetCommandLineParser();<br>
+<br>
+  StackOption<std::string> Bar("bar", cl::sub(*cl::AllSubCommands),<br>
+                               cl::DefaultOption);<br>
+  StackOption<std::string, cl::alias> Bar_Alias(<br>
+      "b", cl::desc("Alias for -bar"), cl::aliasopt(Bar), cl::DefaultOption);<br>
+<br>
+  StackOption<bool> Foo("foo", cl::init(false), cl::sub(*cl::AllSubCommands),<br>
+                        cl::DefaultOption);<br>
+  StackOption<bool, cl::alias> Foo_Alias("f", cl::desc("Alias for -foo"),<br>
+                                         cl::aliasopt(Foo), cl::DefaultOption);<br>
+<br>
+  StackSubCommand SC1("sc1", "First Subcommand");<br>
+  // Override "-b" and change type in sc1 SubCommand.<br>
+  StackOption<bool> SC1_B("b", cl::sub(SC1), cl::init(false));<br>
+  StackSubCommand SC2("sc2", "Second subcommand");<br>
+  // Override "-foo" and change type in sc2 SubCommand.  Note that this does not<br>
+  // affect "-f" alias, which continues to work correctly.<br>
+  StackOption<std::string> SC2_Foo("foo", cl::sub(SC2));<br>
+<br>
+  const char *args0[] = {"prog", "-b", "args0 bar string", "-f"};<br>
+  EXPECT_TRUE(cl::ParseCommandLineOptions(sizeof(args0) / sizeof(char *), args0,<br>
+                                          StringRef(), &llvm::nulls()));<br>
+  EXPECT_TRUE(Bar == "args0 bar string");<br>
+  EXPECT_TRUE(Foo);<br>
+  EXPECT_FALSE(SC1_B);<br>
+  EXPECT_TRUE(SC2_Foo.empty());<br>
+<br>
+  cl::ResetAllOptionOccurrences();<br>
+<br>
+  const char *args1[] = {"prog", "sc1", "-b", "-bar", "args1 bar string", "-f"};<br>
+  EXPECT_TRUE(cl::ParseCommandLineOptions(sizeof(args1) / sizeof(char *), args1,<br>
+                                          StringRef(), &llvm::nulls()));<br>
+  EXPECT_TRUE(Bar == "args1 bar string");<br>
+  EXPECT_TRUE(Foo);<br>
+  EXPECT_TRUE(SC1_B);<br>
+  EXPECT_TRUE(SC2_Foo.empty());<br>
+  for (auto *S : cl::getRegisteredSubcommands()) {<br>
+    if (*S) {<br>
+      EXPECT_EQ("sc1", S->getName());<br>
+    }<br>
+  }<br>
+<br>
+  cl::ResetAllOptionOccurrences();<br>
+<br>
+  const char *args2[] = {"prog", "sc2", "-b", "args2 bar string",<br>
+                         "-f", "-foo", "foo string"};<br>
+  EXPECT_TRUE(cl::ParseCommandLineOptions(sizeof(args2) / sizeof(char *), args2,<br>
+                                          StringRef(), &llvm::nulls()));<br>
+  EXPECT_TRUE(Bar == "args2 bar string");<br>
+  EXPECT_TRUE(Foo);<br>
+  EXPECT_FALSE(SC1_B);<br>
+  EXPECT_TRUE(SC2_Foo == "foo string");<br>
+  for (auto *S : cl::getRegisteredSubcommands()) {<br>
+    if (*S) {<br>
+      EXPECT_EQ("sc2", S->getName());<br>
+    }<br>
+  }<br>
+}<br>
+<br>
 TEST(CommandLineTest, ArgumentLimit) {<br>
   std::string args(32 * 4096, 'a');<br>
   EXPECT_FALSE(llvm::sys::commandLineFitsWithinSystemLimits("cl", args.data()));<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail-m_-8585185188339566041gmail-m_3117323039318208062gmail-m_793555556350921427gmail_signature"><div dir="ltr"><div><div dir="ltr"><div>Regards,</div><div>Ilya Biryukov</div></div></div></div></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail-m_-8585185188339566041gmail-m_3117323039318208062gmail_signature"><div dir="ltr"><div><div dir="ltr"><div>Regards,</div><div>Ilya Biryukov</div></div></div></div></div>
</blockquote></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div>Regards,</div><div>Ilya Biryukov</div></div></div></div></div>