https://gcc.gnu.org/g:597168191e2909aec745f4dc084e1f8d44fdb3e4

commit r15-8682-g597168191e2909aec745f4dc084e1f8d44fdb3e4
Author: Iain Buclaw <ibuc...@gdcproject.org>
Date:   Sun Mar 23 12:57:27 2025 +0100

    d: Fix ICE type variant differs by TYPE_PACKED [PR117621]
    
    Introduced by r13-1104-gf4c3ce32fa54c1, which had an accidental self
    assignment of TYPE_PACKED when it should have been assigned to the
    type's variants.
    
            PR d/117621
    
    gcc/d/ChangeLog:
    
            * types.cc (finish_aggregate_type): Propagate TYPE_PACKED to 
variants.
    
    gcc/testsuite/ChangeLog:
    
            * gdc.dg/pr117621.d: New test.

Diff:
---
 gcc/d/types.cc                  |  2 +-
 gcc/testsuite/gdc.dg/pr117621.d | 11 +++++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/gcc/d/types.cc b/gcc/d/types.cc
index 47ef66c25807..98074f1fb687 100644
--- a/gcc/d/types.cc
+++ b/gcc/d/types.cc
@@ -704,7 +704,7 @@ finish_aggregate_type (unsigned structsize, unsigned 
alignsize, tree type)
       TYPE_LANG_SPECIFIC (t) = TYPE_LANG_SPECIFIC (type);
       TYPE_SIZE (t) = TYPE_SIZE (type);
       TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
-      TYPE_PACKED (type) = TYPE_PACKED (type);
+      TYPE_PACKED (t) = TYPE_PACKED (type);
       SET_TYPE_ALIGN (t, TYPE_ALIGN (type));
       TYPE_USER_ALIGN (t) = TYPE_USER_ALIGN (type);
     }
diff --git a/gcc/testsuite/gdc.dg/pr117621.d b/gcc/testsuite/gdc.dg/pr117621.d
new file mode 100644
index 000000000000..f0b96cbff2cd
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr117621.d
@@ -0,0 +1,11 @@
+// { dg-do "compile" }
+// { dg-options "-g" }
+void pr117621()
+{
+    auto fun()(inout int)
+    {
+        struct S {}
+        return inout(S)();
+    }
+    auto s = fun(0);
+}

Reply via email to