diff options
author | Alex Samuel <samuel@codesourcery.com> | 2000-06-28 06:08:27 +0000 |
---|---|---|
committer | Alex Samuel <samuel@gcc.gnu.org> | 2000-06-28 06:08:27 +0000 |
commit | 229b8ec7c6b16a944b450ee8aa7d7a08b4fdfa8a (patch) | |
tree | 892461fc48beb346dd981ae892015c248e88017d | |
parent | 06772c7d0e9076d373ab6b1a623c617ea565b699 (diff) | |
download | gcc-229b8ec7c6b16a944b450ee8aa7d7a08b4fdfa8a.zip gcc-229b8ec7c6b16a944b450ee8aa7d7a08b4fdfa8a.tar.gz gcc-229b8ec7c6b16a944b450ee8aa7d7a08b4fdfa8a.tar.bz2 |
cp-demangle.c (demangle_special_name): Swap base and derived class when demangling construction vtables.
* cp-demangle.c (demangle_special_name): Swap base and derived
class when demangling construction vtables.
From-SVN: r34751
-rw-r--r-- | libiberty/ChangeLog | 5 | ||||
-rw-r--r-- | libiberty/cp-demangle.c | 27 |
2 files changed, 28 insertions, 4 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 5bac397..ad5c214 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,8 @@ +2000-06-27 Alex Samuel <samuel@codesourcery.com> + + * cp-demangle.c (demangle_special_name): Swap base and derived + class when demangling construction vtables. + 2000-06-21 Alex Samuel <samuel@codesourcery.com> * cp-demangle.c: Don't include ctype.h. diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c index 651f7aa..b658b40 100644 --- a/libiberty/cp-demangle.c +++ b/libiberty/cp-demangle.c @@ -1682,19 +1682,38 @@ demangle_special_name (dm) /* TC is a special g++ mangling for a construction vtable. */ if (!flag_strict) { + dyn_string_t derived_type; + advance_char (dm); RETURN_IF_ERROR (result_append (dm, "construction vtable for ")); + + /* Demangle the derived type off to the side. */ + RETURN_IF_ERROR (result_push (dm)); RETURN_IF_ERROR (demangle_type (dm)); + derived_type = (dyn_string_t) result_pop (dm); + /* Demangle the offset. */ number = dyn_string_new (4); if (number == NULL) - return STATUS_ALLOCATION_FAILED; + { + dyn_string_delete (derived_type); + return STATUS_ALLOCATION_FAILED; + } demangle_number_literally (dm, number, 10, 1); /* Demangle the underscore separator. */ - RETURN_IF_ERROR (demangle_char (dm, '_')); + status = demangle_char (dm, '_'); + /* Demangle the base type. */ - RETURN_IF_ERROR (result_append (dm, "-in-")); - RETURN_IF_ERROR (demangle_type (dm)); + if (STATUS_NO_ERROR (status)) + status = demangle_type (dm); + + /* Emit the derived type. */ + if (STATUS_NO_ERROR (status)) + status = result_append (dm, "-in-"); + if (STATUS_NO_ERROR (status)) + status = result_append_string (dm, derived_type); + dyn_string_delete (derived_type); + /* Don't display the offset unless in verbose mode. */ if (flag_verbose) { |