---
 gcc/pdbout.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/gcc/pdbout.c b/gcc/pdbout.c
index d9ad659cd9a..0f5315f7f07 100644
--- a/gcc/pdbout.c
+++ b/gcc/pdbout.c
@@ -2175,7 +2175,33 @@ get_tree_name (tree t)
   static const char anon_ns[] = "<anonymous>";
 
   if (TREE_CODE (t) == FUNCTION_DECL)
-    name = xstrdup (IDENTIFIER_POINTER (DECL_NAME (t)));
+    {
+      if (DECL_CXX_CONSTRUCTOR_P (t) || DECL_CXX_DESTRUCTOR_P (t))
+       {
+         tree ctx = DECL_CONTEXT (t);
+         const char *basename;
+
+         if (!ctx || !TYPE_NAME (ctx)
+             || TREE_CODE (TYPE_NAME (ctx)) != TYPE_DECL)
+           return NULL;
+
+         basename = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (ctx)));
+
+         if (DECL_CXX_CONSTRUCTOR_P (t))
+           name = xstrdup (basename);
+         else
+           {
+             name = (char *) xmalloc (strlen (basename) + 2);
+
+             name[0] = '~';
+             name[1] = 0;
+
+             strcat (name, basename);
+           }
+       }
+      else
+       name = xstrdup (IDENTIFIER_POINTER (DECL_NAME (t)));
+    }
   else if (TYPE_NAME (t) && TREE_CODE (TYPE_NAME (t)) == IDENTIFIER_NODE)
     name = xstrdup (IDENTIFIER_POINTER (TYPE_NAME (t)));
   else if (TYPE_NAME (t) && TREE_CODE (TYPE_NAME (t)) == TYPE_DECL
-- 
2.26.2

Reply via email to