Files
binutils-gdb/gdb/testsuite/gdb.cp/nested-class-func-class.exp
Felix Willgerodt 81e33ce289 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.
2021-07-13 15:29:29 +02:00

48 lines
1.3 KiB
Plaintext

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