Commit 1b6f8e97 by Eric Botcazou Committed by Pierre-Marie de Rodat

[Ada] Fix internal error on allocator with function call

2018-05-31  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

	* gcc-interface/trans.c (Call_to_gnu): If this is a function call and
	there is no target, also create a temporary for the return value for
	an allocator if the type is an unconstrained record type with default
	discriminant.

From-SVN: r261007
parent 3c5d07ab
2018-05-31 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (Call_to_gnu): If this is a function call and
there is no target, also create a temporary for the return value for
an allocator if the type is an unconstrained record type with default
discriminant.
2018-05-31 Hristian Kirtchev <kirtchev@adacore.com> 2018-05-31 Hristian Kirtchev <kirtchev@adacore.com>
* exp_ch7.adb (Find_Transient_Context): An iteration scheme is a valid * exp_ch7.adb (Find_Transient_Context): An iteration scheme is a valid
......
...@@ -4355,12 +4355,15 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target, ...@@ -4355,12 +4355,15 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target,
because we need to preserve the return value before copying back the because we need to preserve the return value before copying back the
parameters. parameters.
2. There is no target and the call is made for neither an object nor a 2. There is no target and the call is made for neither an object, nor a
renaming declaration, nor a return statement, nor an allocator, and renaming declaration, nor a return statement, nor an allocator, and
the return type has variable size because in this case the gimplifier the return type has variable size because in this case the gimplifier
cannot create the temporary, or more generally is simply an aggregate cannot create the temporary, or more generally is an aggregate type,
type, because the gimplifier would then create the temporary in the because the gimplifier would create the temporary in the outermost
outermost scope instead of locally. scope instead of locally. But there is an exception for an allocator
of an unconstrained record type with default discriminant because we
allocate the actual size in this case, unlike the other 3 cases, so
we need a temporary to fetch the discriminant and we create it here.
3. There is a target and it is a slice or an array with fixed size, 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 and the return type has variable size, because the gimplifier
...@@ -4379,8 +4382,9 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target, ...@@ -4379,8 +4382,9 @@ 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_Declaration
&& Nkind (Parent (gnat_node)) != N_Object_Renaming_Declaration && Nkind (Parent (gnat_node)) != N_Object_Renaming_Declaration
&& Nkind (Parent (gnat_node)) != N_Simple_Return_Statement && Nkind (Parent (gnat_node)) != N_Simple_Return_Statement
&& !(Nkind (Parent (gnat_node)) == N_Qualified_Expression && (!(Nkind (Parent (gnat_node)) == N_Qualified_Expression
&& Nkind (Parent (Parent (gnat_node))) == N_Allocator) && Nkind (Parent (Parent (gnat_node))) == N_Allocator)
|| type_is_padding_self_referential (gnu_result_type))
&& AGGREGATE_TYPE_P (gnu_result_type) && AGGREGATE_TYPE_P (gnu_result_type)
&& !TYPE_IS_FAT_POINTER_P (gnu_result_type)) && !TYPE_IS_FAT_POINTER_P (gnu_result_type))
|| (gnu_target || (gnu_target
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment