http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51567
--- Comment #2 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-12-15 14:42:19 UTC --- 5007 gcc_assert (child->die_parent == parent 5008 || (child->die_parent 5009 == get_AT_ref (parent, DW_AT_specification))); we have (gdb) call debug_dwarf_die (child) DIE 0: DW_TAG_member (0x7ffff5b6c2d0) abbrev id: 0 offset: 0 mark: 0 DW_AT_name: "_M_cur" DW_AT_decl_file: "t.ii" (1) DW_AT_decl_line: 2 DW_AT_type: die -> 0 (0x7ffff5b6c320) DW_AT_data_member_location: location descriptor (gdb) call debug_dwarf_die (parent) DIE 0: DW_TAG_structure_type (0x7ffff5b6c8c0) abbrev id: 0 offset: 0 mark: 0 DW_AT_name: "iterator" DW_AT_byte_size: 8 DW_AT_decl_file: "t.ii" (1) DW_AT_decl_line: 1 so somehow it messes up parent, which should be a typedef DIE(?). We generate it through #0 0x000000000062a089 in gen_struct_or_union_type_die (type=0x7ffff5b5fc78, context_die=0x7ffff5b6c820, usage=DINFO_USAGE_DIR_USE) at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:18582 #1 0x000000000062b139 in gen_tagged_type_die (type=0x7ffff5b5fc78, context_die=0x7ffff5b6c820, usage=DINFO_USAGE_DIR_USE) at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:18810 #2 0x000000000062ab4f in gen_typedef_die (decl=0x7ffff5b682e0, context_die=0x7ffff5b6c820) at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:18719 #3 0x000000000062ecbd in gen_decl_die (decl=0x7ffff5b682e0, origin=0x0, context_die=0x7ffff5b6c820) at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:19523 #4 0x000000000062ba99 in gen_type_die_with_usage (type=0x7ffff5b5fc78, context_die=0x7ffff5b6c820, usage=DINFO_USAGE_DIR_USE) at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:18873 #5 0x000000000062bfc8 in gen_type_die (type=0x7ffff5b5fc78, context_die=0x7ffff5b6c820) at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:18999 #6 0x000000000062f032 in gen_decl_die (decl=0x7ffff5a45428, origin=0x0, context_die=0x7ffff5b6c820) at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:19574 #7 0x00000000006297dd in gen_member_die (type=0x7ffff5b5fb28, context_die=0x7ffff5b6c820) at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:18532 #8 0x000000000062a484 in gen_struct_or_union_type_die (type=0x7ffff5b5fb28, context_die=0x7ffff5b6c780, usage=DINFO_USAGE_DIR_USE) at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:18624 #9 0x000000000062b139 in gen_tagged_type_die (type=0x7ffff5b5fb28, context_die=0x7ffff5b6c780, usage=DINFO_USAGE_DIR_USE) at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:18810 #10 0x000000000062be2d in gen_type_die_with_usage (type=0x7ffff5b5fb28, context_die=0x7ffff5b6c780, usage=DINFO_USAGE_DIR_USE) at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:18960 #11 0x000000000062bfc8 in gen_type_die (type=0x7ffff5b5fb28, context_die=0x7ffff5b6c780) at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:18999 #12 0x000000000060960d in modified_type_die (type=0x7ffff5b5fb28, is_const_type=0, is_volatile_type=0, context_die=0x7ffff5b6c780) at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:9835 #13 0x000000000061f7de in add_type_attribute (object_die=0x7ffff5b6c7d0, type=0x7ffff5b5fb28, decl_const=0, decl_volatile=0, context_die=0x7ffff5b6c780) at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:16136 #14 0x000000000062946d in gen_inheritance_die (binfo=0x7ffff5b650c0, access=0x7ffff5a2b528, context_die=0x7ffff5b6c780) at /space/rguenther/src/svn/trunk/gcc/dwarf2out.c:18464 ... I think it happens because we very likely merge the two types named 'iterator' (_Deque_base::iterator and deque::iterator). Which is because gimple.c:compare_type_names_p simply looks through the TYPE_DECLs to the IDENTIFIER_NODEs. It probably should compare the DECL_CONTEXT of the TYPE_DECLs as well (but if they are a TREE_TYPE that creates new members of the SCC we have to visit ...) Fixing that fixes this bug.