Dodji's final patch for 45088 fixed the GDB regression, but as Jakub recently pointed out to me, we still end up with redundant DW_TAG_pointer_types in some cases, with one for pointer-to-class and the other for pointer-to-injected-class-name. We strip the injected-class-name in dwarf2out so that both pointers point to the same target type. To avoid this, let's strip the injected-class-name earlier in the front end.

Of course, this is what Dodji first proposed to do for this issue, and I steered him wrong...


Tested x86_64-pc-linux-gnu, applying to trunk.

commit 9a2db2e62c441147007f520a3983f6bc12a7385f
Author: Jason Merrill <ja...@redhat.com>
Date:   Wed Apr 11 11:05:28 2012 -0400

    	* decl.c (grokdeclarator): Strip the injected-class-name typedef
    	if we are building a declaration or compound type.

diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 8b22192..711ceef 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -8943,6 +8943,17 @@ grokdeclarator (const cp_declarator *declarator,
     error ("qualifiers are not allowed on declaration of %<operator %T%>",
 	   ctor_return_type);
 
+  /* If we're using the injected-class-name to form a compound type or a
+     declaration, replace it with the underlying class so we don't get
+     redundant typedefs in the debug output.  But if we are returning the
+     type unchanged, leave it alone so that it's available to
+     maybe_get_template_decl_from_type_decl.  */
+  if (CLASS_TYPE_P (type)
+      && DECL_SELF_REFERENCE_P (TYPE_NAME (type))
+      && type == TREE_TYPE (TYPE_NAME (type))
+      && (declarator || type_quals))
+    type = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
+
   type_quals |= cp_type_quals (type);
   type = cp_build_qualified_type_real
     (type, type_quals, ((typedef_decl && !DECL_ARTIFICIAL (typedef_decl)
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C
index 81bcb27..06db9dc 100644
--- a/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C
@@ -5,7 +5,7 @@
 
 struct A
 {
-    virtual ~A();
+    virtual ~A(){}
 };
 
 struct B : public A
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C
index b1c5401..d5463c0 100644
--- a/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C
@@ -6,7 +6,7 @@
 template<class T>
 struct A
 {
-    virtual ~A();
+    virtual ~A(){}
 };
 
 struct B : public A<int>

Reply via email to