PR other/43838
authorJakub Jelinek <jakub@redhat.com>
Thu, 10 Jun 2010 15:42:01 +0000 (15:42 +0000)
committerJakub Jelinek <jakub@redhat.com>
Thu, 10 Jun 2010 15:42:01 +0000 (15:42 +0000)
* cp-demangle.c (struct d_print_info): Add flush_count field.
(d_print_init): Initialize it to 0.
(d_print_flush): Increment it.
(d_print_comp): If needed flush before appending ", ".  Only
decrement dpi->len if no flushes happened during the recursive
call.
* testsuite/demangle-expected: Add a test for this.

libiberty/ChangeLog
libiberty/cp-demangle.c
libiberty/testsuite/demangle-expected

index 744f6ae1aefcc0b4e3d4e591089e6ce31611f3d4..4c0cba85cef3b3fbbbd730f499e499f9c3dc937e 100644 (file)
@@ -1,3 +1,14 @@
+2010-06-10  Jakub Jelinek  <jakub@redhat.com>
+
+       PR other/43838
+       * cp-demangle.c (struct d_print_info): Add flush_count field.
+       (d_print_init): Initialize it to 0.
+       (d_print_flush): Increment it.
+       (d_print_comp): If needed flush before appending ", ".  Only
+       decrement dpi->len if no flushes happened during the recursive
+       call.
+       * testsuite/demangle-expected: Add a test for this.
+
 2010-06-03  Joern Rennecke <joern.rennecke@embecosm.com>
            Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
index 6db1f78be3c8653556e70e324bc8929a1bfbdd86..d2d15e9b91aa83e85156b4340414766a8517bc89 100644 (file)
@@ -302,6 +302,8 @@ struct d_print_info
   /* The current index into any template argument packs we are using
      for printing.  */
   int pack_index;
+  /* Number of d_print_flush calls so far.  */
+  unsigned long int flush_count;
 };
 
 #ifdef CP_DEMANGLE_DEBUG
@@ -3285,6 +3287,7 @@ d_print_init (struct d_print_info *dpi, int options,
   dpi->last_char = '\0';
   dpi->templates = NULL;
   dpi->modifiers = NULL;
+  dpi->flush_count = 0;
 
   dpi->callback = callback;
   dpi->opaque = opaque;
@@ -3314,6 +3317,7 @@ d_print_flush (struct d_print_info *dpi)
   dpi->buf[dpi->len] = '\0';
   dpi->callback (dpi->buf, dpi->len, dpi->opaque);
   dpi->len = 0;
+  dpi->flush_count++;
 }
 
 /* Append characters and buffers for printing.  */
@@ -4047,12 +4051,18 @@ d_print_comp (struct d_print_info *dpi,
       if (d_right (dc) != NULL)
        {
          size_t len;
+         unsigned long int flush_count;
+         /* Make sure ", " isn't flushed by d_append_string, otherwise
+            dpi->len -= 2 wouldn't work.  */
+         if (dpi->len >= sizeof (dpi->buf) - 2)
+           d_print_flush (dpi);
          d_append_string (dpi, ", ");
          len = dpi->len;
+         flush_count = dpi->flush_count;
          d_print_comp (dpi, d_right (dc));
          /* If that didn't print anything (which can happen with empty
             template argument packs), remove the comma and space.  */
-         if (dpi->len == len)
+         if (dpi->flush_count == flush_count && dpi->len == len)
            dpi->len -= 2;
        }
       return;
index ef84bc113a84e7c3491554339887949e1559b7c0..15a0fe75509dd1f4b9800fa0d5f698dd99fb45ef 100644 (file)
@@ -3951,6 +3951,9 @@ decltype (({parm#1}.(operator-))()) h<A>(A)
 --format=gnu-v3
 _Z1fDn
 f(decltype(nullptr))
+--format=gnu-v3
+_ZN5aaaaa6bbbbbb5cccccIN23ddddddddddddddddddddddd3eeeENS2_4ffff16ggggggggggggggggENS0_9hhhhhhhhhES6_S6_S6_S6_S6_S6_S6_EE
+aaaaa::bbbbbb::ccccc<ddddddddddddddddddddddd::eee, ddddddddddddddddddddddd::ffff::gggggggggggggggg, aaaaa::bbbbbb::hhhhhhhhh, aaaaa::bbbbbb::hhhhhhhhh, aaaaa::bbbbbb::hhhhhhhhh, aaaaa::bbbbbb::hhhhhhhhh, aaaaa::bbbbbb::hhhhhhhhh, aaaaa::bbbbbb::hhhhhhhhh, aaaaa::bbbbbb::hhhhhhhhh, aaaaa::bbbbbb::hhhhhhhhh>
 #
 # Ada (GNAT) tests.
 #