aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2012-01-09 21:08:53 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2012-01-09 21:08:53 +0000
commit24e7a4a06e13c9e1d72ccdc26b26852a423f053e (patch)
tree251ea15fe6dc8ace11d106256923db2dff8acb39 /gcc/ada
parentefd2e969f2571ba3e1bf9a04b88da7ee2144e1d9 (diff)
downloadgcc-24e7a4a06e13c9e1d72ccdc26b26852a423f053e.zip
gcc-24e7a4a06e13c9e1d72ccdc26b26852a423f053e.tar.gz
gcc-24e7a4a06e13c9e1d72ccdc26b26852a423f053e.tar.bz2
trans.c (call_to_gnu): Create the temporary for the return value in the variable-sized return type...
* gcc-interface/trans.c (call_to_gnu): Create the temporary for the return value in the variable-sized return type case if the target is an array with fixed size. However, do not create it if this is the expression of an object declaration. From-SVN: r183033
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog7
-rw-r--r--gcc/ada/gcc-interface/trans.c21
2 files changed, 21 insertions, 7 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 83019eb..15175d0 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,12 @@
2012-01-09 Eric Botcazou <ebotcazou@adacore.com>
+ * gcc-interface/trans.c (call_to_gnu): Create the temporary for the
+ return value in the variable-sized return type case if the target is
+ an array with fixed size. However, do not create it if this is the
+ expression of an object declaration.
+
+2012-01-09 Eric Botcazou <ebotcazou@adacore.com>
+
* gcc-interface/trans.c (addressable_p) <COMPONENT_REF>: Fix thinko.
2012-01-06 Robert Dewar <dewar@adacore.com>
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index 580b492..01fdd49 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -3631,15 +3631,22 @@ call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target,
}
/* First, create the temporary for the return value if we need it: for a
- variable-sized return type if there is no target or if this is slice,
- because the gimplifier doesn't support these cases; or for a function
- with copy-in/copy-out parameters if there is no target, because we'll
- need to preserve the return value before copying back the parameters.
- This must be done before we push a new binding level around the call
- as we will pop it before copying the return value. */
+ variable-sized return type if there is no target and this is not an
+ object declaration, or else there is a target and it is a slice or an
+ array with fixed size, as the gimplifier doesn't handle these cases;
+ otherwise for a function with copy-in/copy-out parameters if there is
+ no target, because we need to preserve the return value before copying
+ back the parameters. This must be done before we push a binding level
+ around the call as we will pop it before copying the return value. */
if (function_call
&& ((TREE_CODE (TYPE_SIZE (gnu_result_type)) != INTEGER_CST
- && (!gnu_target || TREE_CODE (gnu_target) == ARRAY_RANGE_REF))
+ && ((!gnu_target
+ && Nkind (Parent (gnat_node)) != N_Object_Declaration)
+ || (gnu_target
+ && (TREE_CODE (gnu_target) == ARRAY_RANGE_REF
+ || (TREE_CODE (TREE_TYPE (gnu_target)) == ARRAY_TYPE
+ && TREE_CODE (TYPE_SIZE (TREE_TYPE (gnu_target)))
+ == INTEGER_CST)))))
|| (!gnu_target && TYPE_CI_CO_LIST (gnu_subprog_type))))
gnu_retval = create_temporary ("R", gnu_result_type);