From 87eddedc5f9ae385958edd24d9d42981f702ecb2 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sat, 9 Sep 2017 12:41:19 +0000 Subject: [PATCH] decl.c (gnat_to_gnu_entity): Copy the layout of the record from the parent type only if... * gcc-interface/decl.c (gnat_to_gnu_entity) : 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. From-SVN: r251934 --- gcc/ada/ChangeLog | 7 +++++++ gcc/ada/gcc-interface/decl.c | 10 ++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index efef4f7d0a1..f02fde23860 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2017-09-09 Eric Botcazou + + * gcc-interface/decl.c (gnat_to_gnu_entity) : 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. + 2017-09-09 Eric Botcazou * gcc-interface/utils2.c (build_allocator): In type_annotate_only mode diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 2a31e8f917e..f8752c8ae61 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -3287,15 +3287,15 @@ 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. 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_type, tree old_type, 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; -- 2.30.2