diff options
author | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-27 13:55:45 +0000 |
---|---|---|
committer | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-27 13:55:45 +0000 |
commit | 3953c263937cc067774377ec4472caf3cfccc882 (patch) | |
tree | 1582017d854c6cbefd872bdc899ce8c545b518ff | |
parent | bba351394c80e6c1a56dd296ab373b2c618550e6 (diff) | |
download | gcc-3953c263937cc067774377ec4472caf3cfccc882.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@89676 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ada/trans.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/ada/trans.c b/gcc/ada/trans.c index 666f84e20d0..4f04da7e8f6 100644 --- a/gcc/ada/trans.c +++ b/gcc/ada/trans.c @@ -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 |