Commit 13b6b773 by Eric Botcazou Committed by Eric Botcazou

trans.c (return_value_ok_for_nrv_p): Only apply the addressability check in the constrained case.

	* gcc-interface/trans.c (return_value_ok_for_nrv_p): Only apply the
	addressability check in the constrained case.

From-SVN: r248053
parent 3946f000
2017-05-15 Eric Botcazou <ebotcazou@adacore.com> 2017-05-15 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (return_value_ok_for_nrv_p): Only apply the
addressability check in the constrained case.
2017-05-15 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (Identifier_to_gnu): Also accept incomplete * gcc-interface/trans.c (Identifier_to_gnu): Also accept incomplete
types not coming from a limited context. types not coming from a limited context.
......
...@@ -3238,8 +3238,9 @@ Loop_Statement_to_gnu (Node_Id gnat_node) ...@@ -3238,8 +3238,9 @@ Loop_Statement_to_gnu (Node_Id gnat_node)
RETURN_EXPR [<retval> = Ri] RETURN_EXPR [<retval> = Ri]
[...] [...]
and we try to fulfill a simple criterion that would make it possible to where the Ri are not addressable and we try to fulfill a simple criterion
replace one or several Ri variables with the RESULT_DECL of the function. that would make it possible to replace one or several Ri variables by the
single RESULT_DECL of the function.
The first observation is that RETURN_EXPRs that don't directly reference The first observation is that RETURN_EXPRs that don't directly reference
any of the Ri variables on the RHS of their assignment are transparent wrt any of the Ri variables on the RHS of their assignment are transparent wrt
...@@ -3271,8 +3272,8 @@ Loop_Statement_to_gnu (Node_Id gnat_node) ...@@ -3271,8 +3272,8 @@ Loop_Statement_to_gnu (Node_Id gnat_node)
because the anonymous return object is allocated on the secondary stack because the anonymous return object is allocated on the secondary stack
and RESULT_DECL is only a pointer to it. Each return object can be of a and RESULT_DECL is only a pointer to it. Each return object can be of a
different size and is allocated separately so we need not care about the different size and is allocated separately so we need not care about the
aforementioned overlapping issues. Therefore, we don't collect the other addressability and the aforementioned overlapping issues. Therefore, we
expressions and skip step #2 in the algorithm. */ don't collect the other expressions and skip step #2 in the algorithm. */
struct nrv_data struct nrv_data
{ {
...@@ -3612,7 +3613,8 @@ return_value_ok_for_nrv_p (tree ret_obj, tree ret_val) ...@@ -3612,7 +3613,8 @@ return_value_ok_for_nrv_p (tree ret_obj, tree ret_val)
if (TREE_STATIC (ret_val)) if (TREE_STATIC (ret_val))
return false; return false;
if (TREE_ADDRESSABLE (ret_val)) /* For the constrained case, test for addressability. */
if (ret_obj && TREE_ADDRESSABLE (ret_val))
return false; return false;
/* For the constrained case, test for overalignment. */ /* For the constrained case, test for overalignment. */
......
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