stmt.c (expand_return): Call start_cleanup_deferral and end_cleanup_deferral around...
authorMark Mitchell <mark@codesourcery.com>
Wed, 19 May 1999 03:54:49 +0000 (03:54 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Wed, 19 May 1999 03:54:49 +0000 (03:54 +0000)
* stmt.c (expand_return): Call start_cleanup_deferral and
end_cleanup_deferral around conditional code.

From-SVN: r27018

gcc/ChangeLog
gcc/stmt.c
gcc/testsuite/g++.old-deja/g++.other/cleanup2.C [new file with mode: 0644]

index 28a516f5d514b2fa02d21ea4b68ba785e647e4c3..860338c4eb6fa7358ce4e47a62c125ebf4b05d8d 100644 (file)
@@ -1,3 +1,8 @@
+Wed May 19 03:56:56 1999  Mark Mitchell  <mark@codesourcery.com>
+
+       * stmt.c (expand_return): Call start_cleanup_deferral and
+       end_cleanup_deferral around conditional code.
+
 Wed May 19 03:10:08 1999  Bruce Korb <ddsinc09@ix.netcom.com>
 
        * fixinc/fixincl.tpl: Avoid depending on ANSI C features for
index 41bc736681d0b23206c361c8dabfd072087ab674..9c8a716fbc1f7b2fb77fcb094cacd0b56a2eeda8 100644 (file)
@@ -2703,6 +2703,7 @@ expand_return (retval)
       tree expr;
 
       do_jump (TREE_OPERAND (retval_rhs, 0), label, NULL_RTX);
+      start_cleanup_deferral ();
       expr = build (MODIFY_EXPR, TREE_TYPE (TREE_TYPE (current_function_decl)),
                    DECL_RESULT (current_function_decl),
                    TREE_OPERAND (retval_rhs, 1));
@@ -2715,6 +2716,7 @@ expand_return (retval)
                    TREE_OPERAND (retval_rhs, 2));
       TREE_SIDE_EFFECTS (expr) = 1;
       expand_return (expr);
+      end_cleanup_deferral ();
       return;
     }
 
diff --git a/gcc/testsuite/g++.old-deja/g++.other/cleanup2.C b/gcc/testsuite/g++.old-deja/g++.other/cleanup2.C
new file mode 100644 (file)
index 0000000..4cd0b55
--- /dev/null
@@ -0,0 +1,26 @@
+// Origin: Bryan Scattergood <bryan@fsel.com>
+// Special g++ Options: -O -fno-exceptions
+
+extern "C" void abort();
+
+class A
+{
+public:
+  A();
+  ~A();
+  int foo();
+};
+
+A::A() {}
+A::~A() { abort (); }
+int A::foo() {}
+
+extern int f()
+{
+  return 0;
+}
+
+int main()
+{
+  return ((f() != 0) ? A().foo() : 0);
+}