summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/eh
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2007-10-15 05:21:37 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2007-10-15 05:21:37 +0000
commite2d9473df995c429354a369fa5071f5e041d1d89 (patch)
tree1790aa29b83df4a200b6f43e36baf83dc6d873d5 /gcc/testsuite/g++.dg/eh
parent0620694017a1deac0f345790b5f9cdc721540d48 (diff)
downloadgcc-e2d9473df995c429354a369fa5071f5e041d1d89.tar.gz
* tree-eh.c (optimize_double_finally): Don't assume that the
cleanup we're duplicating is only one statement. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129311 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/g++.dg/eh')
-rw-r--r--gcc/testsuite/g++.dg/eh/ehopt1.C44
1 files changed, 44 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/eh/ehopt1.C b/gcc/testsuite/g++.dg/eh/ehopt1.C
new file mode 100644
index 00000000000..163d76e814f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/eh/ehopt1.C
@@ -0,0 +1,44 @@
+// ehopt was only copying one statement from the cleanup of the B temporary
+// into the following try block, so we lost its destructor call.
+
+// { dg-do run }
+
+template <class T, class U>
+class A;
+
+bool b;
+int count;
+
+template <>
+class A<int, int>
+{
+public:
+ A(int) { ++count; if (b) throw 1; }
+ A(const A&) { ++count; if (b) throw 1; }
+ ~A() { --count; if (b) throw 1; }
+};
+
+typedef A<int, int> B;
+
+template <>
+class A<void *, void *>
+{
+public:
+ A() { if (b) throw 1; }
+ A(const B&) { if (b) throw 1; }
+ ~A() { if (b) throw 1; }
+};
+
+typedef A<void *, void *> C;
+
+void f() { if (b) throw 1; }
+
+int
+main (void)
+{
+ {
+ C a(1);
+ f();
+ }
+ return count;
+}