* 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.
This commit is contained in:
Chris Moller 2010-04-21 17:33:54 +00:00
parent 34a7d6c6d3
commit 0b66f31738
6 changed files with 100 additions and 9 deletions

View File

@ -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.

View File

@ -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),

View File

@ -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.

View File

@ -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 $@..."

View File

@ -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
}

View File

@ -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>}"