https://gcc.gnu.org/g:8d007d35e4b8f1a1d06299af5321fb776da3cac1

commit r16-6312-g8d007d35e4b8f1a1d06299af5321fb776da3cac1
Author: Jose E. Marchesi <[email protected]>
Date:   Sat Dec 20 15:59:50 2025 +0100

    a68: fix layout of incomplete types
    
    Apparently there is some case where the c_union of an union may be
    incomplete and the containing union complete.  At this point I don't
    fully understand how is that possible and the layering out of modes
    should probably be rethinked, but for now fix this corner case.
    
    Signed-off-by: Jose E. Marchesi <[email protected]>
    
    gcc/algol68/ChangeLog
    
            * a68-low-moids.cc (a68_lower_moids): Fix for layout of
            incomplete types.

Diff:
---
 gcc/algol68/a68-low-moids.cc | 35 ++++++++++++++++++++---------------
 1 file changed, 20 insertions(+), 15 deletions(-)

diff --git a/gcc/algol68/a68-low-moids.cc b/gcc/algol68/a68-low-moids.cc
index 4dbf11891628..b5bf46c8cf8e 100644
--- a/gcc/algol68/a68-low-moids.cc
+++ b/gcc/algol68/a68-low-moids.cc
@@ -688,27 +688,32 @@ a68_lower_moids (MOID_T *mode)
 
   for (MOID_T *m = mode; m != NO_MOID; FORWARD (m))
     {
-      if (!COMPLETE_TYPE_P (CTYPE (m)))
+      if (IS_UNION (m))
        {
-         if (IS_STRUCT (m))
+         tree union_type = CTYPE (m);
+         tree c_union_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (union_type)));
+
+         if (!COMPLETE_TYPE_P (c_union_type))
            {
-             tree struct_type = CTYPE (m);
-             layout_type (struct_type);
-             compute_record_mode (struct_type);
+             layout_type (c_union_type);
+             compute_record_mode (c_union_type);
+             gcc_assert (COMPLETE_TYPE_P (c_union_type));
            }
-         else if (IS_UNION (m))
-           {
-             tree union_type = CTYPE (m);
-             tree c_union_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS 
(union_type)));
-
-             if (!COMPLETE_TYPE_P (c_union_type))
-               {
-                 layout_type (c_union_type);
-                 compute_record_mode (c_union_type);
-               }
 
+         if (!COMPLETE_TYPE_P (union_type))
+           {
              layout_type (union_type);
              compute_record_mode (union_type);
+             gcc_assert (COMPLETE_TYPE_P (union_type));
+           }
+       }
+      else if (!COMPLETE_TYPE_P (CTYPE (m)))
+       {
+         if (IS_STRUCT (m))
+           {
+             tree struct_type = CTYPE (m);
+             layout_type (struct_type);
+             compute_record_mode (struct_type);
            }
          else
            layout_type (CTYPE (m));

Reply via email to