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.
This commit is contained in:
Felix Willgerodt
2021-06-23 15:56:24 +02:00
parent 5c046e0e63
commit 81e33ce289
3 changed files with 94 additions and 1 deletions

View File

@@ -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 ())

View File

@@ -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 ();
}

View File

@@ -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."
}