decl.c (gnat_to_gnu_entity): Copy the layout of the record from the parent type only...
authorEric Botcazou <ebotcazou@adacore.com>
Sat, 9 Sep 2017 12:41:19 +0000 (12:41 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 9 Sep 2017 12:41:19 +0000 (12:41 +0000)
* 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.

From-SVN: r251934

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c

index efef4f7d0a1d6b58f117269d38f39bb5cafb2112..f02fde2386040e07231f76e9a9b9220f30f5cbdc 100644 (file)
@@ -1,3 +1,10 @@
+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.
+
 2017-09-09  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/utils2.c (build_allocator): In type_annotate_only mode
index 2a31e8f917ea05a4a7726deab4b0586ceccd1380..f8752c8ae61159dcde88fc814a67ab559e54528c 100644 (file)
@@ -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;