diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-10-26 19:36:33 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-10-26 19:36:33 +0000 |
commit | a049bbb3441010880486b82a7d0d284ab9afc4c9 (patch) | |
tree | 94860a5cd5e469aa9da49b7ef6fc45a5a9867024 /lib/Driver/Option.cpp | |
parent | 34f8597973b8ed59da43cdd5c801dc073011e3a5 (diff) |
[options] Fix mishandling of aliased options that was introduced in r166444.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@166801 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Driver/Option.cpp')
-rw-r--r-- | lib/Driver/Option.cpp | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/lib/Driver/Option.cpp b/lib/Driver/Option.cpp index a22cb15e2e..9a34df5903 100644 --- a/lib/Driver/Option.cpp +++ b/lib/Driver/Option.cpp @@ -13,6 +13,7 @@ #include "clang/Driver/ArgList.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/ADT/Twine.h" #include <cassert> #include <algorithm> using namespace clang::driver; @@ -93,21 +94,30 @@ bool Option::matches(OptSpecifier Opt) const { Arg *Option::accept(const ArgList &Args, unsigned &Index, unsigned ArgSize) const { - StringRef Spelling(Args.getArgString(Index), ArgSize); + const Option &UnaliasedOption = getUnaliasedOption(); + StringRef Spelling; + // If the option was an alias, get the spelling from the unaliased one. + if (getID() == UnaliasedOption.getID()) { + Spelling = StringRef(Args.getArgString(Index), ArgSize); + } else { + Spelling = Args.MakeArgString(Twine(UnaliasedOption.getPrefix()) + + Twine(UnaliasedOption.getName())); + } + switch (getKind()) { case FlagClass: if (ArgSize != strlen(Args.getArgString(Index))) return 0; - return new Arg(getUnaliasedOption(), Spelling, Index++); + return new Arg(UnaliasedOption, Spelling, Index++); case JoinedClass: { const char *Value = Args.getArgString(Index) + ArgSize; - return new Arg(getUnaliasedOption(), Spelling, Index++, Value); + return new Arg(UnaliasedOption, Spelling, Index++, Value); } case CommaJoinedClass: { // Always matches. const char *Str = Args.getArgString(Index) + ArgSize; - Arg *A = new Arg(getUnaliasedOption(), Spelling, Index++); + Arg *A = new Arg(UnaliasedOption, Spelling, Index++); // Parse out the comma separated values. const char *Prev = Str; @@ -142,7 +152,7 @@ Arg *Option::accept(const ArgList &Args, if (Index > Args.getNumInputArgStrings()) return 0; - return new Arg(getUnaliasedOption(), Spelling, + return new Arg(UnaliasedOption, Spelling, Index - 2, Args.getArgString(Index - 1)); case MultiArgClass: { // Matches iff this is an exact match. @@ -154,7 +164,7 @@ Arg *Option::accept(const ArgList &Args, if (Index > Args.getNumInputArgStrings()) return 0; - Arg *A = new Arg(getUnaliasedOption(), Spelling, Index - 1 - getNumArgs(), + Arg *A = new Arg(UnaliasedOption, Spelling, Index - 1 - getNumArgs(), Args.getArgString(Index - getNumArgs())); for (unsigned i = 1; i != getNumArgs(); ++i) A->getValues().push_back(Args.getArgString(Index - getNumArgs() + i)); @@ -173,7 +183,7 @@ Arg *Option::accept(const ArgList &Args, if (Index > Args.getNumInputArgStrings()) return 0; - return new Arg(getUnaliasedOption(), Spelling, + return new Arg(UnaliasedOption, Spelling, Index - 2, Args.getArgString(Index - 1)); } case JoinedAndSeparateClass: @@ -182,7 +192,7 @@ Arg *Option::accept(const ArgList &Args, if (Index > Args.getNumInputArgStrings()) return 0; - return new Arg(getUnaliasedOption(), Spelling, Index - 2, + return new Arg(UnaliasedOption, Spelling, Index - 2, Args.getArgString(Index - 2) + ArgSize, Args.getArgString(Index - 1)); default: |