summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/dwarf2out.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C28
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C29
5 files changed, 79 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0e3794355dd..571760f8f81 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-12-17 Dodji Seketeli <dodji@redhat.com>
+
+ * dwarf2out.c (gen_type_die_with_usage): Do not try to emit debug
+ info for a redundant typedef that has DECL_ORIGINAL_TYPE set. Use
+ that underlying type instead.
+
2010-12-16 Jan Hubicka <jh@suse.cz>
PR middle-end/44563
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index c9855270d38..1fa33001a77 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -20251,13 +20251,23 @@ gen_tagged_type_die (tree type,
static void
gen_type_die_with_usage (tree type, dw_die_ref context_die,
- enum debug_info_usage usage)
+ enum debug_info_usage usage)
{
struct array_descr_info info;
if (type == NULL_TREE || type == error_mark_node)
return;
+ if (TYPE_NAME (type) != NULL_TREE
+ && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
+ && is_redundant_typedef (TYPE_NAME (type))
+ && DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
+ /* The DECL of this type is a typedef we don't want to emit debug
+ info for but we want debug info for its underlying typedef.
+ This can happen for e.g, the injected-class-name of a C++
+ type. */
+ type = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
+
/* 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))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index df91d0995ad..8cfa5c0ebfb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-12-17 Dodji Seketeli <dodji@redhat.com>
+
+ * g++.dg/debug/dwarf2/self-ref-1.C: New test.
+ * g++.dg/debug/dwarf2/self-ref-2.C: Likewise.
+
2010-12-16 Sebastian Pop <sebastian.pop@amd.com>
PR tree-optimization/46924
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C
new file mode 100644
index 00000000000..81bcb2775aa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C
@@ -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;
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C
new file mode 100644
index 00000000000..b1c5401da07
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C
@@ -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;
+}
+
OpenPOWER on IntegriCloud