diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 96c9f3095cc200bcca8d3200489a75fdaadf7553..70dc8ddda7285c2bafefa5e684c8f496a596e9f5 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,9 @@ +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. + 1999-04-01 Jim Blandy <jimb@zwingli.cygnus.com> * cplus-dem.c: Attempt to handle overflows in counts with some diff --git a/libiberty/cplus-dem.c b/libiberty/cplus-dem.c index 2e509d891572d525fa41391ac6014db8578f8cfe..1ebcb7da60027920debf15f55a19c75f060f46da 100644 --- a/libiberty/cplus-dem.c +++ b/libiberty/cplus-dem.c @@ -1505,36 +1505,43 @@ demangle_template_value_parm (work, mangled, s, tk) } 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); + if (**mangled == 'Q') + success = demangle_qualified (work, mangled, s, + /*isfuncname=*/0, + /*append=*/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) + int symbol_len = consume_count (mangled); + if (symbol_len == -1) + return -1; + if (symbol_len == 0) + string_appendn (s, "0", 1); + else { - string_append (s, q); - free (q); + 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); } - else - string_append (s, p); - free (p); + *mangled += symbol_len; } - *mangled += symbol_len; } return success; @@ -3040,11 +3047,6 @@ do_type (work, mangled, result) member = **mangled == 'M'; (*mangled)++; - if (!isdigit ((unsigned char)**mangled) && **mangled != 't') - { - success = 0; - break; - } string_append (&decl, ")"); string_prepend (&decl, SCOPE_STRING (work)); @@ -3060,7 +3062,13 @@ do_type (work, mangled, result) string_prependn (&decl, *mangled, n); *mangled += n; } - else + 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); @@ -3074,6 +3082,12 @@ do_type (work, mangled, result) else break; } + else + { + success = 0; + break; + } + string_prepend (&decl, "("); if (member) { diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected index 95dc4dda671a18630f76406e7ad7c6d3558ea0a3..ad04d116d8b4da8b23034456d1bb306320d6aa54 100644 --- a/libiberty/testsuite/demangle-expected +++ b/libiberty/testsuite/demangle-expected @@ -2466,3 +2466,7 @@ basic_string<char,string_char_traits<char>,allocator>::unLink(void) _Utf390_1__1_9223372036854775807__9223372036854775 _Utf390_1__1_9223372036854775807__9223372036854775 +# +--format=gnu +call__H1Z4Test_RX01_t1C2ZX01PMX01FPX01i_vQ2X016output +C<Test, Test::output> call<Test>(Test &)