diff options
author | Jason Merrill <jason@gcc.gnu.org> | 2000-06-02 22:07:51 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2000-06-02 22:07:51 -0400 |
commit | de695d2c6db46e8272f3c1a04adc9b355a3059f7 (patch) | |
tree | 79ca53adb8ea4b09171d455d688caf367deb2d57 /gcc | |
parent | 2bf105ab5ba3b1b12f4efd828434c39030cdb6fe (diff) | |
download | gcc-de695d2c6db46e8272f3c1a04adc9b355a3059f7.zip gcc-de695d2c6db46e8272f3c1a04adc9b355a3059f7.tar.gz gcc-de695d2c6db46e8272f3c1a04adc9b355a3059f7.tar.bz2 |
new
From-SVN: r34374
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.eh/rethrow6.C | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.old-deja/g++.eh/rethrow6.C b/gcc/testsuite/g++.old-deja/g++.eh/rethrow6.C new file mode 100644 index 0000000..56f61ef --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.eh/rethrow6.C @@ -0,0 +1,75 @@ +// Testcase for proper handling of rethrow. + +#include <stdio.h> + +int c, d; +int wrong; + +struct A +{ + int i; + A () { i = c++; printf ("A() %d\n", i); } + A (const A&) { i = c++; printf ("A(const A&) %d\n", i); } + ~A() { printf ("~A() %d\n", i); ++d; } +}; + +struct B +{ + ~B () { + try + { + printf ("Rethrowing III...\n"); + throw; + } + catch (A& a) + { + printf ("Caught III %d...\n", a.i); + if (a.i != 1) + { + printf ("** rethrew uncaught exception **\n"); + wrong = 1; + } + } + printf ("continuing to unwind II...\n"); + } +}; + +int +main () +{ + { + A a; + + try + { + try + { + printf ("Throwing I...\n"); + throw a; + } + catch (A& a) + { + printf ("Caught I %d...\n", a.i); + try + { + B b; + printf ("Throwing II...\n"); + throw a; + } + catch (A& a) + { + printf ("Caught II %d...\n", a.i); + printf ("Throwing IV...\n"); + throw; + } + } + } + catch (A& a) + { + printf ("Caught IV %d.\n", a.i); + } + } + + printf ("c == %d, d == %d\n", c, d); + return c != d || wrong; +} |