summaryrefslogtreecommitdiff
path: root/libiberty
diff options
context:
space:
mode:
authorsamuel <samuel@138bc75d-0d04-0410-961f-82ee72b054a4>2000-06-28 06:08:27 +0000
committersamuel <samuel@138bc75d-0d04-0410-961f-82ee72b054a4>2000-06-28 06:08:27 +0000
commit597f928d28fabf85f17fac0cf70e5b8dce817d15 (patch)
tree892461fc48beb346dd981ae892015c248e88017d /libiberty
parent8e89b2d8cce0a30b975e6f9e1ea5e0413516f7ff (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--libiberty/cp-demangle.c27
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)
{