+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
/* 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;
`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);
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)++;
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
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
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