debug/101533 - ICE with variant typedef DIE generation

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.

	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.

	* g++.dg/debug/pr101533.C: New testcase.
This commit is contained in:
Richard Biener 2025-03-05 14:24:50 +01:00 committed by Richard Biener
parent 289867bb29
commit 99a3f013c3
2 changed files with 13 additions and 4 deletions

View file

@ -26424,10 +26424,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)
{
@ -26441,8 +26441,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;
}

View file

@ -0,0 +1,11 @@
// { dg-do compile }
// { dg-options "-g" }
template <typename> class T
{
typedef struct {} a __attribute__((aligned));
};
void f ()
{
T<int>();
}