| // { dg-do run } |
| // 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; |
| } |