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
