trans.c (call_to_gnu): For an (in-)out parameter passed by reference whose type is a constructed...

2004-10-26  Eric Botcazou  <ebotcazou@act-europe.fr>

	* trans.c (call_to_gnu): For an (in-)out parameter passed by reference
	whose type is a constructed subtype of an aliased object with an
	unconstrained nominal subtype, convert the actual to the constructed
	subtype before taking its address.

From-SVN: r89676
This commit is contained in:
Eric Botcazou 2004-10-27 15:55:45 +02:00 committed by Arnaud Charlet
parent b194546ef0
commit 04061aa5af

View File

@ -1759,6 +1759,20 @@ call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target)
&& TREE_CODE (gnu_actual) != SAVE_EXPR)
gnu_actual = convert (get_unpadded_type (Etype (gnat_actual)),
gnu_actual);
/* If we have the constructed subtype of an aliased object
with an unconstrained nominal subtype, the type of the
actual includes the template, although it is formally
constrained. So we need to convert it back to the real
constructed subtype to retrieve the constrained part
and takes its address. */
if (TREE_CODE (TREE_TYPE (gnu_actual)) == RECORD_TYPE
&& TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (gnu_actual))
&& TREE_CODE (gnu_actual) != SAVE_EXPR
&& Is_Constr_Subt_For_UN_Aliased (Etype (gnat_actual))
&& Is_Array_Type (Etype (gnat_actual)))
gnu_actual = convert (gnat_to_gnu_type (Etype (gnat_actual)),
gnu_actual);
}
/* Otherwise, if we have a non-addressable COMPONENT_REF of a