From 9c2c00d63eaf58a31d8a25da483c52656bb5bbc9 Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Tue, 5 Sep 2017 08:28:20 +0000 Subject: [PATCH] * gcc-interface/trans.c (Call_to_gnu): If this is a function call and there is no target, do not create a temporary for the return value for an allocator either. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@251695 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ada/ChangeLog | 6 ++++++ gcc/ada/gcc-interface/trans.c | 12 +++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 32030b55e28..9250acf0b9e 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,11 @@ 2017-09-05 Eric Botcazou + * gcc-interface/trans.c (Call_to_gnu): If this is a function call and + there is no target, do not create a temporary for the return value for + an allocator either. + +2017-09-05 Eric Botcazou + * gcc-interface/trans.c (pos_to_constructor): Skip conversions to an unconstrained array type. diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index f7b51bbbd0a..eb777038234 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -4338,11 +4338,11 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target, parameters. 2. There is no target and the call is made for neither an object nor a - renaming declaration, nor a return statement, and the return type has - variable size, because in this case the gimplifier cannot create the - temporary, or more generally is simply an aggregate type, because the - gimplifier would create the temporary in the outermost scope instead - of locally. + renaming declaration, nor a return statement, nor an allocator, and + the return type has variable size because in this case the gimplifier + cannot create the temporary, or more generally is simply an aggregate + type, because the gimplifier would then create the temporary in the + outermost scope instead of locally. 3. There is a target and it is a slice or an array with fixed size, and the return type has variable size, because the gimplifier @@ -4361,6 +4361,8 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target, && Nkind (Parent (gnat_node)) != N_Object_Declaration && Nkind (Parent (gnat_node)) != N_Object_Renaming_Declaration && Nkind (Parent (gnat_node)) != N_Simple_Return_Statement + && !(Nkind (Parent (gnat_node)) == N_Qualified_Expression + && Nkind (Parent (Parent (gnat_node))) == N_Allocator) && AGGREGATE_TYPE_P (gnu_result_type) && !TYPE_IS_FAT_POINTER_P (gnu_result_type)) || (gnu_target -- 2.11.4.GIT