[options] Fix mishandling of aliased options that was introduced in r166444.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 26 Oct 2012 19:36:33 +0000 (19:36 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 26 Oct 2012 19:36:33 +0000 (19:36 +0000)
llvm-svn: 166801

clang/lib/Driver/Option.cpp
clang/test/Index/index-with-working-dir.c [new file with mode: 0644]

index a22cb15..9a34df5 100644 (file)
@@ -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:
diff --git a/clang/test/Index/index-with-working-dir.c b/clang/test/Index/index-with-working-dir.c
new file mode 100644 (file)
index 0000000..de1f1eb
--- /dev/null
@@ -0,0 +1,5 @@
+
+void foo();
+
+// RUN: c-index-test -index-file -working-directory=%S %s | FileCheck %s
+// CHECK: [indexDeclaration]: kind: function | name: foo