From 29f0c3b7b2b4fb46dd5ad29c72ae41a565f5ac60 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Tue, 2 Dec 2014 16:40:38 -0800 Subject: [PATCH] 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. --- gdb/ChangeLog | 5 +++ gdb/linespec.c | 7 +++- gdb/testsuite/ChangeLog | 7 ++++ gdb/testsuite/gdb.cp/anon-ns.cc | 69 +----------------------------- gdb/testsuite/gdb.cp/anon-ns.exp | 4 +- gdb/testsuite/gdb.cp/anon-ns2.cc | 91 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 113 insertions(+), 70 deletions(-) create mode 100644 gdb/testsuite/gdb.cp/anon-ns2.cc 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 + PR symtab/17602 + * linespec.c (iterate_name_matcher): Fix arguments to symbol_name_cmp. + +2014-12-02 Doug Evans + 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 + + 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 * 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 - -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 (NULL)); - one::doit (); - A::two d, e (3), f (static_cast (NULL)); - A::two::doit (); - A::three g, h (3), i (static_cast (NULL)); - A::three::doit (); - doit1 (); - doit1 (3); - doit1 (static_cast (NULL)); - A::doit2 (); - A::doit2 (3); - A::doit2 (static_cast (NULL)); - A::doit3 (); - A::doit3 (3); - A::doit3 (static_cast (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 . + + Contributed by Red Hat, originally written by Keith Seitz. */ + +#include + +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 (NULL)); + one::doit (); + A::two d, e (3), f (static_cast (NULL)); + A::two::doit (); + A::three g, h (3), i (static_cast (NULL)); + A::three::doit (); + doit1 (); + doit1 (3); + doit1 (static_cast (NULL)); + A::doit2 (); + A::doit2 (3); + A::doit2 (static_cast (NULL)); + A::doit3 (); + A::doit3 (3); + A::doit3 (static_cast (NULL)); +} -- 2.7.4