gdb
authorTom Tromey <tromey@redhat.com>
Wed, 9 Nov 2011 19:50:15 +0000 (19:50 +0000)
committerTom Tromey <tromey@redhat.com>
Wed, 9 Nov 2011 19:50:15 +0000 (19:50 +0000)
PR c++/13342:
* valops.c (value_full_object): Return early if real type is
smaller than the enclosing type.
gdb/testsuite
* gdb.cp/destrprint.exp: New file.
* gdb.cp/destrprint.cc: New file.

gdb/ChangeLog
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.cp/destrprint.cc [new file with mode: 0644]
gdb/testsuite/gdb.cp/destrprint.exp [new file with mode: 0644]
gdb/valops.c

index ebe03be..d489d08 100644 (file)
@@ -1,3 +1,9 @@
+2011-11-09  Tom Tromey  <tromey@redhat.com>
+
+       PR c++/13342:
+       * valops.c (value_full_object): Return early if real type is
+       smaller than the enclosing type.
+
 2011-11-08  Yao Qi  <yao@codesourcery.com>
 
        * amd64-tdep.c (amd64_relocate_instruction): Make it static.
index d4380fb..58000b6 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-09  Tom Tromey  <tromey@redhat.com>
+
+       * gdb.cp/destrprint.exp: New file.
+       * gdb.cp/destrprint.cc: New file.
+
 2011-11-08  Meador Inge  <meadori@codesourcery.com>
 
        * gdb.arch/thumb-prologue.c (switch_stack_to_same): New test function.
diff --git a/gdb/testsuite/gdb.cp/destrprint.cc b/gdb/testsuite/gdb.cp/destrprint.cc
new file mode 100644 (file)
index 0000000..0def8e4
--- /dev/null
@@ -0,0 +1,36 @@
+
+class Base
+{
+public:
+  int x, y;
+
+  Base() : x(0), y(1)
+  {
+  }
+
+  virtual ~Base()
+  {
+    // Break here.
+  }
+};
+
+class Derived : public Base
+{
+public:
+  int z;
+
+  Derived() : Base(), z(23)
+  {
+  }
+
+  ~Derived()
+  {
+  }
+};
+
+int main()
+{
+  Derived d;
+
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.cp/destrprint.exp b/gdb/testsuite/gdb.cp/destrprint.exp
new file mode 100644 (file)
index 0000000..e2dc437
--- /dev/null
@@ -0,0 +1,42 @@
+# Copyright 2011 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/>.
+
+set testfile destrprint
+set srcfile ${testfile}.cc
+if [prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}] {
+    return -1
+}
+
+if ![runto_main] {
+    untested destrprint
+    return -1
+}
+
+gdb_breakpoint [gdb_get_line_number "Break here"]
+gdb_continue_to_breakpoint "Break here"
+
+gdb_test "up" "#1 .*~Derived.*" "go up to ~Derived"
+
+foreach setting {on off} {
+    gdb_test_no_output "set print object $setting"
+
+    # Here we are in ~Derived.  At this point, Derived has been
+    # destroyed, so *this looks like a Base.  But, the static type of
+    # *this is still Derived, and printing it should show us all the
+    # fields, regardless of what "set print object" says.
+    gdb_test "print *this" \
+       " = .*, z = 23." \
+       "print *this with print object = $setting"
+}
index cb39677..29d1fbd 100644 (file)
@@ -3581,6 +3581,13 @@ value_full_object (struct value *argp,
   if (!real_type || real_type == value_enclosing_type (argp))
     return argp;
 
+  /* In a destructor we might see a real type that is a superclass of
+     the object's type.  In this case it is better to leave the object
+     as-is.  */
+  if (full
+      && TYPE_LENGTH (real_type) < TYPE_LENGTH (value_enclosing_type (argp)))
+    return argp;
+
   /* If we have the full object, but for some reason the enclosing
      type is wrong, set it.  */
   /* pai: FIXME -- sounds iffy */