@@ -20260,7 +20260,8 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die,
/* If TYPE is a typedef type variant, let's generate debug info
for the parent typedef which TYPE is a type of. */
- if (typedef_variant_p (type))
+ if (typedef_variant_p (type)
+ && !is_redundant_typedef (TYPE_NAME (type)))
{
if (TREE_ASM_WRITTEN (type))
return;
new file mode 100644
@@ -0,0 +1,28 @@
+// Origin: PR debug/45088
+// { dg-do compile }
+// { dg-options "-g -dA" }
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_pointer_type\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_byte_size\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type" 4 } }
+
+struct A
+{
+ virtual ~A();
+};
+
+struct B : public A
+{
+ virtual ~B(){}
+};
+
+struct C : public B
+{
+ A* a1;
+};
+
+int
+main()
+{
+ C c;
+ c.a1 = 0;
+ return 0;
+}
+
new file mode 100644
@@ -0,0 +1,29 @@
+// Origin: PR debug/45088
+// { dg-do compile }
+// { dg-options "-g -dA" }
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_pointer_type\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_byte_size\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type" 4 } }
+
+template<class T>
+struct A
+{
+ virtual ~A();
+};
+
+struct B : public A<int>
+{
+ virtual ~B(){}
+};
+
+struct C : public B
+{
+ A<int>* a1;
+};
+
+int
+main()
+{
+ C c;
+ c.a1 = 0;
+ return 0;
+}
+
Jason Merrill <jason@redhat.com> writes: [...] > What about just having gen_type_die_with_usage check is_redundant_typedef? Like the patch below? Bootrapped and tested on x86_64-unknown-linux-gnu against trunk. commit d9f6a81775a92638d2c50d8478b261dd71ee2442 Author: Dodji Seketeli <dodji@seketeli.org> Date: Thu Nov 11 23:42:51 2010 +0100 Fix PR debug/45088 gcc/ * dwarf2out.c (gen_type_die_with_usage): Don't try to generate a typedef DIE for an injected-class-name. Consider it as a class name instead. gcc/testsuite/ * g++.dg/debug/dwarf2/self-ref-1.C: New test. * g++.dg/debug/dwarf2/self-ref-2.C: Likewise.