https://gcc.gnu.org/g:e6652764a4558fe9487f17e6c7b18fbc577e8df7

commit r13-9641-ge6652764a4558fe9487f17e6c7b18fbc577e8df7
Author: Richard Biener <rguent...@suse.de>
Date:   Wed Mar 5 14:24:50 2025 +0100

    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.
    
    (cherry picked from commit 99a3f013c3bb8bc022ca488b40aa18fd97b5224d)

Diff:
---
 gcc/dwarf2out.cc                      |  6 ++----
 gcc/testsuite/g++.dg/debug/pr101533.C | 11 +++++++++++
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc
index bd82b86a829c..b1a846c55a3e 100644
--- a/gcc/dwarf2out.cc
+++ b/gcc/dwarf2out.cc
@@ -26187,10 +26187,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)
        {
@@ -26204,8 +26204,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 000000000000..fc1e2e742a1d
--- /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