PR symtab/17602
authorDoug Evans <dje@google.com>
Wed, 3 Dec 2014 00:40:38 +0000 (16:40 -0800)
committerDoug Evans <dje@google.com>
Wed, 3 Dec 2014 00:40:38 +0000 (16:40 -0800)
gdb/ChangeLog:

PR symtab/17602
* linespec.c (iterate_name_matcher): Fix arguments to symbol_name_cmp.

gdb/testsuite/ChangeLog:

        PR symtab/17602
* gdb.cp/anon-ns.cc: Move guts of this file to ...
* gdb.cp/anon-ns-2.cc: ... here.  New file.
* gdb.cp/anon-ns.exp: Update.

gdb/ChangeLog
gdb/linespec.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.cp/anon-ns.cc
gdb/testsuite/gdb.cp/anon-ns.exp
gdb/testsuite/gdb.cp/anon-ns2.cc [new file with mode: 0644]

index 4ca9ac17672d5c9e642f4f3c526543ccd7d8de9e..98883694a5a1f9848e71ac1696a66cf71e869a8c 100644 (file)
@@ -1,3 +1,8 @@
+2014-12-02  Doug Evans  <dje@google.com>
+
+       PR symtab/17602
+       * linespec.c (iterate_name_matcher): Fix arguments to symbol_name_cmp.
+
 2014-12-02  Doug Evans  <dje@google.com>
 
        PR symtab/17591
index 82384cab6207efb62d632abf48741e74beea6e3d..af958dc9f3719830321186e3a26e90670477660a 100644 (file)
@@ -982,7 +982,12 @@ iterate_name_matcher (const char *name, void *d)
 {
   const struct symbol_matcher_data *data = d;
 
-  if (data->symbol_name_cmp (name, data->lookup_name) == 0)
+  /* The order of arguments we pass to symbol_name_cmp is important as
+     strcmp_iw, a typical value for symbol_name_cmp, only performs special
+     processing of '(' to remove overload info on the first argument and not
+     the second.  The first argument is what the user provided, the second
+     argument is what came from partial syms / .gdb_index.  */
+  if (data->symbol_name_cmp (data->lookup_name, name) == 0)
     return 1; /* Expand this symbol's symbol table.  */
   return 0; /* Skip this symbol.  */
 }
index f0bcbf8fa13500c58b83d061793c96728846f090..17b0146950938ec47c78536c65ffd875b2b8bb46 100644 (file)
@@ -1,3 +1,10 @@
+2014-12-02  Doug Evans  <dje@google.com>
+
+        PR symtab/17602
+       * gdb.cp/anon-ns.cc: Move guts of this file to ...
+       * gdb.cp/anon-ns-2.cc: ... here.  New file.
+       * gdb.cp/anon-ns.exp: Update.
+
 2014-12-02  Nick Bull  <nicholaspbull@gmail.com>
 
        * gdb.python/py-events.py (inferior_call_handler): New.
index 26bc307bb98d980cf5a8a46e0bd82f350b881de6..31b05c9acd12edf02f65c7be939584157950dd5e 100644 (file)
 
    Contributed by Red Hat, originally written by Keith Seitz.  */
 
-#include <stdlib.h>
-
-namespace
-{
-  void doit1 (void) { } // doit1(void)
-  void doit1 (int a) { } // doit1(int)
-  void doit1 (char *a) { } // doit1(char *)
-
-  class one
-  {
-  public:
-    one (void) { } // one::one(void)
-    one (int a) { } // one::one(int)
-    one (char *a) { } // one::one(char *)
-    static void doit (void) { } // one::doit(void)
-  };
-
-  namespace A
-  {
-    void doit2 (void) { } // A::doit2(void)
-    void doit2 (int a) { } // A::doit2(int)
-    void doit2 (char *a) { } // A::doit2(char *)
-
-    class two
-    {
-    public:
-      two (void) { } // A::two::two(void)
-      two (int a) { } // A::two::two(int)
-      two (char *a) { } // A::two::two(char *)
-      static void doit (void) { } // A::two::doit(void)
-    };
-
-    namespace
-    {
-      namespace
-      {
-       void doit3 (void) { } // A::doit3(void)
-       void doit3 (int a) { } // A::doit3(int)
-       void doit3 (char *a) { } // A::doit3(char *)
-
-       class three
-       {
-       public:
-         three (void) { } // A::three::three(void)
-         three (int a) { } // A::three::three(int)
-         three (char *a) { } // A::three::three(char *)
-         static void doit (void) { } // A::three::doit(void)
-       };
-      }
-    }
-  }
-}
+extern void doit (void);
 
 int
 main (void)
 {
-  one a, b (3), c (static_cast<char *> (NULL));
-  one::doit ();
-  A::two d, e (3), f (static_cast<char *> (NULL));
-  A::two::doit ();
-  A::three g, h (3), i (static_cast<char *> (NULL));
-  A::three::doit ();
-  doit1 ();
-  doit1 (3);
-  doit1 (static_cast<char *> (NULL));
-  A::doit2 ();
-  A::doit2 (3);
-  A::doit2 (static_cast<char *> (NULL));
-  A::doit3 ();
-  A::doit3 (3);
-  A::doit3 (static_cast<char *> (NULL));
+  doit ();
   return 0;
 }
index 0cbb71b897b30baf8783d8622b2b9574ea61e08c..f8d49709bc77957768104e6f1d6857a41c2a81f2 100644 (file)
@@ -19,9 +19,9 @@
 
 if {[skip_cplus_tests]} { continue }
 
-standard_testfile .cc
+standard_testfile .cc anon-ns2.cc
 
-if {[prepare_for_testing $testfile $testfile $srcfile {c++ debug}]} {
+if {[prepare_for_testing $testfile $testfile "$srcfile $srcfile2" {c++ debug}]} {
     return -1
 }
 
diff --git a/gdb/testsuite/gdb.cp/anon-ns2.cc b/gdb/testsuite/gdb.cp/anon-ns2.cc
new file mode 100644 (file)
index 0000000..0d29d9f
--- /dev/null
@@ -0,0 +1,91 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2011-2014 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+   Contributed by Red Hat, originally written by Keith Seitz.  */
+
+#include <stdlib.h>
+
+namespace
+{
+  void doit1 (void) { } // doit1(void)
+  void doit1 (int a) { } // doit1(int)
+  void doit1 (char *a) { } // doit1(char *)
+
+  class one
+  {
+  public:
+    one (void) { } // one::one(void)
+    one (int a) { } // one::one(int)
+    one (char *a) { } // one::one(char *)
+    static void doit (void) { } // one::doit(void)
+  };
+
+  namespace A
+  {
+    void doit2 (void) { } // A::doit2(void)
+    void doit2 (int a) { } // A::doit2(int)
+    void doit2 (char *a) { } // A::doit2(char *)
+
+    class two
+    {
+    public:
+      two (void) { } // A::two::two(void)
+      two (int a) { } // A::two::two(int)
+      two (char *a) { } // A::two::two(char *)
+      static void doit (void) { } // A::two::doit(void)
+    };
+
+    namespace
+    {
+      namespace
+      {
+       void doit3 (void) { } // A::doit3(void)
+       void doit3 (int a) { } // A::doit3(int)
+       void doit3 (char *a) { } // A::doit3(char *)
+
+       class three
+       {
+       public:
+         three (void) { } // A::three::three(void)
+         three (int a) { } // A::three::three(int)
+         three (char *a) { } // A::three::three(char *)
+         static void doit (void) { } // A::three::doit(void)
+       };
+      }
+    }
+  }
+}
+
+void
+doit (void)
+{
+  one a, b (3), c (static_cast<char *> (NULL));
+  one::doit ();
+  A::two d, e (3), f (static_cast<char *> (NULL));
+  A::two::doit ();
+  A::three g, h (3), i (static_cast<char *> (NULL));
+  A::three::doit ();
+  doit1 ();
+  doit1 (3);
+  doit1 (static_cast<char *> (NULL));
+  A::doit2 ();
+  A::doit2 (3);
+  A::doit2 (static_cast<char *> (NULL));
+  A::doit3 ();
+  A::doit3 (3);
+  A::doit3 (static_cast<char *> (NULL));
+}