[COMMITTED] a68: fix layout of incomplete types
Jose E. Marchesi
jose.marchesi@oracle.com
Sat Dec 20 15:53:08 GMT 2025
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 <jemarch@gnu.org>
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
More information about the Algol68
mailing list