diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2226e42bc2..b543904db2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2018-03-23 Keith Seitz + + PR c++/22968 + * dwarf2read.c (scan_partial_symbols): Scan structs/classes for + nested type definitions for C++, too. + 2018-03-23 Tom Tromey * machoread.c (struct oso_el): Add a constructor. Don't define as diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 6100438049..93ecf407e3 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -9116,7 +9116,8 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc, { add_partial_symbol (pdi, cu); } - if (cu->language == language_rust && pdi->has_children) + if ((cu->language == language_rust + || cu->language == language_cplus) && pdi->has_children) scan_partial_symbols (pdi->die_child, lowpc, highpc, set_addrmap, cu); break; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 1412c689da..a359571d61 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2018-03-23 Keith Seitz + + PR c++/22968 + * gdb.cp/subtypes.exp: New file. + * gdb.cp/subtypes.h: New file. + * gdb.cp/subtypes.cc: New file. + * gdb.cp/subtypes-2.cc: New file. + 2018-03-23 Andrew Burgess * gdb.arch/amd64-disp-step-avx.S: Add '_start' label. diff --git a/gdb/testsuite/gdb.cp/subtypes-2.cc b/gdb/testsuite/gdb.cp/subtypes-2.cc new file mode 100644 index 0000000000..3426443a4d --- /dev/null +++ b/gdb/testsuite/gdb.cp/subtypes-2.cc @@ -0,0 +1,30 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2018 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 . */ + +#include "subtypes.h" + +struct Outer::Inner +{ + int doit () { return 1; } + struct InnerInner {} p; + int a; +}; + +Outer::Outer (): p (new Inner), e (Oenum::OC) +{ + p->a = p->doit (); +} diff --git a/gdb/testsuite/gdb.cp/subtypes.cc b/gdb/testsuite/gdb.cp/subtypes.cc new file mode 100644 index 0000000000..e95490c8b0 --- /dev/null +++ b/gdb/testsuite/gdb.cp/subtypes.cc @@ -0,0 +1,42 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2018 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 . */ + +#include "subtypes.h" + +int +main (int argc, char *argv[]) +{ + struct Foo + { + int doit (void) { return 1111; } + } foo; + + struct Bar + { + int doit (void) { return 2222; } + } bar; + + struct Baz + { + int doit (void) { return 3333; } + } baz; + Outer o; + o.e = Outer::Oenum::OA; + + return foo.doit () + bar.doit () + baz.doit () + foobar (6) + + foobar ('c'); +} diff --git a/gdb/testsuite/gdb.cp/subtypes.exp b/gdb/testsuite/gdb.cp/subtypes.exp new file mode 100644 index 0000000000..6c5f7f845c --- /dev/null +++ b/gdb/testsuite/gdb.cp/subtypes.exp @@ -0,0 +1,52 @@ +# Copyright 2018 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 . + +# Test for subtype definitions, i.e., types defined in classes, functions, +# etc. + +if {[skip_cplus_tests]} { continue } + +load_lib "cp-support.exp" + +standard_testfile .cc subtypes-2.cc + +if {[prepare_for_testing "failed to prepare" $testfile \ + [list $srcfile $srcfile2] {debug c++}]} { + return -1 +} + +gdb_test "ptype Outer::Inner::InnerInner" \ + "type = struct Outer::Inner::InnerInner.*" +gdb_test "ptype Outer::Inner" "type = struct Outer::Inner.*" +gdb_test "ptype main::Foo" "type = struct Foo.*" +gdb_test "ptype main::Bar" "type = struct Bar.*" +gdb_test "ptype main::Baz" "type = struct Baz.*" +gdb_test "ptype Outer::Oenum" "type = enum class Outer::Oenum.*" +gdb_test "ptype foobar::Foo" "type = struct Foo.*" +gdb_test "ptype foobar::Bar" "type = struct Bar.*" +gdb_test "ptype foobar::Baz" "type = struct Baz.*" +gdb_test "ptype foobar::Foo" "type = struct Foo.*" +gdb_test "ptype foobar::Bar" "type = struct Bar.*" +gdb_test "ptype foobar::Baz" "type = struct Baz.*" +gdb_breakpoint "Outer::Inner::doit" message +gdb_breakpoint "main::Foo::doit" message +gdb_breakpoint "main::Bar::doit" message +gdb_breakpoint "main::Baz::doit" message +gdb_breakpoint "foobar(int)::Foo::doit" message +gdb_breakpoint "foobar(int)::Bar::doit" message +gdb_breakpoint "foobar(int)::Baz::doit" message +gdb_breakpoint "foobar(int)::Foo::doit" message +gdb_breakpoint "foobar(int)::Bar::doit" message +gdb_breakpoint "foobar(int)::Baz::doit" message diff --git a/gdb/testsuite/gdb.cp/subtypes.h b/gdb/testsuite/gdb.cp/subtypes.h new file mode 100644 index 0000000000..5f29c2674e --- /dev/null +++ b/gdb/testsuite/gdb.cp/subtypes.h @@ -0,0 +1,50 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2018 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 . */ + +/* A template that defines subtypes. */ + +template +T foobar (int arg) +{ + struct Foo + { + T doit (void) { return 1; } + } foo; + + struct Bar + { + T doit (void) { return 2; } + } bar; + + struct Baz + { + T doit (void) { return 3; } + } baz; + + return arg - foo.doit () - bar.doit () - baz.doit (); +} + +/* A structure that defines other types. */ + +struct Outer +{ + enum class Oenum { OA, OB, OC, OD }; + struct Inner; + Inner *p; + Oenum e; + Outer (); +};