Commit 87eddedc by Eric Botcazou Committed by Eric Botcazou

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) <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
parent f4657d60
2017-09-09 Eric Botcazou <ebotcazou@adacore.com> 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 * gcc-interface/utils2.c (build_allocator): In type_annotate_only mode
return NULL_EXPR. return NULL_EXPR.
......
...@@ -3287,15 +3287,15 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) ...@@ -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 /* If this is a derived type with discriminants and these discriminants
affect the initial shape it has inherited, factor them in. But for affect the initial shape it has inherited, factor them in. */
an Unchecked_Union (it must be an Itype), just process the type. */
if (has_discr if (has_discr
&& !is_extension && !is_extension
&& !Has_Record_Rep_Clause (gnat_entity) && !Has_Record_Rep_Clause (gnat_entity)
&& Stored_Constraint (gnat_entity) != No_Elist && Stored_Constraint (gnat_entity) != No_Elist
&& (gnat_parent_type = Underlying_Type (Etype (gnat_entity))) && (gnat_parent_type = Underlying_Type (Etype (gnat_entity)))
&& Is_Record_Type (gnat_parent_type) && 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)) && No_Reordering (gnat_entity) == No_Reordering (gnat_parent_type))
{ {
tree gnu_parent_type tree gnu_parent_type
...@@ -9328,7 +9328,9 @@ copy_and_substitute_in_size (tree new_type, tree old_type, ...@@ -9328,7 +9328,9 @@ copy_and_substitute_in_size (tree new_type, tree old_type,
static inline bool static inline bool
is_stored_discriminant (Entity_Id discr, Entity_Id record_type) 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)); return No (Corresponding_Discriminant (discr));
else if (Ekind (record_type) == E_Record_Type) else if (Ekind (record_type) == E_Record_Type)
return Original_Record_Component (discr) == discr; return Original_Record_Component (discr) == discr;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment