]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/13944 (exception in constructor of a class to be thrown is not caught)
authorJason Merrill <jason@gcc.gnu.org>
Tue, 24 Feb 2004 18:30:47 +0000 (13:30 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 24 Feb 2004 18:30:47 +0000 (13:30 -0500)
        PR c++/13944
        * except.c (do_free_exception): Remove #if 0 wrapper.
        (build_throw): Use it if we elide a copy into the exception object.

From-SVN: r78378

gcc/testsuite/g++.dg/eh/elide1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/eh/elide2.C [new file with mode: 0644]

diff --git a/gcc/testsuite/g++.dg/eh/elide1.C b/gcc/testsuite/g++.dg/eh/elide1.C
new file mode 100644 (file)
index 0000000..94d2a69
--- /dev/null
@@ -0,0 +1,30 @@
+// PR c++/13944
+
+// Bug: When eliding the copy from the A temporary into the exception
+// object, we extended the throw prohibition to the constructor for the
+// temporary.  This is wrong; the throw from A() should propagate normally
+// regardless of the elision of the temporary.
+
+// { dg-do run }
+
+struct A
+{
+  A() { throw 0; }
+};
+
+int main()
+{
+  try
+    {
+      throw A();
+    }
+  catch(int i)
+    {
+      return i;
+    }
+  catch (...)
+    {
+      return 2;
+    }
+  return 3;
+}
diff --git a/gcc/testsuite/g++.dg/eh/elide2.C b/gcc/testsuite/g++.dg/eh/elide2.C
new file mode 100644 (file)
index 0000000..618ee6f
--- /dev/null
@@ -0,0 +1,34 @@
+// PR c++/13944
+
+// Verify that we still call terminate() if we do run the copy constructor,
+// and it throws.
+
+// { dg-do run }
+
+#include <cstdlib>
+#include <exception>
+
+struct A
+{
+  A() { }
+  A(const A&) { throw 1; }
+};
+
+A a;
+
+void
+good_terminate() { std::exit (0); }
+
+int main()
+{
+  std::set_terminate (good_terminate);
+  try
+    {
+      throw a;
+    }
+  catch (...)
+    {
+      return 2;
+    }
+  return 3;
+}