On Wed, 5 Mar 2025, 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?
I'd like to ping this patch. Richard. > 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. > > * 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)