Commit 04061aa5 by Eric Botcazou Committed by Arnaud Charlet

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
parent b194546e
......@@ -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
......
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