merge from gcc
authorDJ Delorie <dj@redhat.com>
Mon, 18 Feb 2002 23:01:39 +0000 (23:01 +0000)
committerDJ Delorie <dj@redhat.com>
Mon, 18 Feb 2002 23:01:39 +0000 (23:01 +0000)
libiberty/ChangeLog
libiberty/cplus-dem.c
libiberty/testsuite/demangle-expected

index 08cf00d048cbbb7737d736cbc1a62e88c5154a32..f3ef42903ca487d304d4bca032744b1e9ed46970 100644 (file)
@@ -1,3 +1,14 @@
+2002-02-18  Carlo Wood  <carlo@gnu.org>
+
+       PR c++/5390
+       * cplus-dem.c (demangle_integral_value): Accept multi-digit
+       numbers that do not start with an underscore; This is needed
+       for integer template parameters. This doesn't break anything
+       because multi-digit numbers are never followed by a digit.
+       * testsuite/demangle-expected: Corrected all mangled test
+       cases with multi-digit template parameters: g++ 2.95.x does
+       not generate underscores around these parameters.
+
 2002-02-05  Jason Merrill  <jason@redhat.com>
 
        * cplus-dem.c (flags): Add DMGL_VERBOSE
index 4e60b2cfcbd11436685825f77410d04535ef666d..710b69d9c7a2b6afeeea0e46821b1815a50255ab 100644 (file)
@@ -1787,7 +1787,7 @@ demangle_integral_value (work, mangled, s)
 
       /* By default, we let the number decide whether we shall consume an
         underscore.  */
-      int consume_following_underscore = 0;
+      int multidigit_without_leading_underscore = 0;
       int leave_following_underscore = 0;
 
       success = 0;
@@ -1804,23 +1804,34 @@ demangle_integral_value (work, mangled, s)
             `m'-prefix we must do it here, using consume_count and
             adjusting underscores: we have to consume the underscore
             matching the prepended one.  */
-         consume_following_underscore = 1;
+         multidigit_without_leading_underscore = 1;
          string_appendn (s, "-", 1);
          (*mangled) += 2;
        }
       else if (**mangled == '_')
        {
          /* Do not consume a following underscore;
-            consume_following_underscore will consume what should be
+            multidigit_without_leading_underscore will consume what should be
             consumed.  */
          leave_following_underscore = 1;
        }
+      else
+       {
+         /* Since consume_count_with_underscores does not handle
+            multi-digit numbers that do not start with an underscore,
+            and this number can be an integer template parameter,
+            we have to call consume_count. */
+         multidigit_without_leading_underscore = 1;
+         /* These multi-digit numbers never end on an underscore,
+            so if there is one then don't eat it. */
+         leave_following_underscore = 1;
+       }
 
       /* We must call consume_count if we expect to remove a trailing
         underscore, since consume_count_with_underscores expects
         the leading underscore (that we consumed) if it is to handle
         multi-digit numbers.  */
-      if (consume_following_underscore)
+      if (multidigit_without_leading_underscore)
        value = consume_count (mangled);
       else
        value = consume_count_with_underscores (mangled);
@@ -1838,7 +1849,7 @@ demangle_integral_value (work, mangled, s)
             is wrong.  If other (arbitrary) cases are followed by an
             underscore, we need to do something more radical.  */
 
-         if ((value > 9 || consume_following_underscore)
+         if ((value > 9 || multidigit_without_leading_underscore)
              && ! leave_following_underscore
              && **mangled == '_')
            (*mangled)++;
index e1becc3db6097378878c90613bb838ced7813785..3e90d9f1eaa9eacaee7a912811699c85d1888805 100644 (file)
@@ -2476,15 +2476,15 @@ fn__FPQ21n1cPMQ21n1cFPQ21n1c_i
 fn(n::c *, int (n::c::*)(n::c *))
 #
 --format=gnu
-f__FGt3Bar1i21i
+f__FGt3Bar1i2G1i
 f(Bar<2>, i)
 #
 --format=gnu
-f__FGt3Bar1i_21_i
+f__FGt3Bar1i21i
 f(Bar<21>, int)
 #
 --format=gnu
-f__FGt3Bar1i24XY_t
+f__FGt3Bar1i2G4XY_t
 f(Bar<2>, XY_t)
 #
 --format=gnu
@@ -2492,11 +2492,11 @@ foo__H1Zt2TA2ZRCiZt2NA1Ui9_X01_i
 int foo<TA<int const &, NA<9> > >(TA<int const &, NA<9> >)
 #
 --format=gnu
-foo__H1Zt2TA2ZcZt2NA1Ui_20__X01_i
+foo__H1Zt2TA2ZcZt2NA1Ui20_X01_i
 int foo<TA<char, NA<20> > >(TA<char, NA<20> >)
 #
 --format=gnu
-foo__H1Zt2TA2ZiZt8N___A___1Ui_99__X01_i
+foo__H1Zt2TA2ZiZt8N___A___1Ui99_X01_i
 int foo<TA<int, N___A___<99> > >(TA<int, N___A___<99> >)
 #
 --format=gnu
@@ -2532,7 +2532,7 @@ __opi__t2TA2ZiZt8N___A___1i_m99_
 TA<int, N___A___<-99> >::operator int(void)
 #
 --format=gnu
-foo___bar__baz_____H1Zt2TA2ZiZt8N___A___1i_99__X01_i
+foo___bar__baz_____H1Zt2TA2ZiZt8N___A___1i99_X01_i
 int foo___bar__baz___<TA<int, N___A___<99> > >(TA<int, N___A___<99> >)
 #
 --format=gnu
This page took 0.03169 seconds and 4 git commands to generate.