diff options
author | Felix Willgerodt <felix.willgerodt@intel.com> | 2021-06-23 15:56:24 +0200 |
---|---|---|
committer | Felix Willgerodt <felix.willgerodt@intel.com> | 2021-07-13 15:29:29 +0200 |
commit | 81e33ce2894678a60ed4d5e4471cd6eb968056c2 (patch) | |
tree | 4114dbe7fe5cdbd8475835806ea01aab7152752b | |
parent | 5c046e0e631dc98faec53d99c76f9d3ef44da75c (diff) | |
download | binutils-gdb-81e33ce2894678a60ed4d5e4471cd6eb968056c2.tar.gz |
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 <felix.willgerodt@intel.com>
* dwarf2/read.c (determine_prefix): Return an empty prefix if the
parent is a subprogram.
gdb/testsuite/ChangeLog:
2021-06-23 Felix Willgerodt <felix.willgerodt@intel.com>
* gdb.cp/nested-class-func-class.cc: New file.
* gdb.cp/nested-class-func-class.exp: New file.
-rw-r--r-- | gdb/dwarf2/read.c | 2 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/nested-class-func-class.cc | 46 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/nested-class-func-class.exp | 47 |
3 files changed, 94 insertions, 1 deletions
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 <http://www.gnu.org/licenses/>. */ + +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 <http://www.gnu.org/licenses/>. + +# 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." +} |