From: Eric Botcazou <[email protected]>
The machinery that computes the layout of derived types does not support
C-compatible unchecked union types, but their layout is fixed in any case.
gcc/ada/ChangeLog:
* gcc-interface/decl.cc (gnat_to_gnu_entity) <E_Record_Type>: Do not
derive the layout of C-compatible unchecked union types.
Tested on x86_64-pc-linux-gnu, committed on master.
---
gcc/ada/gcc-interface/decl.cc | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/gcc/ada/gcc-interface/decl.cc b/gcc/ada/gcc-interface/decl.cc
index 9b64544a2f2..cf6c37f1ca2 100644
--- a/gcc/ada/gcc-interface/decl.cc
+++ b/gcc/ada/gcc-interface/decl.cc
@@ -3551,8 +3551,11 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree
gnu_expr, bool definition)
}
/* If this is a derived type with discriminants and these discriminants
- affect the initial shape it has inherited, factor them in. */
- if (has_discr
+ affect the initial shape it has inherited, factor them in, but this
+ is not needed for a C-compatible Unchecked_Union since the variants
+ are at offset 0 in there. */
+ if (TREE_CODE (gnu_type) == RECORD_TYPE
+ && has_discr
&& !is_extension
&& !Has_Record_Rep_Clause (gnat_entity)
&& Stored_Constraint (gnat_entity) != No_Elist
--
2.53.0