From 1e72f30922ed89d198c064d3c464601d5846a916 Mon Sep 17 00:00:00 2001
From: pme <pme@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 31 Jan 2002 01:03:05 +0000
Subject: [PATCH] 2002-01-30  Phil Edwards  <pme@gcc.gnu.org>

	* cp-demangle.c (cp_demangle_type):  Do not protect with IN_LIBGCC2.
	(cplus_demangle_v3):  Mimic __cxa_demangle and fall back on
	cp_demangle_type.
	* testsuite/demangle-expected:  New gnu-v3 test.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@49353 138bc75d-0d04-0410-961f-82ee72b054a4
---
 libiberty/ChangeLog                   |  7 +++++++
 libiberty/cp-demangle.c               | 17 ++++++++---------
 libiberty/testsuite/demangle-expected |  4 ++++
 3 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 59f48d459768..e014b50a9ca9 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,10 @@
+2002-01-30  Phil Edwards  <pme@gcc.gnu.org>
+
+	* cp-demangle.c (cp_demangle_type):  Do not protect with IN_LIBGCC2.
+	(cplus_demangle_v3):  Mimic __cxa_demangle and fall back on
+	cp_demangle_type.
+	* testsuite/demangle-expected:  New gnu-v3 test.
+
 2002-01-22  Momchil Velikov  <velco@fadata.bg>
 
 	* configure.in (variable detection): Use arrays of unspecified
diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c
index 457a09f4c19e..a412e8878514 100644
--- a/libiberty/cp-demangle.c
+++ b/libiberty/cp-demangle.c
@@ -938,10 +938,8 @@ static status_t demangle_discriminator
   PARAMS ((demangling_t, int));
 static status_t cp_demangle
   PARAMS ((const char *, dyn_string_t, int));
-#ifdef IN_LIBGCC2
 static status_t cp_demangle_type
   PARAMS ((const char*, dyn_string_t));
-#endif
 
 /* When passed to demangle_bare_function_type, indicates that the
    function's return type is not encoded before its parameter types.  */
@@ -3533,14 +3531,13 @@ cp_demangle (name, result, style)
    dyn_string_t.  On success, returns STATUS_OK.  On failiure, returns
    an error message, and the contents of RESULT are unchanged.  */
 
-#ifdef IN_LIBGCC2
 static status_t
 cp_demangle_type (type_name, result)
      const char* type_name;
      dyn_string_t result;
 {
   status_t status;
-  demangling_t dm = demangling_new (type_name);
+  demangling_t dm = demangling_new (type_name, 0);
   
   if (dm == NULL)
     return STATUS_ALLOCATION_FAILED;
@@ -3571,6 +3568,7 @@ cp_demangle_type (type_name, result)
   return status;
 }
 
+#ifdef IN_LIBGCC2
 extern char *__cxa_demangle PARAMS ((const char *, char *, size_t *, int *));
 
 /* ia64 ABI-mandated entry point in the C++ runtime library for performing
@@ -3693,14 +3691,15 @@ cplus_demangle_v3 (mangled)
   dyn_string_t demangled;
   status_t status;
 
-  /* If this isn't a mangled name, don't pretend to demangle it.  */
-  if (strncmp (mangled, "_Z", 2) != 0)
-    return NULL;
-
   /* Create a dyn_string to hold the demangled name.  */
   demangled = dyn_string_new (0);
   /* Attempt the demangling.  */
-  status = cp_demangle ((char *) mangled, demangled, 0);
+  if (mangled[0] == '_' && mangled[1] == 'Z')
+    /* Appears to be a function or variable name.  */
+    status = cp_demangle (mangled, demangled, 0);
+  else
+    /* Try to demangle it as the name of a type.  */
+    status = cp_demangle_type (mangled, demangled);
 
   if (STATUS_NO_ERROR (status))
     /* Demangling succeeded.  */
diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected
index 3a828472de11..e1becc3db609 100644
--- a/libiberty/testsuite/demangle-expected
+++ b/libiberty/testsuite/demangle-expected
@@ -2590,3 +2590,7 @@ Prim.i(int, boolean, byte, double, float, char, java.lang.String, short, long)
 --format=hp
 _Utf58_0_1__1_2147483647__2147483648
 _Utf58_0_1__1_2147483647__2147483648
+#
+--format=gnu-v3
+St9bad_alloc
+std::bad_alloc
-- 
GitLab