Option parsing: properly handle flag aliases for joined options (PR23394)
authorHans Wennborg <hans@hanshq.net>
Mon, 4 May 2015 18:00:13 +0000 (18:00 +0000)
committerHans Wennborg <hans@hanshq.net>
Mon, 4 May 2015 18:00:13 +0000 (18:00 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236434 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Option/Option.cpp
unittests/Option/OptionParsingTest.cpp
unittests/Option/Opts.td

index e29d649..221414d 100644 (file)
@@ -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: {
index aa32da3..521009a 100644 (file)
@@ -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], "");
+}
index aaed6b2..c96774a 100644 (file)
@@ -23,4 +23,6 @@ def I : Flag<["-"], "I">, Alias<H>, Group<my_group>;
 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>;