aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@gcc.gnu.org>2011-05-12 14:54:09 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2011-05-12 14:54:09 +0000
commit7bf9a5ac1c5310efed24c42eab522e4e9ade1933 (patch)
tree3df342877a3a9a3b2cf6eef779b339e65eea49b8 /gcc/ada
parent61332f77748bd6ea8cb59c15f08a48466940ac95 (diff)
downloadgcc-7bf9a5ac1c5310efed24c42eab522e4e9ade1933.zip
gcc-7bf9a5ac1c5310efed24c42eab522e4e9ade1933.tar.gz
gcc-7bf9a5ac1c5310efed24c42eab522e4e9ade1933.tar.bz2
trans.c (call_to_gnu): In the by-reference case...
* 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. From-SVN: r173706
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/gcc-interface/trans.c14
2 files changed, 16 insertions, 4 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 2c022fe..4201939 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 dc79c6f..6b13235 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);