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.
---
 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 4dbf1189162..b5bf46c8cf8 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));
-- 
2.30.2

Reply via email to