OSDN Git Service

2006-02-08 Paolo Bonzini <bonzini@gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.old-deja / g++.eh / rethrow6.C
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 }