From: Argyrios Kyrtzidis Date: Fri, 26 Oct 2012 19:36:33 +0000 (+0000) Subject: [options] Fix mishandling of aliased options that was introduced in r166444. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7ec3c09412c2bee91e8fb7103da10c46d0e03f2d;p=platform%2Fupstream%2Fllvm.git [options] Fix mishandling of aliased options that was introduced in r166444. llvm-svn: 166801 --- diff --git a/clang/lib/Driver/Option.cpp b/clang/lib/Driver/Option.cpp index a22cb15..9a34df5 100644 --- a/clang/lib/Driver/Option.cpp +++ b/clang/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 #include 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: diff --git a/clang/test/Index/index-with-working-dir.c b/clang/test/Index/index-with-working-dir.c new file mode 100644 index 0000000..de1f1eb --- /dev/null +++ b/clang/test/Index/index-with-working-dir.c @@ -0,0 +1,5 @@ + +void foo(); + +// RUN: c-index-test -index-file -working-directory=%S %s | FileCheck %s +// CHECK: [indexDeclaration]: kind: function | name: foo