From 8da3776f936b487f5bdf94f372890c3f13604021 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 27 May 2019 11:43:17 +0000 Subject: [PATCH] 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 --- gcc/ada/ChangeLog | 6 ++++++ gcc/ada/gcc-interface/trans.c | 22 ++++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 82fb6e56363..8c3e7fb88ae 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2019-05-27 Eric Botcazou + + * 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. + 2019-05-27 Eric Botcazou * gcc-interface/ada-builtin-types.def: New file. diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 59c4c07a319..be9cbd4f626 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) -- 2.30.2