[llvm] r236434 - Option parsing: properly handle flag aliases for joined options (PR23394)

Hans Wennborg hans at hanshq.net
Mon May 4 11:00:14 PDT 2015


Author: hans
Date: Mon May  4 13:00:13 2015
New Revision: 236434

URL: http://llvm.org/viewvc/llvm-project?rev=236434&view=rev
Log:
Option parsing: properly handle flag aliases for joined options (PR23394)

A joined option always needs to have an argument, even if it's an empty one.

Clang would previously assert when trying to use --extra-warnings, which is
a flag alias for -W, which is a joined option.

Modified:
    llvm/trunk/lib/Option/Option.cpp
    llvm/trunk/unittests/Option/OptionParsingTest.cpp
    llvm/trunk/unittests/Option/Opts.td

Modified: llvm/trunk/lib/Option/Option.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Option/Option.cpp?rev=236434&r1=236433&r2=236434&view=diff
==============================================================================
--- llvm/trunk/lib/Option/Option.cpp (original)
+++ llvm/trunk/lib/Option/Option.cpp Mon May  4 13:00:13 2015
@@ -125,6 +125,11 @@ Arg *Option::accept(const ArgList &Args,
         Val += strlen(Val) + 1;
       }
     }
+
+    if (UnaliasedOption.getKind() == JoinedClass && !getAliasArgs())
+      // A Flag alias for a Joined option must provide an argument.
+      A->getValues().push_back("");
+
     return A;
   }
   case JoinedClass: {

Modified: llvm/trunk/unittests/Option/OptionParsingTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Option/OptionParsingTest.cpp?rev=236434&r1=236433&r2=236434&view=diff
==============================================================================
--- llvm/trunk/unittests/Option/OptionParsingTest.cpp (original)
+++ llvm/trunk/unittests/Option/OptionParsingTest.cpp Mon May  4 13:00:13 2015
@@ -209,3 +209,17 @@ TEST(Option, Slurp) {
   EXPECT_EQ(AL->getAllArgValues(OPT_Slurp)[1], "--");
   EXPECT_EQ(AL->getAllArgValues(OPT_Slurp)[2], "foo");
 }
+
+TEST(Option, FlagAliasToJoined) {
+  TestOptTable T;
+  unsigned MAI, MAC;
+
+  // Check that a flag alias provides an empty argument to a joined option.
+  const char *MyArgs[] = { "-K" };
+  std::unique_ptr<InputArgList> AL(
+      T.ParseArgs(std::begin(MyArgs), std::end(MyArgs), MAI, MAC));
+  EXPECT_EQ(AL->size(), 1U);
+  EXPECT_TRUE(AL->hasArg(OPT_B));
+  EXPECT_EQ(AL->getAllArgValues(OPT_B).size(), 1U);
+  EXPECT_EQ(AL->getAllArgValues(OPT_B)[0], "");
+}

Modified: llvm/trunk/unittests/Option/Opts.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Option/Opts.td?rev=236434&r1=236433&r2=236434&view=diff
==============================================================================
--- llvm/trunk/unittests/Option/Opts.td (original)
+++ llvm/trunk/unittests/Option/Opts.td Mon May  4 13:00:13 2015
@@ -23,4 +23,6 @@ def I : Flag<["-"], "I">, Alias<H>, Grou
 def J : Flag<["-"], "J">, Alias<B>, AliasArgs<["foo"]>;
 def Joo : Flag<["-"], "Joo">, Alias<B>, AliasArgs<["bar"]>;
 
+def K : Flag<["-"], "K">, Alias<B>;
+
 def Slurp : Option<["-"], "slurp", KIND_REMAINING_ARGS>;





More information about the llvm-commits mailing list