commit d54f5671e190a5c0ca8fd1ff070372bf20eb42a8 Author: cmoller Date: Wed Apr 21 17:33:51 2010 +0000 PR 9167 * cp-valprint.c (cp_print_value_fields): Replaced obstack_base() method of popping recursion-detection stack with a method based on obstack_object_size(). * gdb.cp/Makefile.in (EXECUTABLES): Added pr9167. * gdb.cp/pr9167.cc: New file. * gdb.cp/pr9167.exp: New file. ### a/gdb/ChangeLog ### b/gdb/ChangeLog ## -1,3 +1,10 @@ +2010-04-21 Chris Moller + + PR 9167 + * cp-valprint.c (cp_print_value_fields): Replaced obstack_base() + method of popping recursion-detection stack with a method based on + obstack_object_size(). + 2010-04-21 Pierre Muller PR pascal/11492. ## -3184,7 +3191,7 @@ addr_bit. Adjust LOAD_ADDR sign for cross-arch inferiors. 2010-02-17 Tristan Gingold - Petr HluzĂ­n + Petr Hluzín * avr-tdep.c (avr_scan_prologue): Convert an if statement to a gdb_assert. Fix info->size for SIG prologue. Index: gdb-7.1/gdb/cp-valprint.c =================================================================== --- gdb-7.1.orig/gdb/cp-valprint.c 2010-06-28 20:21:53.000000000 +0200 +++ gdb-7.1/gdb/cp-valprint.c 2010-06-28 20:22:16.000000000 +0200 @@ -186,14 +186,13 @@ cp_print_value_fields (struct type *type fprintf_filtered (stream, ""); else { - void *statmem_obstack_top = NULL; + int obstack_initial_size = 0; void *stat_array_obstack_top = NULL; 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); if (last_set_recurse != recurse) { @@ -321,8 +320,19 @@ cp_print_value_fields (struct type *type if (dont_print_statmem == 0) { - 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 (last_set_recurse != recurse) { @@ -555,7 +565,6 @@ cp_print_static_field (struct type *type 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: gdb-7.1/gdb/testsuite/gdb.cp/pr9167.cc =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb-7.1/gdb/testsuite/gdb.cp/pr9167.cc 2010-06-28 20:22:16.000000000 +0200 @@ -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: gdb-7.1/gdb/testsuite/gdb.cp/pr9167.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb-7.1/gdb/testsuite/gdb.cp/pr9167.exp 2010-06-28 20:22:16.000000000 +0200 @@ -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 = }, }" +