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.
(cherry picked from commit
99a3f013c3bb8bc022ca488b40aa18fd97b5224d)
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)
{
/* 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;
}
--- /dev/null
+// { dg-do compile }
+// { dg-options "-g" }
+
+template <typename> class T
+{
+ typedef struct {} a __attribute__((aligned));
+};
+void f ()
+{
+ T<int>();
+}