+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.
/* 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;
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");
dc = d_mangled_name (&di, 1);
- if (dc == NULL)
+ if (dc == NULL || d_peek_char (&di) != '\0')
return 0;
while (dc != NULL)
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.