1 // { dg-do run } 2 // Testcase for proper handling of rethrow. 3 4 #include <stdio.h> 5 6 int c, d; 7 int wrong; 8 9 struct A 10 { 11 int i; 12 A () { i = c++; printf ("A() %d\n", i); } 13 A (const A&) { i = c++; printf ("A(const A&) %d\n", i); } 14 ~A() { printf ("~A() %d\n", i); ++d; } 15 }; 16 17 struct B 18 { 19 ~B () { 20 try 21 { 22 printf ("Rethrowing III...\n"); 23 throw; 24 } 25 catch (A& a) 26 { 27 printf ("Caught III %d...\n", a.i); 28 if (a.i != 1) 29 { 30 printf ("** rethrew uncaught exception **\n"); 31 wrong = 1; 32 } 33 } 34 printf ("continuing to unwind II...\n"); 35 } 36 }; 37 38 int 39 main () 40 { 41 { 42 A a; 43 44 try 45 { 46 try 47 { 48 printf ("Throwing I...\n"); 49 throw a; 50 } 51 catch (A& a) 52 { 53 printf ("Caught I %d...\n", a.i); 54 try 55 { 56 B b; 57 printf ("Throwing II...\n"); 58 throw a; 59 } 60 catch (A& a) 61 { 62 printf ("Caught II %d...\n", a.i); 63 printf ("Throwing IV...\n"); 64 throw; 65 } 66 } 67 } 68 catch (A& a) 69 { 70 printf ("Caught IV %d.\n", a.i); 71 } 72 } 73 74 printf ("c == %d, d == %d\n", c, d); 75 return c != d || wrong; 76 } 77