Commit 3f6f0eb2 by Eric Botcazou Committed by Eric Botcazou

decl.c (gnat_to_gnu_entity): When discriminants affect the shape of the subtype...

	* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Subtype>: When
	discriminants affect the shape of the subtype, retrieve the GCC type
	directly from the original field if the GNAT types for the field and
	the original field are the same.

From-SVN: r147732
parent 0328ae4d
2009-05-20 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Subtype>: When
discriminants affect the shape of the subtype, retrieve the GCC type
directly from the original field if the GNAT types for the field and
the original field are the same.
2009-05-15 Eric Botcazou <ebotcazou@adacore.com> 2009-05-15 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/ada-tree.h (TYPE_GCC_MIN_VALUE, TYPE_GCC_MAX_VALUE): * gcc-interface/ada-tree.h (TYPE_GCC_MIN_VALUE, TYPE_GCC_MAX_VALUE):
......
...@@ -3124,21 +3124,27 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -3124,21 +3124,27 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
|| !Is_Tagged_Type (gnat_base_type))) || !Is_Tagged_Type (gnat_base_type)))
{ {
tree gnu_old_field tree gnu_old_field
= gnat_to_gnu_field_decl (Original_Record_Component = gnat_to_gnu_field_decl
(gnat_field)); (Original_Record_Component (gnat_field));
tree gnu_offset tree gnu_offset
= TREE_VALUE (purpose_member (gnu_old_field, = TREE_VALUE
gnu_pos_list)); (purpose_member (gnu_old_field, gnu_pos_list));
tree gnu_pos = TREE_PURPOSE (gnu_offset); tree gnu_pos = TREE_PURPOSE (gnu_offset);
tree gnu_bitpos = TREE_VALUE (TREE_VALUE (gnu_offset)); tree gnu_bitpos = TREE_VALUE (TREE_VALUE (gnu_offset));
tree gnu_field_type tree gnu_field, gnu_field_type, gnu_size, gnu_new_pos;
= gnat_to_gnu_type (Etype (gnat_field));
tree gnu_size = TYPE_SIZE (gnu_field_type);
tree gnu_new_pos = NULL_TREE;
unsigned int offset_align unsigned int offset_align
= tree_low_cst (TREE_PURPOSE (TREE_VALUE (gnu_offset)), = tree_low_cst
1); (TREE_PURPOSE (TREE_VALUE (gnu_offset)), 1);
tree gnu_field;
/* If the type is the same, retrieve the GCC type from the
old field to take into account possible adjustments. */
if (Etype (gnat_field)
== Etype (Original_Record_Component (gnat_field)))
gnu_field_type = TREE_TYPE (gnu_old_field);
else
gnu_field_type = gnat_to_gnu_type (Etype (gnat_field));
gnu_size = TYPE_SIZE (gnu_field_type);
/* If there was a component clause, the field types must be /* If there was a component clause, the field types must be
the same for the type and subtype, so copy the data from the same for the type and subtype, so copy the data from
...@@ -3197,6 +3203,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -3197,6 +3203,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
TYPE_SIZE (gnu_type))) TYPE_SIZE (gnu_type)))
continue; continue;
} }
else
gnu_new_pos = NULL_TREE;
gnu_field gnu_field
= create_field_decl = create_field_decl
......
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