aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface/trans.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2019-05-27 11:43:17 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2019-05-27 11:43:17 +0000
commit8da3776f936b487f5bdf94f372890c3f13604021 (patch)
treee3cd18fc2893e5af81c0e85d4589d48a3a03cef8 /gcc/ada/gcc-interface/trans.c
parentb9778c45fc1cd361c3012e30aeb02b53cb3e531c (diff)
downloadgcc-8da3776f936b487f5bdf94f372890c3f13604021.zip
gcc-8da3776f936b487f5bdf94f372890c3f13604021.tar.gz
gcc-8da3776f936b487f5bdf94f372890c3f13604021.tar.bz2
trans.c (Call_to_gnu): Do not initialize the temporary created out of addressability concerns if...
* gcc-interface/trans.c (Call_to_gnu): Do not initialize the temporary created out of addressability concerns if it's for the _Init parameter of an initialization procedure. From-SVN: r271659
Diffstat (limited to 'gcc/ada/gcc-interface/trans.c')
-rw-r--r--gcc/ada/gcc-interface/trans.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index 59c4c07..be9cbd4 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -5313,13 +5313,23 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target,
/* Create an explicit temporary holding the copy. */
if (atomic_p)
gnu_name = build_atomic_load (gnu_name, sync);
- gnu_temp
- = create_init_temporary ("A", gnu_name, &gnu_stmt, gnat_actual);
- /* But initialize it on the fly like for an implicit temporary as
- we aren't necessarily having a statement list. */
- gnu_name = build_compound_expr (TREE_TYPE (gnu_name), gnu_stmt,
- gnu_temp);
+ /* Do not initialize it for the _Init parameter of an initialization
+ procedure since no data is meant to be passed in. */
+ if (Ekind (gnat_formal) == E_Out_Parameter
+ && Is_Entity_Name (Name (gnat_node))
+ && Is_Init_Proc (Entity (Name (gnat_node))))
+ gnu_name = gnu_temp = create_temporary ("A", TREE_TYPE (gnu_name));
+
+ /* Initialize it on the fly like for an implicit temporary in the
+ other cases, as we don't necessarily have a statement list. */
+ else
+ {
+ gnu_temp = create_init_temporary ("A", gnu_name, &gnu_stmt,
+ gnat_actual);
+ gnu_name = build_compound_expr (TREE_TYPE (gnu_name), gnu_stmt,
+ gnu_temp);
+ }
/* Set up to move the copy back to the original if needed. */
if (!in_param)