merge from gcc

This commit is contained in:
DJ Delorie 2003-12-01 23:54:49 +00:00
parent 13570a3db5
commit 24afc00d03
3 changed files with 30 additions and 4 deletions

View file

@ -1,3 +1,13 @@
2003-11-29 Ian Lance Taylor <ian@wasabisystems.com>
* cp-demangle.c (d_demangle): Only return success if we consumed
the entire demangled string.
(is_ctor_or_dtor): Likewise.
* testsuite/demangle-expected: Revert one part of 2003-06-26 patch
to restore expected result of EDG test case to original expected
result.
2003-11-26 Ian Lance Taylor <ian@wasabisystems.com>
* cp-demangle.c (struct d_print_mod): Add templates field.

View file

@ -3324,7 +3324,7 @@ d_print_cast (dpi, dc)
/* It appears that for a templated cast operator, we need to put
the template parameters in scope for the operator name, but
not for the parameters. The effect is that we need to handle
the template printing here. FIXME: Verify this. */
the template printing here. */
hold_dpm = dpi->modifiers;
dpi->modifiers = NULL;
@ -3456,6 +3456,11 @@ d_demangle (mangled, options, palc)
else
dc = d_type (&di);
/* If we didn't consume the entire mangled string, then we didn't
successfully demangle it. */
if (d_peek_char (&di) != '\0')
dc = NULL;
#ifdef CP_DEMANGLE_DEBUG
if (dc == NULL)
printf ("failed demangling\n");
@ -3657,7 +3662,7 @@ is_ctor_or_dtor (mangled, ctor_kind, dtor_kind)
dc = d_mangled_name (&di, 1);
if (dc == NULL)
if (dc == NULL || d_peek_char (&di) != '\0')
return 0;
while (dc != NULL)

View file

@ -2889,10 +2889,21 @@ _Z1fP1cIPFiiEE
f(c<int (*)(int)>*)
#
# This caused an infinite loop.
# We still don't demangle this correctly, but at least we don't hang.
#
# This is generated by an EDG compiler (kcc 4.0). To demangle it
# correctly, I believe that we have to understand that the J37J deep
# in the string somehow refers back to the type starting 37 characters
# in from some starting point, so that it winds up being the type
# starting with 41THandle.... However, lacking a spec for EDG
# demangling, it's hard to implement this.
#
# In the meantime, this symbol can be successfully demangled in GNU
# mode. Of course the result is more or less nonsense, but an older
# version of g++ would indeed generate this mangled name given the
# appropriate input, so the demangling is correct.
--format=auto
__CPR212____ct__Q3_3std141list__tm__128_Q2_3edm41THandle__tm__26_Q2_4emid15EMparticleChunkQ2_3std68allocator__tm__51_Q2_3edmJ37J14const_iteratorFRCQ3_3std18list__tm__7_Z1ZZ2Z8iterator
__CPR212____ct__Q3_3std141list__tm__128_Q2_3edm41THandle__tm__26_Q2_4emid15EMparticleChunkQ2_3std68allocator__tm__51_Q2_3edmJ37J14const_iteratorFRCQ3_3std18list__tm__7_Z1ZZ2Z8iterator
_Z1ZZ2Z::__CPR212____ct__Q3_3std141list__tm__128_Q2_3edm41THandle__tm__26_Q2_4emid15EMparticleChunkQ2_3std68allocator__tm__51_Q2_3edmJ37J14const_iteratorFRCQ3_3std18list__tm(iterator)
#
# This used to cause a crash. It doesn't follow the C++ encoding so
# the demangled name should be identical to the original symbol name.