aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/cp-valprint.c10
-rw-r--r--gdb/testsuite/ChangeLog7
-rw-r--r--gdb/testsuite/gdb.cp/classes.cc13
-rw-r--r--gdb/testsuite/gdb.cp/classes.exp5
5 files changed, 33 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index caa6484..1d18881 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2017-10-26 Patrick Frants <osscontribute@gmail.com>
+
+ * cp-valprint.c (cp_print_value_fields): Use obstack_blank_fast
+ to rewind obstack.
+
2017-10-26 Pedro Alves <palves@redhat.com>
* remote.c (remote_async_terminal_ours_p): Delete.
diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c
index fb9bfd9..609dabb 100644
--- a/gdb/cp-valprint.c
+++ b/gdb/cp-valprint.c
@@ -371,13 +371,9 @@ cp_print_value_fields (struct type *type, struct type *real_type,
if (obstack_final_size > statmem_obstack_initial_size)
{
/* In effect, a pop of the printed-statics stack. */
-
- void *free_to_ptr =
- (char *) obstack_next_free (&dont_print_statmem_obstack) -
- (obstack_final_size - statmem_obstack_initial_size);
-
- obstack_free (&dont_print_statmem_obstack,
- free_to_ptr);
+ size_t shrink_bytes
+ = statmem_obstack_initial_size - obstack_final_size;
+ obstack_blank_fast (&dont_print_statmem_obstack, shrink_bytes);
}
if (last_set_recurse != recurse)
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 0c6c93a..0e2bc23 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2017-10-26 Patrick Frants <osscontribute@gmail.com>
+
+ * gdb.cp/classes.exp (test_static_members): Test printing
+ Outer::instance.
+ * gdb.cp/classes.c (struct Inner, struct Outer): New.
+ (Inner::instance, Outer::instance): New.
+
2017-10-24 Pedro Alves <palves@redhat.com>
* gdb.base/new-ui.exp (do_test): Split "delete all breakpoints on
diff --git a/gdb/testsuite/gdb.cp/classes.cc b/gdb/testsuite/gdb.cp/classes.cc
index 50f0740..a650846 100644
--- a/gdb/testsuite/gdb.cp/classes.cc
+++ b/gdb/testsuite/gdb.cp/classes.cc
@@ -665,6 +665,19 @@ void use_methods ()
base1 b (3);
}
+struct Inner
+{
+ static Inner instance;
+};
+
+struct Outer
+{
+ Inner inner;
+ static Outer instance;
+};
+
+Inner Inner::instance;
+Outer Outer::instance;
int
main()
diff --git a/gdb/testsuite/gdb.cp/classes.exp b/gdb/testsuite/gdb.cp/classes.exp
index 9e2630a..374b632 100644
--- a/gdb/testsuite/gdb.cp/classes.exp
+++ b/gdb/testsuite/gdb.cp/classes.exp
@@ -602,6 +602,11 @@ proc test_static_members {} {
gdb_test "print cnsi" \
"{x = 30, y = 40, static null = {x = 0, y = 0, static null = <same as static member of an already seen type>, static yy = {z = 5, static xx = {x = 1, y = 2, static null = <same as static member of an already seen type>, static yy = <same as static member of an already seen type>}}}, static yy = <same as static member of an already seen type>}" \
"print cnsi with static members"
+
+ # Another case of infinite recursion.
+ gdb_test "print Outer::instance" \
+ "{inner = {static instance = {static instance = <same as static member of an already seen type>}}, static instance = {inner = {static instance = {static instance = <same as static member of an already seen type>}}, static instance = <same as static member of an already seen type>}}" \
+ "print recursive static member"
}
proc do_tests {} {