diff options
author | samuel <samuel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-06-28 06:08:27 +0000 |
---|---|---|
committer | samuel <samuel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-06-28 06:08:27 +0000 |
commit | 597f928d28fabf85f17fac0cf70e5b8dce817d15 (patch) | |
tree | 892461fc48beb346dd981ae892015c248e88017d /libiberty | |
parent | 8e89b2d8cce0a30b975e6f9e1ea5e0413516f7ff (diff) | |
download | gcc-597f928d28fabf85f17fac0cf70e5b8dce817d15.tar.gz |
* cp-demangle.c (demangle_special_name): Swap base and derived
class when demangling construction vtables.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@34751 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libiberty')
-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 5bac397881e..ad5c214e647 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 651f7aa2704..b658b40d9ff 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) { |