Home | History | Annotate | Download | only in jni
      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