+2010-04-22  Chris Moller  <cmoller@redhat.com>
+
+       * cp-valprint.c (cp_print_value_fields): Replaced obstack_base()
+        method of popping recursion-detection stack with a method based on
+        obstack_object_size().  (Similar to the PR9167 patch below, but for
+       the static array obstack rather than the static member obstack.)
+
 2010-04-22  H.J. Lu  <hongjiu.lu@intel.com>
 
        * amd64-linux-nat.c (amd64_linux_gregset64_reg_offset): Removed.
 
     fprintf_filtered (stream, "<No data fields>");
   else
     {
-      int obstack_initial_size = 0;
-      void *stat_array_obstack_top = NULL;
+      int statmem_obstack_initial_size = 0;
+      int stat_array_obstack_initial_size = 0;
       
       if (dont_print_statmem == 0)
        {
-         obstack_initial_size =
+         statmem_obstack_initial_size =
            obstack_object_size (&dont_print_statmem_obstack);
 
          if (last_set_recurse != recurse)
            {
-             stat_array_obstack_top
-               = obstack_next_free (&dont_print_stat_array_obstack);
+             stat_array_obstack_initial_size =
+               obstack_object_size (&dont_print_stat_array_obstack);
              last_set_recurse = recurse;
            }
        }
          int obstack_final_size =
            obstack_object_size (&dont_print_statmem_obstack);
 
-         if (obstack_final_size > obstack_initial_size) {
+         if (obstack_final_size > statmem_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_final_size - statmem_obstack_initial_size);
 
            obstack_free (&dont_print_statmem_obstack,
                          free_to_ptr);
 
          if (last_set_recurse != recurse)
            {
-             if (obstack_object_size (&dont_print_stat_array_obstack) > 0) 
-               obstack_free (&dont_print_stat_array_obstack,
-                             stat_array_obstack_top);
+             int obstack_final_size =
+               obstack_object_size (&dont_print_stat_array_obstack);
+             
+             if (obstack_final_size > stat_array_obstack_initial_size)
+               {
+                 void *free_to_ptr =
+                   obstack_next_free (&dont_print_stat_array_obstack) -
+                   (obstack_final_size - stat_array_obstack_initial_size);
+
+                 obstack_free (&dont_print_stat_array_obstack,
+                               free_to_ptr);
+               }
              last_set_recurse = -1;
            }
        }