OSDN Git Service

* g++.old-deja/g++.eh/catchptr1.C: New test.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.old-deja / g++.eh / catch5p.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.
5 // -- public, << private, == virtual
6
7 // D--B==A
8 // +--C==A
9 // +--AA-A
10
11 struct A { int m; virtual ~A(){}};
12 struct B : virtual A { int m; };
13 struct C : virtual A { int m; };
14 struct AA : A { int m; };
15 struct D : B, C, AA { int m; };
16
17 void fna(A *obj) { throw obj; }
18 void fnb(B *obj) { throw obj; }
19 void fnc(C *obj) { throw obj; }
20 void fnd(D *obj) { throw obj; }
21 void fnaa(AA *obj) { throw obj; }
22
23 extern "C" void abort();
24
25 void check(D *d)
26 {
27   int caught;
28   
29   // try with whole object
30   caught = 0;
31   try { fnd(d); }
32   catch(A *p) { abort(); } // A is ambiguous
33   catch(D *p) { caught = 1; if (p != d) abort();}
34   catch(...) { abort(); }
35   if (!caught) abort();
36
37   caught = 0;
38   try { fnd(d); }
39   catch(A *p) { abort(); } // A is ambiguous
40   catch(B *p) { caught = 1; if (p != d) abort();}
41   catch(...) { abort(); }
42   if (!caught) abort();
43
44   caught = 0;
45   try { fnd(d); }
46   catch(A *p) { abort(); } // A is ambiguous
47   catch(C *p) { caught = 1; if (p != d) abort();}
48   catch(...) { abort(); }
49   if (!caught) abort();
50
51   caught = 0;
52   try { fnd(d); }
53   catch(A *p) { abort(); } // A is ambiguous
54   catch(AA *p) { caught = 1; if (p != d) abort();}
55   catch(...) { abort(); }
56   if (!caught) abort();
57
58   // try with an A object
59   caught = 0;
60   try { fna((B *)d); }
61   catch(B *p) { abort(); } // throw type is static type
62   catch(A *p) { caught = 1; if (p != (B *)d) abort();}
63   catch(...) { abort(); }
64   if (!caught) abort();
65   
66   caught = 0;
67   try { fna((C *)d); }
68   catch(C *p) { abort(); } // throw type is static type
69   catch(A *p) { caught = 1; if (p != (C *)d) abort();}
70   catch(...) { abort(); }
71   if (!caught) abort();
72   
73   caught = 0;
74   try { fna((AA *)d); }
75   catch(AA *p) { abort(); } // throw type is static type
76   catch(A *p) { caught = 1; if (p != (AA *)d) abort();}
77   catch(...) { abort(); }
78   if (!caught) abort();
79   
80   // try with B object
81   caught = 0;
82   try { fnb((B *)d); }
83   catch(A *p) { caught = 1; if (p != (B *)d) abort();}
84   catch(...) { abort(); }
85   if (!caught) abort();
86   
87   caught = 0;
88   try { fnb((B *)d); }
89   catch(B *p) { caught = 1; if (p != d) abort();}
90   catch(...) { abort(); }
91   if (!caught) abort();
92   
93   caught = 0;
94   try { fnb((B *)d); }
95   catch(C *p) { abort(); }
96   catch(D *p) { abort(); }
97   catch(...) { caught =1; }
98   if (!caught) abort();
99   
100   // try with C object
101   caught = 0;
102   try { fnc((C *)d); }
103   catch(A *p) { caught = 1; if (p != (C *)d) abort();}
104   catch(...) { abort(); }
105   if (!caught) abort();
106   
107   caught = 0;
108   try { fnc((C *)d); }
109   catch(C *p) { caught = 1; if (p != d) abort();}
110   catch(...) { abort(); }
111   if (!caught) abort();
112   
113   caught = 0;
114   try { fnc((C *)d); }
115   catch(B *p) { abort(); }
116   catch(D *p) { abort(); }
117   catch(...) { caught =1; }
118   if (!caught) abort();
119   
120   // try with AA object
121   caught = 0;
122   try { fnaa((AA *)d); }
123   catch(A *p) { caught = 1; if (p != (AA *)d) abort();}
124   catch(...) { abort(); }
125   if (!caught) abort();
126   
127   caught = 0;
128   try { fnaa((AA *)d); }
129   catch(AA *p) { caught = 1; if (p != d) abort();}
130   catch(...) { abort(); }
131   if (!caught) abort();
132   
133   caught = 0;
134   try { fnaa((AA *)d); }
135   catch(C *p) { abort(); }
136   catch(B *p) { abort(); }
137   catch(D *p) { abort(); }
138   catch(...) { caught =1; }
139   if (!caught) abort();
140   
141   return;
142 }
143
144 int main ()
145 {
146   D d;
147   check (&d); // try with an object
148   check ((D *)0); // try with no object
149   
150   return 0;
151 }