OSDN Git Service

New test
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.old-deja / g++.eh / catch4.C
1 // Copyright (C) 1999 Free Software Foundation, Inc.
2 // Contributed by Nathan Sidwell 29 Aug 1999 <nathan@acm.org>
3
4 // We cannot catch an ambiguous base class. Check with a virtual public
5 // DAG.
6 // -- public, << private, == virtual
7
8 // D--B==A
9 // +--C==A
10
11 struct A { int m; };
12 struct B : virtual A { int m; };
13 struct C : virtual A { int m; };
14 struct D : B, C { int m; };
15
16 void fna(A *obj) { throw obj; }
17 void fnb(B *obj) { throw obj; }
18 void fnc(C *obj) { throw obj; }
19 void fnd(D *obj) { throw obj; }
20
21 extern "C" void abort();
22
23 void check(D *d)
24 {
25   int caught;
26   
27   // try with whole object
28   caught = 0;
29   try { fnd(d); }
30   catch(A *p) { caught = 1; if (p != d) abort();}
31   catch(...) { abort(); }
32   if (!caught) abort();
33
34   caught = 0;
35   try { fnd(d); }
36   catch(B *p) { caught = 1; if (p != d) abort();}
37   catch(...) { abort(); }
38   if (!caught) abort();
39
40   caught = 0;
41   try { fnd(d); }
42   catch(C *p) { caught = 1; if (p != d) abort();}
43   catch(...) { abort(); }
44   if (!caught) abort();
45
46   // try with an A object
47   caught = 0;
48   try { fna((B *)d); }
49   catch(B *p) { abort(); } // throw type is static type
50   catch(A *p) { caught = 1; if (p != d) abort();}
51   catch(...) { abort(); }
52   if (!caught) abort();
53   
54   caught = 0;
55   try { fna((C *)d); }
56   catch(C *p) { abort(); } // throw type is static type
57   catch(A *p) { caught = 1; if (p != d) abort();}
58   catch(...) { abort(); }
59   if (!caught) abort();
60   
61   // try with B object
62   caught = 0;
63   try { fnb((B *)d); }
64   catch(A *p) { caught = 1; if (p != d) abort();}
65   catch(...) { abort(); }
66   if (!caught) abort();
67   
68   caught = 0;
69   try { fnb((B *)d); }
70   catch(B *p) { caught = 1; if (p != d) abort();}
71   catch(...) { abort(); }
72   if (!caught) abort();
73   
74   caught = 0;
75   try { fnb((B *)d); }
76   catch(C *p) { abort(); }
77   catch(D *p) { abort(); }
78   catch(...) { caught =1; }
79   if (!caught) abort();
80   
81   // try with C object
82   caught = 0;
83   try { fnc((C *)d); }
84   catch(A *p) { caught = 1; if (p != d) abort();}
85   catch(...) { abort(); }
86   if (!caught) abort();
87   
88   caught = 0;
89   try { fnc((C *)d); }
90   catch(C *p) { caught = 1; if (p != d) abort();}
91   catch(...) { abort(); }
92   if (!caught) abort();
93   
94   caught = 0;
95   try { fnc((C *)d); }
96   catch(B *p) { abort(); }
97   catch(D *p) { abort(); }
98   catch(...) { caught =1; }
99   if (!caught) abort();
100   
101   return;
102 }
103
104 int main ()
105 {
106   D d;
107   check (&d); // try with an object
108   check ((D *)0); // try with no object
109   
110   return 0;
111 }