mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 03:47:02 -05:00
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:
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user