aboutsummaryrefslogtreecommitdiff
path: root/lib/Driver/Option.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2012-10-26 19:36:33 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2012-10-26 19:36:33 +0000
commita049bbb3441010880486b82a7d0d284ab9afc4c9 (patch)
tree94860a5cd5e469aa9da49b7ef6fc45a5a9867024 /lib/Driver/Option.cpp
parent34f8597973b8ed59da43cdd5c801dc073011e3a5 (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.cpp26
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: