diff options
author | dodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-12-17 10:39:21 +0000 |
---|---|---|
committer | dodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-12-17 10:39:21 +0000 |
commit | fd9fff6dd77c70be7bed8256a7b52c378d239eaf (patch) | |
tree | 8598995a9270af7853b3d4b0110123f2918a1296 | |
parent | 5a793d2d0a936e90ec5db7e968707a100e65849f (diff) | |
download | gcc-fd9fff6dd77c70be7bed8256a7b52c378d239eaf.tar.gz |
Fix for PR debug/45088
gcc/
* 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.
gcc/testsuite/
* g++.dg/debug/dwarf2/self-ref-1.C: New test.
* g++.dg/debug/dwarf2/self-ref-2.C: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@167976 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C | 28 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C | 29 |
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; +} + |