diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-05-12 14:54:09 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-05-12 14:54:09 +0000 |
commit | 769e30fb08adf5d3d9e39ab15743094f68d2d353 (patch) | |
tree | 3df342877a3a9a3b2cf6eef779b339e65eea49b8 /gcc/ada | |
parent | 488a4664f1ecae42b73075b7be070a679e770a9d (diff) | |
download | gcc-769e30fb08adf5d3d9e39ab15743094f68d2d353.tar.gz |
* gcc-interface/trans.c (call_to_gnu): In the by-reference case, if the
type of the parameter is an unconstrained array, convert the actual to
the type of the formal in the In Out and Out cases as well.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@173706 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/trans.c | 14 |
2 files changed, 16 insertions, 4 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 2c022fe6a50..42019393571 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2011-05-12 Eric Botcazou <ebotcazou@adacore.com> + + * gcc-interface/trans.c (call_to_gnu): In the by-reference case, if the + type of the parameter is an unconstrained array, convert the actual to + the type of the formal in the In Out and Out cases as well. + 2011-05-11 Nathan Froyd <froydnj@codesourcery.com> * gcc-interface/utils.c (def_fn_type): Don't call build_function_type; diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index dc79c6fd270..6b132353250 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -3018,12 +3018,18 @@ call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target) /* There is no need to convert the actual to the formal's type before taking its address. The only exception is for unconstrained array types because of the way we build fat pointers. */ - else if (TREE_CODE (gnu_formal_type) == UNCONSTRAINED_ARRAY_TYPE) - gnu_actual = convert (gnu_formal_type, gnu_actual); + if (TREE_CODE (gnu_formal_type) == UNCONSTRAINED_ARRAY_TYPE) + { + /* Put back a view conversion for In Out or Out parameters. */ + if (Ekind (gnat_formal) != E_In_Parameter) + gnu_actual = convert (gnat_to_gnu_type (Etype (gnat_actual)), + gnu_actual); + gnu_actual = convert (gnu_formal_type, gnu_actual); + } /* The symmetry of the paths to the type of an entity is broken here since arguments don't know that they will be passed by ref. */ - gnu_formal_type = TREE_TYPE (get_gnu_tree (gnat_formal)); + gnu_formal_type = TREE_TYPE (gnu_formal); if (DECL_BY_DOUBLE_REF_P (gnu_formal)) gnu_actual @@ -3036,7 +3042,7 @@ call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target) && TREE_CODE (gnu_formal) == PARM_DECL && DECL_BY_COMPONENT_PTR_P (gnu_formal)) { - gnu_formal_type = TREE_TYPE (get_gnu_tree (gnat_formal)); + gnu_formal_type = TREE_TYPE (gnu_formal); gnu_actual = maybe_implicit_deref (gnu_actual); gnu_actual = maybe_unconstrained_array (gnu_actual); |