[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