]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/g++.old-deja/g++.eh/catch6p.C
g++-dg.exp (g++-dg-test): Add "repo" option.
[thirdparty/gcc.git] / gcc / testsuite / g++.old-deja / g++.eh / catch6p.C
1 // { dg-do run }
2 // { dg-options "-w" }
3 // Copyright (C) 1999, 2000 Free Software Foundation, Inc.
4 // Contributed by Nathan Sidwell 29 Aug 1999 <nathan@acm.org>
5
6 // We cannot catch an ambiguous base class.
7 // -- public, << private, == virtual
8
9 // E==D--B==A
10 // +--C==A
11 // +--AA-A
12
13
14 struct A { int m; virtual ~A(){}};
15 struct B : virtual A { int m; };
16 struct C : virtual A { int m; };
17 struct AA : A { int m; };
18 struct D : B, C, AA { int m; };
19 struct E : virtual D { int m; };
20
21 void fna(A *obj) { throw obj; }
22 void fnb(B *obj) { throw obj; }
23 void fnc(C *obj) { throw obj; }
24 void fnd(D *obj) { throw obj; }
25 void fnaa(AA *obj) { throw obj; }
26 void fne(E *obj) { throw obj; }
27
28 extern "C" void abort();
29
30 void check(E *e)
31 {
32 int caught;
33
34 // try with whole object
35 caught = 0;
36 try { fne(e); }
37 catch(A *p) { abort(); } // A is ambiguous
38 catch(D *p) { caught = 1; if (p != e) abort();}
39 catch(...) { abort(); }
40 if (!caught) abort();
41
42 caught = 0;
43 try { fne(e); }
44 catch(A *p) { abort(); } // A is ambiguous
45 catch(B *p) { caught = 1; if (p != e) abort();}
46 catch(...) { abort(); }
47 if (!caught) abort();
48
49 caught = 0;
50 try { fne(e); }
51 catch(A *p) { abort(); } // A is ambiguous
52 catch(C *p) { caught = 1; if (p != e) abort();}
53 catch(...) { abort(); }
54 if (!caught) abort();
55
56 caught = 0;
57 try { fne(e); }
58 catch(A *p) { abort(); } // A is ambiguous
59 catch(AA *p) { caught = 1; if (p != e) abort();}
60 catch(...) { abort(); }
61 if (!caught) abort();
62
63 // try with D oject
64 caught = 0;
65 try { fnd((D *)e); }
66 catch(A *p) { abort(); } // A is ambiguous
67 catch(D *p) { caught = 1; if (p != e) abort();}
68 catch(...) { abort(); }
69 if (!caught) abort();
70
71 caught = 0;
72 try { fnd((D *)e); }
73 catch(A *p) { abort(); } // A is ambiguous
74 catch(B *p) { caught = 1; if (p != e) abort();}
75 catch(...) { abort(); }
76 if (!caught) abort();
77
78 caught = 0;
79 try { fnd((D *)e); }
80 catch(A *p) { abort(); } // A is ambiguous
81 catch(C *p) { caught = 1; if (p != e) abort();}
82 catch(...) { abort(); }
83 if (!caught) abort();
84
85 caught = 0;
86 try { fnd((D *)e); }
87 catch(A *p) { abort(); } // A is ambiguous
88 catch(AA *p) { caught = 1; if (p != e) abort();}
89 catch(...) { abort(); }
90 if (!caught) abort();
91
92 // try with an A object
93 caught = 0;
94 try { fna((B *)e); }
95 catch(B *p) { abort(); } // throw type is static type
96 catch(A *p) { caught = 1; if (p != (B *)e) abort();}
97 catch(...) { abort(); }
98 if (!caught) abort();
99
100 caught = 0;
101 try { fna((C *)e); }
102 catch(C *p) { abort(); } // throw type is static type
103 catch(A *p) { caught = 1; if (p != (C *)e) abort();}
104 catch(...) { abort(); }
105 if (!caught) abort();
106
107 caught = 0;
108 try { fna((AA *)e); }
109 catch(AA *p) { abort(); } // throw type is static type
110 catch(A *p) { caught = 1; if (p != (AA *)e) abort();}
111 catch(...) { abort(); }
112 if (!caught) abort();
113
114 // try with B object
115 caught = 0;
116 try { fnb((B *)e); }
117 catch(A *p) { caught = 1; if (p != (B *)e) abort();}
118 catch(...) { abort(); }
119 if (!caught) abort();
120
121 caught = 0;
122 try { fnb((B *)e); }
123 catch(B *p) { caught = 1; if (p != e) abort();}
124 catch(...) { abort(); }
125 if (!caught) abort();
126
127 caught = 0;
128 try { fnb((B *)e); }
129 catch(C *p) { abort(); }
130 catch(D *p) { abort(); }
131 catch(...) { caught =1; }
132 if (!caught) abort();
133
134 // try with C object
135 caught = 0;
136 try { fnc((C *)e); }
137 catch(A *p) { caught = 1; if (p != (C *)e) abort();}
138 catch(...) { abort(); }
139 if (!caught) abort();
140
141 caught = 0;
142 try { fnc((C *)e); }
143 catch(C *p) { caught = 1; if (p != e) abort();}
144 catch(...) { abort(); }
145 if (!caught) abort();
146
147 caught = 0;
148 try { fnc((C *)e); }
149 catch(B *p) { abort(); }
150 catch(D *p) { abort(); }
151 catch(...) { caught =1; }
152 if (!caught) abort();
153
154 // try with AA object
155 caught = 0;
156 try { fnaa((AA *)e); }
157 catch(A *p) { caught = 1; if (p != (AA *)e) abort();}
158 catch(...) { abort(); }
159 if (!caught) abort();
160
161 caught = 0;
162 try { fnaa((AA *)e); }
163 catch(AA *p) { caught = 1; if (p != e) abort();}
164 catch(...) { abort(); }
165 if (!caught) abort();
166
167 caught = 0;
168 try { fnaa((AA *)e); }
169 catch(C *p) { abort(); }
170 catch(B *p) { abort(); }
171 catch(D *p) { abort(); }
172 catch(...) { caught =1; }
173 if (!caught) abort();
174
175 return;
176 }
177
178 int main ()
179 {
180 E e;
181 check (&e); // try with an object
182 check ((E *)0); // try with no object
183
184 return 0;
185 }