commit 27fead82006aba0eb90dd61e2195e4463ba70708 Author: Richard Henderson Date: Wed Aug 4 16:29:16 2010 -0700 PR debug/45171 * dwarf2out.c (gen_typedef_die): Don't re-generate the die of an is_naming_typedef_decl. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 95de468..651642a 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -19785,22 +19785,24 @@ gen_typedef_die (tree decl, dw_die_ref context_die) type = TREE_TYPE (decl); if (is_naming_typedef_decl (TYPE_NAME (type))) - /* - Here, we are in the case of decl being a typedef naming - an anonymous type, e.g: + { + /* Here, we are in the case of decl being a typedef naming + an anonymous type, e.g: typedef struct {...} foo; - In that case TREE_TYPE (decl) is not a typedef variant - type and TYPE_NAME of the anonymous type is set to the - TYPE_DECL of the typedef. This construct is emitted by - the C++ FE. - - TYPE is the anonymous struct named by the typedef - DECL. As we need the DW_AT_type attribute of the - DW_TAG_typedef to point to the DIE of TYPE, let's - generate that DIE right away. add_type_attribute - called below will then pick (via lookup_type_die) that - anonymous struct DIE. */ - gen_tagged_type_die (type, context_die, DINFO_USAGE_DIR_USE); + In that case TREE_TYPE (decl) is not a typedef variant + type and TYPE_NAME of the anonymous type is set to the + TYPE_DECL of the typedef. This construct is emitted by + the C++ FE. + + TYPE is the anonymous struct named by the typedef + DECL. As we need the DW_AT_type attribute of the + DW_TAG_typedef to point to the DIE of TYPE, let's + generate that DIE right away. add_type_attribute + called below will then pick (via lookup_type_die) that + anonymous struct DIE. */ + if (!TREE_ASM_WRITTEN (type)) + gen_tagged_type_die (type, context_die, DINFO_USAGE_DIR_USE); + } } add_type_attribute (type_die, type, TREE_READONLY (decl), diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C b/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C new file mode 100644 index 0000000..2879f60 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C @@ -0,0 +1,10 @@ +// Origin: PR debug/45171 +// { dg-options "-g -dA -fno-eliminate-unused-debug-types" } +// { dg-do compile } + +// There should be 2 real instances of byte_size -- one for the +// struct and one for "int". The other two instances are from +// the comments in the .debug_abbrev section. +// { dg-final { scan-assembler-times "DW_AT_byte_size" 4 } } + +typedef struct { int a, b; } x;