diff options
author | Chris Moller <cmoller@cygnus> | 2010-04-21 17:33:54 +0000 |
---|---|---|
committer | Chris Moller <cmoller@cygnus> | 2010-04-21 17:33:54 +0000 |
commit | 0b66f3173809e422f3dfbab2a8afff7fb9fc0ef3 (patch) | |
tree | d01b4a9ce867591f4a06247baf0d6f481cffeb0e | |
parent | 34a7d6c6d367a964e24ea7f0f8c868cc531736f8 (diff) | |
download | gdb-0b66f3173809e422f3dfbab2a8afff7fb9fc0ef3.zip gdb-0b66f3173809e422f3dfbab2a8afff7fb9fc0ef3.tar.gz gdb-0b66f3173809e422f3dfbab2a8afff7fb9fc0ef3.tar.bz2 |
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.
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/cp-valprint.c | 23 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/Makefile.in | 2 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/pr9167.cc | 36 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/pr9167.exp | 31 |
6 files changed, 100 insertions, 9 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f5a2453..0ea0d8a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2010-04-21 Chris Moller <cmoller@redhat.com> + + 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 <muller@ics.u-strasbg.fr> PR pascal/11492. @@ -3184,7 +3191,7 @@ addr_bit. Adjust LOAD_ADDR sign for cross-arch inferiors. 2010-02-17 Tristan Gingold <gingold@adacore.com> - Petr HluzĂn <petr.hluzin@gmail.com> + Petr Hluzín <petr.hluzin@gmail.com> * avr-tdep.c (avr_scan_prologue): Convert an if statement to a gdb_assert. Fix info->size for SIG prologue. diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c index d3d94d9..c865ba4 100644 --- a/gdb/cp-valprint.c +++ b/gdb/cp-valprint.c @@ -186,14 +186,13 @@ cp_print_value_fields (struct type *type, struct type *real_type, fprintf_filtered (stream, "<No data fields>"); 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, struct type *real_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), diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index cc07b6c..a096256 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +Wed Apr 21 12:47:26 2010 Chris Moller <cmoller@redhat.com> + + PR 9167 + * gdb.cp/Makefile.in (EXECUTABLES): Added pr9167. + * gdb.cp/pr9167.cc: New file. + * gdb.cp/pr9167.exp: New file. + + 2010-04-21 Pierre Muller <muller@ics.u-strasbg.fr> PR pascal/11492. diff --git a/gdb/testsuite/gdb.cp/Makefile.in b/gdb/testsuite/gdb.cp/Makefile.in index 721094d..5b00a61 100644 --- a/gdb/testsuite/gdb.cp/Makefile.in +++ b/gdb/testsuite/gdb.cp/Makefile.in @@ -5,7 +5,7 @@ EXECUTABLES = ambiguous annota2 anon-union cplusfuncs cttiadd \ 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 pr10687 + pr1072 pr10687 pr9167 all info install-info dvi install uninstall installcheck check: @echo "Nothing to be done for $@..." diff --git a/gdb/testsuite/gdb.cp/pr9167.cc b/gdb/testsuite/gdb.cp/pr9167.cc new file mode 100644 index 0000000..a0c5002 --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr9167.cc @@ -0,0 +1,36 @@ +#include <iostream> + +template<typename DATA> +struct ATB +{ + int data; + ATB() : data(0) {} +}; + + +template<typename DATA, + typename DerivedType > +class A : public ATB<DATA> +{ +public: + static DerivedType const DEFAULT_INSTANCE; +}; + +template<typename DATA, typename DerivedType> +const DerivedType A<DATA, DerivedType>::DEFAULT_INSTANCE; + +class B : public A<int, B> +{ + +}; + +int main() +{ + B b; + // If this if-block is removed then GDB shall + // not infinitely recurse when trying to print b. + + return 0; // marker +} + + diff --git a/gdb/testsuite/gdb.cp/pr9167.exp b/gdb/testsuite/gdb.cp/pr9167.exp new file mode 100644 index 0000000..7d05ae9 --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr9167.exp @@ -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 <http://www.gnu.org/licenses/>. + +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" "{<A<int, B>> = {<ATB<int>> = {data = 0}, static DEFAULT_INSTANCE = <optimized out>}, <No data fields>}" + |