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));
