Index: cp-valprint.c =================================================================== RCS file: /cvs/src/src/gdb/cp-valprint.c,v retrieving revision 1.64 diff -u -r1.64 cp-valprint.c --- cp-valprint.c 8 Feb 2010 18:04:16 -0000 1.64 +++ cp-valprint.c 16 Apr 2010 03:24:22 -0000 @@ -157,7 +157,7 @@ int fields_seen = 0; CHECK_TYPEDEF (type); - + if (recurse == 0 && obstack_object_size (&dont_print_statmem_obstack) > 0) obstack_free (&dont_print_statmem_obstack, NULL); @@ -180,14 +180,10 @@ fprintf_filtered (stream, ""); else { - void *statmem_obstack_top = NULL; + int obstack_initial_size = 0; if (dont_print_statmem == 0) - { - /* Set the current printed-statics stack top. */ - statmem_obstack_top - = obstack_next_free (&dont_print_statmem_obstack); - } + obstack_initial_size = obstack_object_size (&dont_print_statmem_obstack); for (i = n_baseclasses; i < len; i++) { @@ -307,9 +303,19 @@ if (dont_print_statmem == 0) { - /* In effect, a pop of the printed-statics stack. */ - if (obstack_object_size (&dont_print_statmem_obstack) > 0) - obstack_free (&dont_print_statmem_obstack, statmem_obstack_top); + int obstack_final_size = + obstack_object_size (&dont_print_statmem_obstack); + + if (obstack_final_size > obstack_initial_size) { + /* In effect, a pop of the printed-statics stack. */ + + void * free_to_ptr = + obstack_next_free (&dont_print_statmem_obstack) - + (obstack_final_size - obstack_initial_size); + + obstack_free (&dont_print_statmem_obstack, + free_to_ptr); + } } if (options->pretty) @@ -508,6 +514,7 @@ const struct value_print_options *options) { struct value_print_options opts; + if (TYPE_CODE (type) == TYPE_CODE_STRUCT) { CORE_ADDR *first_dont_print; @@ -533,7 +540,6 @@ addr = value_address (val); obstack_grow (&dont_print_statmem_obstack, (char *) &addr, sizeof (CORE_ADDR)); - CHECK_TYPEDEF (type); cp_print_value_fields (type, value_enclosing_type (val), value_contents_all (val), Index: testsuite/gdb.cp/Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.cp/Makefile.in,v retrieving revision 1.9 diff -u -r1.9 Makefile.in --- testsuite/gdb.cp/Makefile.in 8 Feb 2010 18:27:53 -0000 1.9 +++ testsuite/gdb.cp/Makefile.in 16 Apr 2010 03:24:24 -0000 @@ -5,7 +5,7 @@ derivation inherit local member-ptr method misc \ overload ovldbreak ref-typ ref-typ2 templates userdef virtfunc namespace \ ref-types ref-params method2 pr9594 gdb2495 virtfunc2 pr9067 \ - pr1072 + pr1072 pr9167 all info install-info dvi install uninstall installcheck check: @echo "Nothing to be done for $@..." Index: testsuite/gdb.cp/pr9167.cc =================================================================== RCS file: testsuite/gdb.cp/pr9167.cc diff -N testsuite/gdb.cp/pr9167.cc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ testsuite/gdb.cp/pr9167.cc 16 Apr 2010 03:24:25 -0000 @@ -0,0 +1,36 @@ +#include + +template +struct ATB +{ + int data; + ATB() : data(0) {} +}; + + +template +class A : public ATB +{ +public: + static DerivedType const DEFAULT_INSTANCE; +}; + +template +const DerivedType A::DEFAULT_INSTANCE; + +class B : public A +{ + +}; + +int main() +{ + B b; + // If this if-block is removed then GDB shall + // not infinitely recurse when trying to print b. + + return 0; // marker +} + + Index: testsuite/gdb.cp/pr9167.exp =================================================================== RCS file: testsuite/gdb.cp/pr9167.exp diff -N testsuite/gdb.cp/pr9167.exp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ testsuite/gdb.cp/pr9167.exp 16 Apr 2010 03:24:25 -0000 @@ -0,0 +1,31 @@ +#Copyright 2010 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 . + +set testfile pr9167 +set srcfile ${testfile}.cc +if [prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}] { + return -1 +} + +if ![runto_main] then { + fail "Can't run to main" + return +} + +gdb_breakpoint [gdb_get_line_number "marker"] +gdb_continue_to_breakpoint "marker" + +gdb_test "p b" "{> = {> = {data = 0}, static DEFAULT_INSTANCE = }, }" +