trans.c (return_value_ok_for_nrv_p): Only apply the addressability check in the const...
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 15 May 2017 08:43:25 +0000 (08:43 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 15 May 2017 08:43:25 +0000 (08:43 +0000)
* gcc-interface/trans.c (return_value_ok_for_nrv_p): Only apply the
addressability check in the constrained case.

From-SVN: r248053

gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c

index 6d9a86d17fe73d45d5e35a3c72aa96c5370291a8..78a3bb1c71bec268aa78e15057082dea92bc56ff 100644 (file)
@@ -1,3 +1,8 @@
+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
index 4c80053fabf51d88c6fd5c8e649b56aaf96ea0fc..abdef0375459b04c3d1b9fe470f87ec0d1b0ce4d 100644 (file)
@@ -3238,8 +3238,9 @@ Loop_Statement_to_gnu (Node_Id gnat_node)
      RETURN_EXPR [<retval> = Ri]
        [...]
 
-   and we try to fulfill a simple criterion that would make it possible to
-   replace one or several Ri variables with the RESULT_DECL of the function.
+   where the Ri are not addressable and we try to fulfill a simple criterion
+   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
    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)
    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
    different size and is allocated separately so we need not care about the
-   aforementioned overlapping issues.  Therefore, we don't collect the other
-   expressions and skip step #2 in the algorithm.  */
+   addressability and the aforementioned overlapping issues.  Therefore, we
+   don't collect the other expressions and skip step #2 in the algorithm.  */
 
 struct nrv_data
 {
@@ -3612,7 +3613,8 @@ return_value_ok_for_nrv_p (tree ret_obj, tree ret_val)
   if (TREE_STATIC (ret_val))
     return false;
 
-  if (TREE_ADDRESSABLE (ret_val))
+  /* For the constrained case, test for addressability.  */
+  if (ret_obj && TREE_ADDRESSABLE (ret_val))
     return false;
 
   /* For the constrained case, test for overalignment.  */