diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2019-05-27 11:43:17 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2019-05-27 11:43:17 +0000 |
commit | 8da3776f936b487f5bdf94f372890c3f13604021 (patch) | |
tree | e3cd18fc2893e5af81c0e85d4589d48a3a03cef8 /gcc/ada/gcc-interface/trans.c | |
parent | b9778c45fc1cd361c3012e30aeb02b53cb3e531c (diff) | |
download | gcc-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.c | 22 |
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) |