+2018-03-23 Keith Seitz <keiths@redhat.com>
+
+ PR c++/22968
+ * dwarf2read.c (scan_partial_symbols): Scan structs/classes for
+ nested type definitions for C++, too.
+
2018-03-23 Tom Tromey <tom@tromey.com>
* machoread.c (struct oso_el): Add a constructor. Don't define as
{
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;
+2018-03-23 Keith Seitz <keiths@redhat.com>
+
+ 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 <andrew.burgess@embecosm.com>
* gdb.arch/amd64-disp-step-avx.S: Add '_start' label.
--- /dev/null
+/* 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 <http://www.gnu.org/licenses/>. */
+
+#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 ();
+}
--- /dev/null
+/* 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 <http://www.gnu.org/licenses/>. */
+
+#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<int> (6)
+ + foobar<char> ('c');
+}
--- /dev/null
+# 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 <http://www.gnu.org/licenses/>.
+
+# 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<int>::Foo" "type = struct Foo.*"
+gdb_test "ptype foobar<int>::Bar" "type = struct Bar.*"
+gdb_test "ptype foobar<int>::Baz" "type = struct Baz.*"
+gdb_test "ptype foobar<char>::Foo" "type = struct Foo.*"
+gdb_test "ptype foobar<char>::Bar" "type = struct Bar.*"
+gdb_test "ptype foobar<char>::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>(int)::Foo::doit" message
+gdb_breakpoint "foobar<int>(int)::Bar::doit" message
+gdb_breakpoint "foobar<int>(int)::Baz::doit" message
+gdb_breakpoint "foobar<char>(int)::Foo::doit" message
+gdb_breakpoint "foobar<char>(int)::Bar::doit" message
+gdb_breakpoint "foobar<char>(int)::Baz::doit" message
--- /dev/null
+/* 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 <http://www.gnu.org/licenses/>. */
+
+/* A template that defines subtypes. */
+
+template <typename T>
+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 ();
+};