https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101533
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jason at gcc dot gnu.org Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org --- Comment #8 from Richard Biener <rguenth at gcc dot gnu.org> --- Re-confirmed. We can simply elide the assert, the recursion is harmless since in this case TREE_ASM_WRITTEN (name) is set already via (gdb) bt #0 gen_typedef_die (decl=<type_decl 0x7ffff69da500 a>, context_die=<dw_die_ref 0x7ffff6834050 DW_TAG_class_type <parent=0x7ffff6834000 DW_TAG_compile_unit>>) at ../../src/gcc/gcc/dwarf2out.cc:26265 #1 0x00000000016685a4 in gen_decl_die (decl=<type_decl 0x7ffff69da500 a>, origin=<tree 0x0>, ctx=0x7fffffffb620, context_die=<dw_die_ref 0x7ffff6834050 DW_TAG_class_type <parent=0x7ffff6834000 DW_TAG_compile_unit>>) at ../../src/gcc/gcc/dwarf2out.cc:27280 #2 0x00000000016646b6 in gen_member_die (type=<record_type 0x7ffff69bf348 T>, context_die=<dw_die_ref 0x7ffff6834050 DW_TAG_class_type <parent=0x7ffff6834000 DW_TAG_compile_unit>>) at ../../src/gcc/gcc/dwarf2out.cc:26089 #3 0x0000000001664e03 in gen_struct_or_union_type_die ( type=<record_type 0x7ffff69bf348 T>, context_die=<dw_die_ref 0x7ffff6834000 DW_TAG_compile_unit>, usage=DINFO_USAGE_DIR_USE) at ../../src/gcc/gcc/dwarf2out.cc:26185 which runs into a similar assert that passes: 26268 if (DECL_ORIGINAL_TYPE (decl)) 26269 { 26270 type = DECL_ORIGINAL_TYPE (decl); 26271 if (type == error_mark_node) 26272 return; 26273 26274 gcc_assert (type != TREE_TYPE (decl)); DIE 0: DW_TAG_class_type (0x7ffff6834050) abbrev id: 0 offset: 0 mark: 0 DW_AT_name: "T<int>" DW_AT_byte_size: 1 DW_AT_decl_file: "t.ii" (0) DW_AT_decl_line: 1 DW_AT_decl_column: 27 DIE 0: DW_TAG_structure_type (0x7ffff68340a0) abbrev id: 0 offset: 0 mark: 0 DW_AT_name: "a" DW_AT_declaration: 1 DIE 0: DW_TAG_typedef (0x7ffff68340f0) abbrev id: 0 offset: 0 mark: 0 DW_AT_name: "a" DW_AT_decl_file: "t.ii" (0) DW_AT_decl_line: 3 DW_AT_decl_column: 21 it was Jason who added this assert in r0-42720-g29b91443e955b9, the following avoids the ICE in this PR. diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc index ed7d9402200..8b396866d24 100644 --- a/gcc/dwarf2out.cc +++ b/gcc/dwarf2out.cc @@ -26431,7 +26431,7 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die, } /* Prevent broken recursion; we can't hand off to the same type. */ - gcc_assert (DECL_ORIGINAL_TYPE (name) != type); + gcc_assert (DECL_ORIGINAL_TYPE (name) != type || TREE_ASM_WRITTEN (name)); /* Give typedefs the right scope. */ context_die = scope_die_for (type, context_die); but we could also simply not do anything if name has alread been emitted: diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc index ed7d9402200..d0a29efe633 100644 --- a/gcc/dwarf2out.cc +++ b/gcc/dwarf2out.cc @@ -26419,10 +26419,10 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die, for the parent typedef which TYPE is a type of. */ if (typedef_variant_p (type)) { - if (TREE_ASM_WRITTEN (type)) + tree name = TYPE_NAME (type); + if (TREE_ASM_WRITTEN (type) || TREE_ASM_WRITTEN (name)) return; - tree name = TYPE_NAME (type); tree origin = decl_ultimate_origin (name); if (origin != NULL && origin != name) { I suppose the existing TREE_ASM_WRITTEN (type) check is off in this regard and instead the following might be better overall? I'm going to test this. diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc index ed7d9402200..d4c51554e3e 100644 --- a/gcc/dwarf2out.cc +++ b/gcc/dwarf2out.cc @@ -26419,10 +26419,10 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die, for the parent typedef which TYPE is a type of. */ if (typedef_variant_p (type)) { - if (TREE_ASM_WRITTEN (type)) + tree name = TYPE_NAME (type); + if (TREE_ASM_WRITTEN (name)) return; - tree name = TYPE_NAME (type); tree origin = decl_ultimate_origin (name); if (origin != NULL && origin != name) { @@ -26436,8 +26436,6 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die, /* Give typedefs the right scope. */ context_die = scope_die_for (type, context_die); - TREE_ASM_WRITTEN (type) = 1; - gen_decl_die (name, NULL, NULL, context_die); return; }