aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@gcc.gnu.org>2000-06-02 22:07:51 -0400
committerJason Merrill <jason@gcc.gnu.org>2000-06-02 22:07:51 -0400
commitde695d2c6db46e8272f3c1a04adc9b355a3059f7 (patch)
tree79ca53adb8ea4b09171d455d688caf367deb2d57 /gcc
parent2bf105ab5ba3b1b12f4efd828434c39030cdb6fe (diff)
downloadgcc-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.C75
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;
+}