On 3/17/25 11:03 AM, Richard Biener wrote:
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.
...on the decl, not the type. So your patch changes the check to look
there (where gen_typedef_die sets it) instead of on the type (where it
doesn't).
Alternatively we could change gen_typedef_die to also set the flag on
the type in the DECL_ORIGINAL_TYPE case.
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.
is_redundant_typedef checks for TYPE_STUB_DECL and injected-class-name,
things that won't satisfy typedef_variant_p.
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>();
+}