]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/9993 (destructor not called for local object created within and returned...
authorJason Merrill <jason@redhat.com>
Mon, 17 Mar 2003 15:46:37 +0000 (10:46 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 17 Mar 2003 15:46:37 +0000 (10:46 -0500)
        PR c++/9993
        * decl.c (finish_function): Only allow the NRVO to use variables
        declared at function scope.

From-SVN: r64489

gcc/cp/ChangeLog
gcc/cp/decl.c

index 6487a59218c6d18bdf3eeb329d1bc938f91766e3..28883b2b91e1e580933802ef61d124beb2b78c8a 100644 (file)
@@ -1,3 +1,9 @@
+2003-03-17  Jason Merrill  <jason@redhat.com>
+
+       PR c++/9993
+       * decl.c (finish_function): Only allow the NRVO to use variables
+       declared at function scope.
+
 2003-03-16  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/6440
index 3e23c8aeeceebb072b45927f298dbcf90fdd6ba5..7ba863d4347e45d97e5e857b3db9f480be64ddec 100644 (file)
@@ -14309,11 +14309,21 @@ finish_function (flags)
   if (current_function_return_value)
     {
       tree r = current_function_return_value;
-      /* This is only worth doing for fns that return in memory--and
-        simpler, since we don't have to worry about promoted modes.  */
+      tree outer;
+
       if (r != error_mark_node
-         && aggregate_value_p (TREE_TYPE (TREE_TYPE (fndecl))))
+         /* This is only worth doing for fns that return in memory--and
+            simpler, since we don't have to worry about promoted modes.  */
+         && aggregate_value_p (TREE_TYPE (TREE_TYPE (fndecl)))
+         /* Only allow this for variables declared in the outer scope of
+            the function so we know that their lifetime always ends with a
+            return; see g++.dg/opt/nrv6.C.  We could be more flexible if
+            we were to do this optimization in tree-ssa.  */
+         /* Skip the artificial function body block.  */
+         && (outer = BLOCK_SUBBLOCKS (BLOCK_SUBBLOCKS (DECL_INITIAL (fndecl))),
+             chain_member (r, BLOCK_VARS (outer))))
        {
+         
          DECL_ALIGN (r) = DECL_ALIGN (DECL_RESULT (fndecl));
          walk_tree_without_duplicates (&DECL_SAVED_TREE (fndecl),
                                        nullify_returns_r, r);