From: Jose E. Marchesi Date: Sat, 20 Dec 2025 14:59:50 +0000 (+0100) Subject: a68: fix layout of incomplete types X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8d007d35e4b8f1a1d06299af5321fb776da3cac1;p=thirdparty%2Fgcc.git 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 gcc/algol68/ChangeLog * a68-low-moids.cc (a68_lower_moids): Fix for layout of incomplete types. --- 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));