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 <jemarch@gnu.org>

gcc/algol68/ChangeLog

	* a68-low-moids.cc (a68_lower_moids): Fix for layout of
	incomplete types.
This commit is contained in:
Jose E. Marchesi
2025-12-20 15:59:50 +01:00
parent 28749321d3
commit 8d007d35e4

View File

@@ -688,7 +688,26 @@ 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))
{
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);
gcc_assert (COMPLETE_TYPE_P (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))
{
@@ -696,20 +715,6 @@ a68_lower_moids (MOID_T *mode)
layout_type (struct_type);
compute_record_mode (struct_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);
}
layout_type (union_type);
compute_record_mode (union_type);
}
else
layout_type (CTYPE (m));
}