This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Ada] Fix wrong derivation of record type into unchecked union
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sat, 09 Sep 2017 14:41:28 +0200
- Subject: [Ada] Fix wrong derivation of record type into unchecked union
- Authentication-results: sourceware.org; auth=none
It's a fallout of the new implementation of layout for derived record types.
Tested on x86_64-suse-linux, applied on the mainline.
2017-09-09 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Type>: Copy the
layout of the record from the parent type only if both are or are not
unchecked unions.
(is_stored_discriminant): Return false for an unchecked union.
--
Eric Botcazou
Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c (revision 251931)
+++ gcc-interface/decl.c (working copy)
@@ -3287,15 +3287,15 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
}
/* If this is a derived type with discriminants and these discriminants
- affect the initial shape it has inherited, factor them in. But for
- an Unchecked_Union (it must be an Itype), just process the type. */
+ affect the initial shape it has inherited, factor them in. */
if (has_discr
&& !is_extension
&& !Has_Record_Rep_Clause (gnat_entity)
&& Stored_Constraint (gnat_entity) != No_Elist
&& (gnat_parent_type = Underlying_Type (Etype (gnat_entity)))
&& Is_Record_Type (gnat_parent_type)
- && !Is_Unchecked_Union (gnat_parent_type)
+ && Is_Unchecked_Union (gnat_entity)
+ == Is_Unchecked_Union (gnat_parent_type)
&& No_Reordering (gnat_entity) == No_Reordering (gnat_parent_type))
{
tree gnu_parent_type
@@ -9328,7 +9328,9 @@ copy_and_substitute_in_size (tree new_ty
static inline bool
is_stored_discriminant (Entity_Id discr, Entity_Id record_type)
{
- if (Is_Tagged_Type (record_type))
+ if (Is_Unchecked_Union (record_type))
+ return false;
+ else if (Is_Tagged_Type (record_type))
return No (Corresponding_Discriminant (discr));
else if (Ekind (record_type) == E_Record_Type)
return Original_Record_Component (discr) == discr;