http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47939
Richard Guenther <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2011.03.01 14:11:28 CC| |jsm28 at gcc dot gnu.org Component|debug |c Ever Confirmed|0 |1 --- Comment #1 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-03-01 14:11:28 UTC --- Happens because when finishing the TYPE_DECL if (is_naming_typedef_decl (decl)) /* We want that all subsequent calls to lookup_type_die with TYPE in argument yield the DW_TAG_typedef we have just created. */ equate_type_number_to_die (type, type_die); returns false. Which is because is_cxx () is returning false. The VAR_DECL itself is not using the type-def id: <var_decl 0x7ffff5b49000 george type <record_type 0x7ffff5b2a498 _George readonly type_0 SI size <integer_cst 0x7ffff7ed36e0 constant 32> unit size <integer_cst 0x7ffff7ed33e8 constant 4> align 32 symtab -172776352 alias set -1 canonical type 0x7ffff5b2a498 fields <field_decl 0x7ffff5b36130 dummy type <integer_type 0x7ffff7ee6498 int> SI file t.c line 1 col 36 size <integer_cst 0x7ffff7ed36e0 32> unit size <integer_cst 0x7ffff7ed33e8 4> align 32 offset_align 128 offset <integer_cst 0x7ffff7ed3410 constant 0> bit offset <integer_cst 0x7ffff7ed3b68 constant 0> context <record_type 0x7ffff5b2a3f0 _George>> context <translation_unit_decl 0x7ffff7efca10 D.1588>> readonly asm_written public static common SI file t.c line 2 col 10 size <integer_cst 0x7ffff7ed36e0 32> unit size <integer_cst 0x7ffff7ed33e8 4> align 32 context <translation_unit_decl 0x7ffff7efca10 D.1588> (mem/s/u/c:SI (symbol_ref:DI ("george") <var_decl 0x7ffff5b49000 george>) [0 george+0 S4 A32])> already grokdeclarator creates this by re-applying qualifiers via if (!flag_gen_aux_info && (TYPE_QUALS (element_type))) type = TYPE_MAIN_VARIANT (type); type_quals = ((constp ? TYPE_QUAL_CONST : 0) | (restrictp ? TYPE_QUAL_RESTRICT : 0) | (volatilep ? TYPE_QUAL_VOLATILE : 0) | ENCODE_QUAL_ADDR_SPACE (address_space)); and 6010 type = c_build_qualified_type (type, type_quals); thereby stripping all uses of typedef ids. Thus, it doesn't seem to distinguish between qualifiers applied at the declaration and qualifiers that are part of the typedef. c_build_qualified_type would handle choosing a variant with the same name just fine - but we feed it the main variant instead of the original type. Index: gcc/c-decl.c =================================================================== --- gcc/c-decl.c (revision 170589) +++ gcc/c-decl.c (working copy) @@ -6007,7 +6007,7 @@ grokdeclarator (const struct c_declarato /* An uninitialized decl with `extern' is a reference. */ int extern_ref = !initialized && storage_class == csc_extern; - type = c_build_qualified_type (type, type_quals); + type = c_build_qualified_type (declspecs->type, type_quals); /* C99 6.2.2p7: It is invalid (compile-time undefined behavior) to create an 'extern' declaration for a fixes this particular testcase. Joseph?