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 with the comment corrected, perhaps by just removing everything after the comma.

        * 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>();
+}

Reply via email to