From 81e33ce2894678a60ed4d5e4471cd6eb968056c2 Mon Sep 17 00:00:00 2001 From: Felix Willgerodt Date: Wed, 23 Jun 2021 15:56:24 +0200 Subject: [PATCH] gdb, dwarf: Don't follow the parent of a subprogram to get a prefix. During prefix resolution, if the parent is a subprogram, there is no need to go to the parent of the subprogram. The DIE will be local. For a program like: ~~~ class F1 { public: int a; int vvv () { class F2 { int f; }; F2 abcd; return 1; } }; ~~~ The class F2 should not be seen as a member of F1. Before: ~~~ (gdb) ptype abcd type = class F1::F2 { private: int f; } ~~~ After: ~~~ (gdb) ptype abcd type = class F2 { private: int f; } ~~~ gdb/ChangeLog: 2021-06-23 Felix Willgerodt * dwarf2/read.c (determine_prefix): Return an empty prefix if the parent is a subprogram. gdb/testsuite/ChangeLog: 2021-06-23 Felix Willgerodt * gdb.cp/nested-class-func-class.cc: New file. * gdb.cp/nested-class-func-class.exp: New file. --- gdb/dwarf2/read.c | 2 +- .../gdb.cp/nested-class-func-class.cc | 46 ++++++++++++++++++ .../gdb.cp/nested-class-func-class.exp | 47 +++++++++++++++++++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.cp/nested-class-func-class.cc create mode 100644 gdb/testsuite/gdb.cp/nested-class-func-class.exp diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index a13a53ebc46..9292e52c000 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -22657,7 +22657,7 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu) && (dwarf2_name (parent, cu) != NULL)) return dwarf2_name (parent, cu); } - return determine_prefix (parent, cu); + return ""; case DW_TAG_enumeration_type: parent_type = read_type_die (parent, cu); if (parent_type->is_declared_class ()) diff --git a/gdb/testsuite/gdb.cp/nested-class-func-class.cc b/gdb/testsuite/gdb.cp/nested-class-func-class.cc new file mode 100644 index 00000000000..a8d255fcd93 --- /dev/null +++ b/gdb/testsuite/gdb.cp/nested-class-func-class.cc @@ -0,0 +1,46 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2021 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 . */ + +int +foo () +{ + class F1 + { + public: + int a; + int + vvv () + { + class F2 + { + int f; + }; + F2 abcd; + return 1; /* BP 1 */ + } + }; + + F1 x; + int a = x.vvv (); + return a; /* BP 2 */ +} + +int +main () +{ + return foo (); +} diff --git a/gdb/testsuite/gdb.cp/nested-class-func-class.exp b/gdb/testsuite/gdb.cp/nested-class-func-class.exp new file mode 100644 index 00000000000..584c47f3a22 --- /dev/null +++ b/gdb/testsuite/gdb.cp/nested-class-func-class.exp @@ -0,0 +1,47 @@ +# Copyright 2021 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 . + +# Regression test for type printing of private nested classes. + +if {[skip_cplus_tests]} { continue } + +load_lib "cp-support.exp" + +standard_testfile .cc + +if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} { + return -1 +} + +if {![runto_main]} { + return -1 +} + +gdb_breakpoint [gdb_get_line_number "BP 1"] +gdb_breakpoint [gdb_get_line_number "BP 2"] +gdb_continue_to_breakpoint "BP 1" + +cp_test_ptype_class \ + "F2" "" "class" "F2" \ + { + { field private "int f;" } + } + +gdb_continue_to_breakpoint "BP 2" + +with_test_prefix "BP 2" { + gdb_test "ptype F1::F2" "There is no field named F2" + gdb_test "ptype F2" "No symbol \"F2\" in current context." +} -- 2.30.2