diff options
author | Jason Merrill <jason@gcc.gnu.org> | 2004-02-24 13:30:47 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2004-02-24 13:30:47 -0500 |
commit | b82082972bbfbe47e3a2370f86d79100610662d5 (patch) | |
tree | ddc43ad0da14b0c547dba62f517e6abcc17442ca | |
parent | 896c3aa346912570aacfa51834145311de94632b (diff) | |
download | gcc-b82082972bbfbe47e3a2370f86d79100610662d5.zip gcc-b82082972bbfbe47e3a2370f86d79100610662d5.tar.gz gcc-b82082972bbfbe47e3a2370f86d79100610662d5.tar.bz2 |
re PR c++/13944 (exception in constructor of a class to be thrown is not caught)
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
-rw-r--r-- | gcc/testsuite/g++.dg/eh/elide1.C | 30 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/eh/elide2.C | 34 |
2 files changed, 64 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/eh/elide1.C b/gcc/testsuite/g++.dg/eh/elide1.C new file mode 100644 index 0000000..94d2a69 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/elide1.C @@ -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 index 0000000..618ee6f --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/elide2.C @@ -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; +} |