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: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a049bbb3441010880486b82a7d0d284ab9afc4c9;p=clang [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 --- 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 #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/test/Index/index-with-working-dir.c b/test/Index/index-with-working-dir.c new file mode 100644 index 0000000000..de1f1ebe1a --- /dev/null +++ b/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