This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
C++ patch for name-demangling
- To: egcs-patches at egcs dot cygnus dot com
- Subject: C++ patch for name-demangling
- From: Mark Mitchell <mark at codesourcery dot com>
- Date: Sun, 11 Apr 1999 18:48:55 -0700
- Reply-to: mark at codesourcery dot com
Now that we don't crash wehn compiling templates with
pointer-to-member parameters, we must demangle them.
--
Mark Mitchell mark@codesourcery.com
CodeSourcery, LLC http://www.codesourcery.com
1999-04-11 Mark Mitchell <mark@codesourcery.com>
* cplus-dem.c (demangle_template_value_parm): Handle
pointers-to-members.
(do_type): Handle template parameters as qualifiers.
Index: libiberty/testsuite/demangle-expected
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/libiberty/testsuite/demangle-expected,v
retrieving revision 1.1
diff -c -p -r1.1 demangle-expected
*** demangle-expected 1999/04/05 14:28:59 1.1
--- demangle-expected 1999/04/12 01:38:17
*************** basic_string<char,string_char_traits<cha
*** 2466,2468 ****
--- 2466,2472 ----
_Utf390_1__1_9223372036854775807__9223372036854775
_Utf390_1__1_9223372036854775807__9223372036854775
+ #
+ --format=gnu
+ call__H1Z4Test_RX01_t1C2ZX01PMX01FPX01i_vQ2X016output
+ C<Test, Test::output> call<Test>(Test &)
Index: libiberty/cplus-dem.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/libiberty/cplus-dem.c,v
retrieving revision 1.41
diff -c -p -r1.41 cplus-dem.c
*** cplus-dem.c 1999/04/09 09:01:35 1.41
--- cplus-dem.c 1999/04/12 01:38:16
*************** demangle_template_value_parm (work, mang
*** 1505,1540 ****
}
else if (tk == tk_pointer || tk == tk_reference)
{
! int symbol_len = consume_count (mangled);
! if (symbol_len == -1)
! return -1;
! if (symbol_len == 0)
! string_appendn (s, "0", 1);
else
{
! char *p = xmalloc (symbol_len + 1), *q;
! strncpy (p, *mangled, symbol_len);
! p [symbol_len] = '\0';
! /* We use cplus_demangle here, rather than
! internal_cplus_demangle, because the name of the entity
! mangled here does not make use of any of the squangling
! or type-code information we have built up thus far; it is
! mangled independently. */
! q = cplus_demangle (p, work->options);
! if (tk == tk_pointer)
! string_appendn (s, "&", 1);
! /* FIXME: Pointer-to-member constants should get a
! qualifying class name here. */
! if (q)
{
! string_append (s, q);
! free (q);
}
! else
! string_append (s, p);
! free (p);
}
- *mangled += symbol_len;
}
return success;
--- 1505,1547 ----
}
else if (tk == tk_pointer || tk == tk_reference)
{
! if (**mangled == 'Q')
! success = demangle_qualified (work, mangled, s,
! /*isfuncname=*/0,
! /*append=*/1);
else
{
! int symbol_len = consume_count (mangled);
! if (symbol_len == -1)
! return -1;
! if (symbol_len == 0)
! string_appendn (s, "0", 1);
! else
{
! char *p = xmalloc (symbol_len + 1), *q;
! strncpy (p, *mangled, symbol_len);
! p [symbol_len] = '\0';
! /* We use cplus_demangle here, rather than
! internal_cplus_demangle, because the name of the entity
! mangled here does not make use of any of the squangling
! or type-code information we have built up thus far; it is
! mangled independently. */
! q = cplus_demangle (p, work->options);
! if (tk == tk_pointer)
! string_appendn (s, "&", 1);
! /* FIXME: Pointer-to-member constants should get a
! qualifying class name here. */
! if (q)
! {
! string_append (s, q);
! free (q);
! }
! else
! string_append (s, p);
! free (p);
}
! *mangled += symbol_len;
}
}
return success;
*************** do_type (work, mangled, result)
*** 3040,3050 ****
member = **mangled == 'M';
(*mangled)++;
- if (!isdigit ((unsigned char)**mangled) && **mangled != 't')
- {
- success = 0;
- break;
- }
string_append (&decl, ")");
string_prepend (&decl, SCOPE_STRING (work));
--- 3047,3052 ----
*************** do_type (work, mangled, result)
*** 3060,3068 ****
string_prependn (&decl, *mangled, n);
*mangled += n;
}
! else
{
string temp;
string_init (&temp);
success = demangle_template (work, mangled, &temp,
NULL, 1, 1);
--- 3062,3076 ----
string_prependn (&decl, *mangled, n);
*mangled += n;
}
! else if (**mangled == 'X' || **mangled == 'Y')
{
string temp;
+ do_type (work, mangled, &temp);
+ string_prepends (&decl, &temp);
+ }
+ else if (**mangled == 't')
+ {
+ string temp;
string_init (&temp);
success = demangle_template (work, mangled, &temp,
NULL, 1, 1);
*************** do_type (work, mangled, result)
*** 3074,3079 ****
--- 3082,3093 ----
else
break;
}
+ else
+ {
+ success = 0;
+ break;
+ }
+
string_prepend (&decl, "(");
if (member)
{