On Mon, 17 Mar 2025, Jason Merrill wrote: > On 3/5/25 10:21 AM, Richard Biener wrote: > > There's a sanity check in gen_type_die_with_usage that trips > > unnecessarily for a case where the relevant DIE has already been > > generated successfully in other ways. The following keys the > > existing TREE_ASM_WRITTEN check on the correct object, honoring > > this and does nothing instead of ICEing for the testcase at hand. > > > > Bootstrapped and tested on x86_64-unknown-linux-gnu. > > > > OK? > > > > Thanks, > > Richard. > > > > PR debug/101533 > > * dwarf2out.cc (gen_type_die_with_usage): When we have > > output the typedef already do nothing for a typedef variant. > > Do not set TREE_ASM_WRITTEN on the type itself, recursion > > on the name should do this. > > But it doesn't; nothing sets TREE_ASM_WRITTEN on the variant type, that's why > the existing test fails. We could decide that it's OK that we never set the > flag on the variant type, but this comment is false.
OK, it's probably mis-worded. I was refering to gen_typedef_die setting (and checking) TREE_ASM_WRITTEN. I see there's the is_redundant_typedef path in gen_decl_die: if (is_redundant_typedef (decl)) gen_type_die (TREE_TYPE (decl), context_die); else /* Output a DIE to represent the typedef itself. */ gen_typedef_die (decl, context_die); somehow I convinced myself we're always going gen_typedef_die, but I can't see that triviality now... But since it passed testing ... I'll note the above recurses with TREE_TYPE (name) rather than the recursion we check in gen_type_die_with_usage: /* Prevent broken recursion; we can't hand off to the same type. */ gcc_assert (DECL_ORIGINAL_TYPE (name) != type); it's a bit of a maze. But I'm fine with reworking when the fix runs into another issue out in the wild. > OK with the comment corrected, perhaps by just removing everything after the > comma. I'll go ahead with this tomorrow unless you have more insights here. Richard. > > * g++.dg/debug/pr101533.C: New testcase. > > --- > > gcc/dwarf2out.cc | 6 ++---- > > gcc/testsuite/g++.dg/debug/pr101533.C | 11 +++++++++++ > > 2 files changed, 13 insertions(+), 4 deletions(-) > > create mode 100644 gcc/testsuite/g++.dg/debug/pr101533.C > > > > 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; > > } > > diff --git a/gcc/testsuite/g++.dg/debug/pr101533.C > > b/gcc/testsuite/g++.dg/debug/pr101533.C > > new file mode 100644 > > index 00000000000..fc1e2e742a1 > > --- /dev/null > > +++ b/gcc/testsuite/g++.dg/debug/pr101533.C > > @@ -0,0 +1,11 @@ > > +// { dg-do compile } > > +// { dg-options "-g" } > > + > > +template <typename> class T > > +{ > > + typedef struct {} a __attribute__((aligned)); > > +}; > > +void f () > > +{ > > + T<int>(); > > +} > > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)