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