aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2014-12-02 16:40:38 -0800
committerDoug Evans <dje@google.com>2014-12-02 16:40:38 -0800
commit29f0c3b7b2b4fb46dd5ad29c72ae41a565f5ac60 (patch)
treee662757950de0395148f81d793eaecd1f6640cbd
parent72998fb37a6a4bc684ba86228e81f27c7a7609ca (diff)
downloadgdb-29f0c3b7b2b4fb46dd5ad29c72ae41a565f5ac60.zip
gdb-29f0c3b7b2b4fb46dd5ad29c72ae41a565f5ac60.tar.gz
gdb-29f0c3b7b2b4fb46dd5ad29c72ae41a565f5ac60.tar.bz2
PR symtab/17602
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.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/linespec.c7
-rw-r--r--gdb/testsuite/ChangeLog7
-rw-r--r--gdb/testsuite/gdb.cp/anon-ns.cc69
-rw-r--r--gdb/testsuite/gdb.cp/anon-ns.exp4
-rw-r--r--gdb/testsuite/gdb.cp/anon-ns2.cc91
6 files changed, 113 insertions, 70 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4ca9ac1..9888369 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
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
* dwarf2read.c (find_slot_in_mapped_hash): Use cp_remove_params
to strip parameters.
diff --git a/gdb/linespec.c b/gdb/linespec.c
index 82384ca..af958dc 100644
--- a/gdb/linespec.c
+++ b/gdb/linespec.c
@@ -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. */
}
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index f0bcbf8..17b0146 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -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.
diff --git a/gdb/testsuite/gdb.cp/anon-ns.cc b/gdb/testsuite/gdb.cp/anon-ns.cc
index 26bc307..31b05c9 100644
--- a/gdb/testsuite/gdb.cp/anon-ns.cc
+++ b/gdb/testsuite/gdb.cp/anon-ns.cc
@@ -17,76 +17,11 @@
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;
}
diff --git a/gdb/testsuite/gdb.cp/anon-ns.exp b/gdb/testsuite/gdb.cp/anon-ns.exp
index 0cbb71b..f8d4970 100644
--- a/gdb/testsuite/gdb.cp/anon-ns.exp
+++ b/gdb/testsuite/gdb.cp/anon-ns.exp
@@ -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
index 0000000..0d29d9f
--- /dev/null
+++ b/gdb/testsuite/gdb.cp/anon-ns2.cc
@@ -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));
+}