xref: /llvm-project/libcxxabi/test/dynamic_cast5.pass.cpp (revision eb8650a75793b2bd079d0c8901ff066f129061da)
1*eb8650a7SLouis Dionne //===----------------------------------------------------------------------===//
2e434b34fSJonathan Roelofs //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e434b34fSJonathan Roelofs //
7e434b34fSJonathan Roelofs //===----------------------------------------------------------------------===//
8e434b34fSJonathan Roelofs 
9e434b34fSJonathan Roelofs #include <cassert>
10086048dfSNico Weber #include "support/timer.h"
11e434b34fSJonathan Roelofs 
12f5ff11c4SEric Fiselier // This test explicitly tests dynamic cast with types that have inaccessible
13f5ff11c4SEric Fiselier // bases.
14f5ff11c4SEric Fiselier #if defined(__clang__)
15f5ff11c4SEric Fiselier #   pragma clang diagnostic ignored "-Winaccessible-base"
163a244fcfSLouis Dionne #elif defined(__GNUC__)
178d313927SLouis Dionne #   pragma GCC diagnostic ignored "-Winaccessible-base"
18f5ff11c4SEric Fiselier #endif
19f5ff11c4SEric Fiselier 
20e434b34fSJonathan Roelofs namespace t1
21e434b34fSJonathan Roelofs {
22e434b34fSJonathan Roelofs 
23e434b34fSJonathan Roelofs struct A1
24e434b34fSJonathan Roelofs {
25e434b34fSJonathan Roelofs     char _[43981];
~A1t1::A126e434b34fSJonathan Roelofs     virtual ~A1() {}
27e434b34fSJonathan Roelofs 
getA1t1::A128e434b34fSJonathan Roelofs     A1* getA1() {return this;}
29e434b34fSJonathan Roelofs };
30e434b34fSJonathan Roelofs 
31e434b34fSJonathan Roelofs struct A2
32e434b34fSJonathan Roelofs {
33e434b34fSJonathan Roelofs     char _[34981];
~A2t1::A234e434b34fSJonathan Roelofs     virtual ~A2() {}
35e434b34fSJonathan Roelofs 
getA2t1::A236e434b34fSJonathan Roelofs     A2* getA2() {return this;}
37e434b34fSJonathan Roelofs };
38e434b34fSJonathan Roelofs 
39e434b34fSJonathan Roelofs struct A3
40e434b34fSJonathan Roelofs     : public virtual A1,
41e434b34fSJonathan Roelofs       private A2
42e434b34fSJonathan Roelofs {
43e434b34fSJonathan Roelofs     char _[93481];
~A3t1::A344e434b34fSJonathan Roelofs     virtual ~A3() {}
45e434b34fSJonathan Roelofs 
getA1t1::A346e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t1::A347e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA3t1::A348e434b34fSJonathan Roelofs     A3* getA3() {return this;}
49e434b34fSJonathan Roelofs };
50e434b34fSJonathan Roelofs 
51e434b34fSJonathan Roelofs struct A4
52e434b34fSJonathan Roelofs     : public A3,
53e434b34fSJonathan Roelofs       public A2
54e434b34fSJonathan Roelofs {
55e434b34fSJonathan Roelofs     char _[13489];
~A4t1::A456e434b34fSJonathan Roelofs     virtual ~A4() {}
57e434b34fSJonathan Roelofs 
getA1t1::A458e434b34fSJonathan Roelofs     t1::A1* getA1() {return A3::getA1();}
getA2t1::A459e434b34fSJonathan Roelofs     A2* getA2() {return A3::getA2();}
getA3t1::A460e434b34fSJonathan Roelofs     A3* getA3() {return A3::getA3();}
getA4t1::A461e434b34fSJonathan Roelofs     A4* getA4() {return this;}
62e434b34fSJonathan Roelofs };
63e434b34fSJonathan Roelofs 
64e434b34fSJonathan Roelofs struct A5
65e434b34fSJonathan Roelofs     : public A4,
66e434b34fSJonathan Roelofs       public A3
67e434b34fSJonathan Roelofs {
68e434b34fSJonathan Roelofs     char _[13489];
~A5t1::A569e434b34fSJonathan Roelofs     virtual ~A5() {}
70e434b34fSJonathan Roelofs 
getA1t1::A571e434b34fSJonathan Roelofs     t1::A1* getA1() {return A4::getA1();}
getA2t1::A572e434b34fSJonathan Roelofs     A2* getA2() {return A4::getA2();}
getA3t1::A573e434b34fSJonathan Roelofs     A3* getA3() {return A4::getA3();}
getA4t1::A574e434b34fSJonathan Roelofs     A4* getA4() {return A4::getA4();}
getA5t1::A575e434b34fSJonathan Roelofs     A5* getA5() {return this;}
76e434b34fSJonathan Roelofs };
77e434b34fSJonathan Roelofs 
test()78e434b34fSJonathan Roelofs void test()
79e434b34fSJonathan Roelofs {
80e434b34fSJonathan Roelofs     A1 a1;
81e434b34fSJonathan Roelofs     A2 a2;
82e434b34fSJonathan Roelofs     A3 a3;
83e434b34fSJonathan Roelofs     A4 a4;
84e434b34fSJonathan Roelofs     A5 a5;
85e434b34fSJonathan Roelofs 
86e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
87e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
88e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
89e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA2()) == 0);
90e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
91e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
92e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA2()) == 0);
93e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
94e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
95e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
96e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
97e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
98e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
99e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
100e434b34fSJonathan Roelofs 
101e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
102e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
103e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA1()) == 0);
104e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
105e434b34fSJonathan Roelofs //    assert(dynamic_cast<A2*>(a3.getA3()) == 0);  // cast to private base
106e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
107e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
108e434b34fSJonathan Roelofs //    assert(dynamic_cast<A2*>(a4.getA3()) == 0);  // cast to private base
109e434b34fSJonathan Roelofs //    assert(dynamic_cast<A2*>(a4.getA4()) == 0);  // cast to ambiguous base
110e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA1()) == 0);
111e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
112e434b34fSJonathan Roelofs //    assert(dynamic_cast<A2*>(a5.getA3()) == 0);  // cast to private base
113e434b34fSJonathan Roelofs //    assert(dynamic_cast<A2*>(a5.getA4()) == 0);  // cast to ambiguous base
114e434b34fSJonathan Roelofs //    assert(dynamic_cast<A2*>(a5.getA5()) == 0);  // cast to ambiguous base
115e434b34fSJonathan Roelofs 
116e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
117e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
118e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
119e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA2()) == 0);
120e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
121e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
122e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
123e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
124e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
125e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA1()) == 0);
126e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA2()) == 0);
127e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
128e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
129e434b34fSJonathan Roelofs //    assert(dynamic_cast<A3*>(a5.getA5()) == 0);  // cast to ambiguous base
130e434b34fSJonathan Roelofs 
131e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
132e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
133e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
134e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
135e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
136e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
137e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA2()) == 0);
138e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
139e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
140e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
141e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA2()) == 0);
142e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
143e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
144e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
145e434b34fSJonathan Roelofs 
146e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
147e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
148e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
149e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
150e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
151e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
152e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
153e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA3()) == 0);
154e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
155e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
156e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA2()) == 0);
157e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
158e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
159e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
160e434b34fSJonathan Roelofs }
161e434b34fSJonathan Roelofs 
162e434b34fSJonathan Roelofs }  // t1
163e434b34fSJonathan Roelofs 
164e434b34fSJonathan Roelofs namespace t2
165e434b34fSJonathan Roelofs {
166e434b34fSJonathan Roelofs 
167e434b34fSJonathan Roelofs struct A1
168e434b34fSJonathan Roelofs {
169e434b34fSJonathan Roelofs     char _[43981];
~A1t2::A1170e434b34fSJonathan Roelofs     virtual ~A1() {}
171e434b34fSJonathan Roelofs 
getA1t2::A1172e434b34fSJonathan Roelofs     A1* getA1() {return this;}
173e434b34fSJonathan Roelofs };
174e434b34fSJonathan Roelofs 
175e434b34fSJonathan Roelofs struct A2
176e434b34fSJonathan Roelofs {
177e434b34fSJonathan Roelofs     char _[34981];
~A2t2::A2178e434b34fSJonathan Roelofs     virtual ~A2() {}
179e434b34fSJonathan Roelofs 
getA2t2::A2180e434b34fSJonathan Roelofs     A2* getA2() {return this;}
181e434b34fSJonathan Roelofs };
182e434b34fSJonathan Roelofs 
183e434b34fSJonathan Roelofs struct A3
184e434b34fSJonathan Roelofs     : public virtual A1,
185e434b34fSJonathan Roelofs       public A2
186e434b34fSJonathan Roelofs {
187e434b34fSJonathan Roelofs     char _[93481];
~A3t2::A3188e434b34fSJonathan Roelofs     virtual ~A3() {}
189e434b34fSJonathan Roelofs 
getA1t2::A3190e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t2::A3191e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA3t2::A3192e434b34fSJonathan Roelofs     A3* getA3() {return this;}
193e434b34fSJonathan Roelofs };
194e434b34fSJonathan Roelofs 
195e434b34fSJonathan Roelofs struct A4
196e434b34fSJonathan Roelofs     : public A3,
197e434b34fSJonathan Roelofs       public A2
198e434b34fSJonathan Roelofs {
199e434b34fSJonathan Roelofs     char _[13489];
~A4t2::A4200e434b34fSJonathan Roelofs     virtual ~A4() {}
201e434b34fSJonathan Roelofs 
getA1t2::A4202e434b34fSJonathan Roelofs     t2::A1* getA1() {return A3::getA1();}
getA2t2::A4203e434b34fSJonathan Roelofs     A2* getA2() {return A3::getA2();}
getA3t2::A4204e434b34fSJonathan Roelofs     A3* getA3() {return A3::getA3();}
getA4t2::A4205e434b34fSJonathan Roelofs     A4* getA4() {return this;}
206e434b34fSJonathan Roelofs };
207e434b34fSJonathan Roelofs 
208e434b34fSJonathan Roelofs struct A5
209e434b34fSJonathan Roelofs     : public A4,
210e434b34fSJonathan Roelofs       public A3
211e434b34fSJonathan Roelofs {
212e434b34fSJonathan Roelofs     char _[13489];
~A5t2::A5213e434b34fSJonathan Roelofs     virtual ~A5() {}
214e434b34fSJonathan Roelofs 
getA1t2::A5215e434b34fSJonathan Roelofs     t2::A1* getA1() {return A4::getA1();}
getA2t2::A5216e434b34fSJonathan Roelofs     A2* getA2() {return A4::getA2();}
getA3t2::A5217e434b34fSJonathan Roelofs     A3* getA3() {return A4::getA3();}
getA4t2::A5218e434b34fSJonathan Roelofs     A4* getA4() {return A4::getA4();}
getA5t2::A5219e434b34fSJonathan Roelofs     A5* getA5() {return this;}
220e434b34fSJonathan Roelofs };
221e434b34fSJonathan Roelofs 
test()222e434b34fSJonathan Roelofs void test()
223e434b34fSJonathan Roelofs {
224e434b34fSJonathan Roelofs     A1 a1;
225e434b34fSJonathan Roelofs     A2 a2;
226e434b34fSJonathan Roelofs     A3 a3;
227e434b34fSJonathan Roelofs     A4 a4;
228e434b34fSJonathan Roelofs     A5 a5;
229e434b34fSJonathan Roelofs 
230e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
231e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
232e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
233e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
234e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
235e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
236e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
237e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA3()) == a4.getA1());
238e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
239e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA1()) == a5.getA1());
240e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA2()) == a5.getA1());
241e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA1());
242e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA1());
243e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA5()) == a5.getA1());
244e434b34fSJonathan Roelofs 
245e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
246e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
247e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
248e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
249e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
250e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
251e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
252e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA3()) == a4.getA2());
253e434b34fSJonathan Roelofs //    assert(dynamic_cast<A2*>(a4.getA4()) == 0);  // cast to ambiguous base
254e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA1()) == 0);
255e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
256e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
257e434b34fSJonathan Roelofs //    assert(dynamic_cast<A2*>(a5.getA4()) == 0);  // cast to ambiguous base
258e434b34fSJonathan Roelofs //    assert(dynamic_cast<A2*>(a5.getA5()) == 0);  // cast to ambiguous base
259e434b34fSJonathan Roelofs 
260e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
261e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
262e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
263e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
264e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
265e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA1()) == a4.getA3());
266e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA2()) == a4.getA3());
267e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA3()) == a4.getA3());
268e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA4()) == a4.getA3());
269e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA1()) == 0);
270e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
271e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
272e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
273e434b34fSJonathan Roelofs //    assert(dynamic_cast<A3*>(a5.getA5()) == 0);  // cast to ambiguous base
274e434b34fSJonathan Roelofs 
275e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
276e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
277e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
278e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
279e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
280e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
281e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
282e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA3()) == a4.getA4());
283e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
284e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA1()) == a5.getA4());
285e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
286e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
287e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
288e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
289e434b34fSJonathan Roelofs 
290e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
291e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
292e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
293e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
294e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
295e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
296e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
297e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA3()) == 0);
298e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
299e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA1()) == a5.getA5());
300e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
301e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
302e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
303e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
304e434b34fSJonathan Roelofs }
305e434b34fSJonathan Roelofs 
306e434b34fSJonathan Roelofs }  // t2
307e434b34fSJonathan Roelofs 
308e434b34fSJonathan Roelofs namespace t3
309e434b34fSJonathan Roelofs {
310e434b34fSJonathan Roelofs 
311e434b34fSJonathan Roelofs struct A1
312e434b34fSJonathan Roelofs {
313e434b34fSJonathan Roelofs     char _[43981];
~A1t3::A1314e434b34fSJonathan Roelofs     virtual ~A1() {}
315e434b34fSJonathan Roelofs 
getA1t3::A1316e434b34fSJonathan Roelofs     A1* getA1() {return this;}
317e434b34fSJonathan Roelofs };
318e434b34fSJonathan Roelofs 
319e434b34fSJonathan Roelofs struct A2
320e434b34fSJonathan Roelofs {
321e434b34fSJonathan Roelofs     char _[34981];
~A2t3::A2322e434b34fSJonathan Roelofs     virtual ~A2() {}
323e434b34fSJonathan Roelofs 
getA2t3::A2324e434b34fSJonathan Roelofs     A2* getA2() {return this;}
325e434b34fSJonathan Roelofs };
326e434b34fSJonathan Roelofs 
327e434b34fSJonathan Roelofs struct A3
328e434b34fSJonathan Roelofs     : public A1,
329e434b34fSJonathan Roelofs       public virtual A2
330e434b34fSJonathan Roelofs {
331e434b34fSJonathan Roelofs     char _[93481];
~A3t3::A3332e434b34fSJonathan Roelofs     virtual ~A3() {}
333e434b34fSJonathan Roelofs 
getA1t3::A3334e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t3::A3335e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA3t3::A3336e434b34fSJonathan Roelofs     A3* getA3() {return this;}
337e434b34fSJonathan Roelofs };
338e434b34fSJonathan Roelofs 
339e434b34fSJonathan Roelofs struct A4
340e434b34fSJonathan Roelofs     : public A1,
341e434b34fSJonathan Roelofs       public virtual A2
342e434b34fSJonathan Roelofs {
343e434b34fSJonathan Roelofs     char _[13489];
~A4t3::A4344e434b34fSJonathan Roelofs     virtual ~A4() {}
345e434b34fSJonathan Roelofs 
getA1t3::A4346e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t3::A4347e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA4t3::A4348e434b34fSJonathan Roelofs     A4* getA4() {return this;}
349e434b34fSJonathan Roelofs };
350e434b34fSJonathan Roelofs 
351e434b34fSJonathan Roelofs struct A5
352e434b34fSJonathan Roelofs     : public A3,
353e434b34fSJonathan Roelofs       public A4
354e434b34fSJonathan Roelofs {
355e434b34fSJonathan Roelofs     char _[41389];
~A5t3::A5356e434b34fSJonathan Roelofs     virtual ~A5() {}
357e434b34fSJonathan Roelofs 
getA14t3::A5358e434b34fSJonathan Roelofs     A1* getA14() {return A4::getA1();}
getA13t3::A5359e434b34fSJonathan Roelofs     A1* getA13() {return A3::getA1();}
getA2t3::A5360e434b34fSJonathan Roelofs     A2* getA2() {return A4::getA2();}
getA3t3::A5361e434b34fSJonathan Roelofs     A3* getA3() {return A3::getA3();}
getA4t3::A5362e434b34fSJonathan Roelofs     A4* getA4() {return A4::getA4();}
getA5t3::A5363e434b34fSJonathan Roelofs     A5* getA5() {return this;}
364e434b34fSJonathan Roelofs };
365e434b34fSJonathan Roelofs 
test()366e434b34fSJonathan Roelofs void test()
367e434b34fSJonathan Roelofs {
368e434b34fSJonathan Roelofs     A1 a1;
369e434b34fSJonathan Roelofs     A2 a2;
370e434b34fSJonathan Roelofs     A3 a3;
371e434b34fSJonathan Roelofs     A4 a4;
372e434b34fSJonathan Roelofs     A5 a5;
373e434b34fSJonathan Roelofs 
374e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
375e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
376e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
377e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
378e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
379e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
380e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
381e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
382e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
383e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
384e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
385e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
386e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
387e434b34fSJonathan Roelofs 
388e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
389e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
390e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
391e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
392e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
393e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
394e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
395e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
396e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
397e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
398e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
399e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
400e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
401e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
402e434b34fSJonathan Roelofs 
403e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
404e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
405e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
406e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
407e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
408e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
409e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
410e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
411e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
412e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
413e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
414e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
415e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
416e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
417e434b34fSJonathan Roelofs 
418e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
419e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
420e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
421e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
422e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
423e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
424e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
425e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
426e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
427e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
428e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
429e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
430e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
431e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
432e434b34fSJonathan Roelofs 
433e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
434e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
435e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
436e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
437e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
438e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
439e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
440e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
441e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
442e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
443e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
444e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
445e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
446e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
447e434b34fSJonathan Roelofs }
448e434b34fSJonathan Roelofs 
449e434b34fSJonathan Roelofs }  // t3
450e434b34fSJonathan Roelofs 
451e434b34fSJonathan Roelofs namespace t4
452e434b34fSJonathan Roelofs {
453e434b34fSJonathan Roelofs 
454e434b34fSJonathan Roelofs struct A1
455e434b34fSJonathan Roelofs {
456e434b34fSJonathan Roelofs     char _[43981];
~A1t4::A1457e434b34fSJonathan Roelofs     virtual ~A1() {}
458e434b34fSJonathan Roelofs 
getA1t4::A1459e434b34fSJonathan Roelofs     A1* getA1() {return this;}
460e434b34fSJonathan Roelofs };
461e434b34fSJonathan Roelofs 
462e434b34fSJonathan Roelofs struct A2
463e434b34fSJonathan Roelofs {
464e434b34fSJonathan Roelofs     char _[34981];
~A2t4::A2465e434b34fSJonathan Roelofs     virtual ~A2() {}
466e434b34fSJonathan Roelofs 
getA2t4::A2467e434b34fSJonathan Roelofs     A2* getA2() {return this;}
468e434b34fSJonathan Roelofs };
469e434b34fSJonathan Roelofs 
470e434b34fSJonathan Roelofs struct A3
471e434b34fSJonathan Roelofs     : protected A1,
472e434b34fSJonathan Roelofs       public virtual A2
473e434b34fSJonathan Roelofs {
474e434b34fSJonathan Roelofs     char _[93481];
~A3t4::A3475e434b34fSJonathan Roelofs     virtual ~A3() {}
476e434b34fSJonathan Roelofs 
getA1t4::A3477e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t4::A3478e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA3t4::A3479e434b34fSJonathan Roelofs     A3* getA3() {return this;}
480e434b34fSJonathan Roelofs };
481e434b34fSJonathan Roelofs 
482e434b34fSJonathan Roelofs struct A4
483e434b34fSJonathan Roelofs     : public A1,
484e434b34fSJonathan Roelofs       public virtual A2
485e434b34fSJonathan Roelofs {
486e434b34fSJonathan Roelofs     char _[13489];
~A4t4::A4487e434b34fSJonathan Roelofs     virtual ~A4() {}
488e434b34fSJonathan Roelofs 
getA1t4::A4489e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t4::A4490e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA4t4::A4491e434b34fSJonathan Roelofs     A4* getA4() {return this;}
492e434b34fSJonathan Roelofs };
493e434b34fSJonathan Roelofs 
494e434b34fSJonathan Roelofs struct A5
495e434b34fSJonathan Roelofs     : public A3,
496e434b34fSJonathan Roelofs       public A4
497e434b34fSJonathan Roelofs {
498e434b34fSJonathan Roelofs     char _[41389];
~A5t4::A5499e434b34fSJonathan Roelofs     virtual ~A5() {}
500e434b34fSJonathan Roelofs 
getA14t4::A5501e434b34fSJonathan Roelofs     A1* getA14() {return A4::getA1();}
getA13t4::A5502e434b34fSJonathan Roelofs     A1* getA13() {return A3::getA1();}
getA2t4::A5503e434b34fSJonathan Roelofs     A2* getA2() {return A4::getA2();}
getA3t4::A5504e434b34fSJonathan Roelofs     A3* getA3() {return A3::getA3();}
getA4t4::A5505e434b34fSJonathan Roelofs     A4* getA4() {return A4::getA4();}
getA5t4::A5506e434b34fSJonathan Roelofs     A5* getA5() {return this;}
507e434b34fSJonathan Roelofs };
508e434b34fSJonathan Roelofs 
test()509e434b34fSJonathan Roelofs void test()
510e434b34fSJonathan Roelofs {
511e434b34fSJonathan Roelofs     A1 a1;
512e434b34fSJonathan Roelofs     A2 a2;
513e434b34fSJonathan Roelofs     A3 a3;
514e434b34fSJonathan Roelofs     A4 a4;
515e434b34fSJonathan Roelofs     A5 a5;
516e434b34fSJonathan Roelofs 
517e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
518e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
519e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
520e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA2()) == 0);
521e434b34fSJonathan Roelofs //    assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());  // cast to protected base
522e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
523e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
524e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
525e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
526e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
527e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
528e434b34fSJonathan Roelofs //    assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());  // cast to protected base
529e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
530e434b34fSJonathan Roelofs 
531e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
532e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
533e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA1()) == 0);
534e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
535e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
536e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
537e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
538e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
539e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
540e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA13()) == 0);
541e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
542e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
543e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
544e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
545e434b34fSJonathan Roelofs 
546e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
547e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
548e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA1()) == 0);
549e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
550e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
551e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
552e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
553e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
554e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
555e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA13()) == 0);
556e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
557e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
558e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
559e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
560e434b34fSJonathan Roelofs 
561e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
562e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
563e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
564e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
565e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
566e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
567e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
568e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
569e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
570e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA13()) == 0);
571e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
572e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
573e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
574e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
575e434b34fSJonathan Roelofs 
576e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
577e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
578e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
579e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
580e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
581e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
582e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
583e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
584e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
585e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA13()) == 0);
586e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
587e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
588e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
589e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
590e434b34fSJonathan Roelofs }
591e434b34fSJonathan Roelofs 
592e434b34fSJonathan Roelofs }  // t4
593e434b34fSJonathan Roelofs 
594e434b34fSJonathan Roelofs namespace t5
595e434b34fSJonathan Roelofs {
596e434b34fSJonathan Roelofs 
597e434b34fSJonathan Roelofs struct A1
598e434b34fSJonathan Roelofs {
599e434b34fSJonathan Roelofs     char _[43981];
~A1t5::A1600e434b34fSJonathan Roelofs     virtual ~A1() {}
601e434b34fSJonathan Roelofs 
getA1t5::A1602e434b34fSJonathan Roelofs     A1* getA1() {return this;}
603e434b34fSJonathan Roelofs };
604e434b34fSJonathan Roelofs 
605e434b34fSJonathan Roelofs struct A2
606e434b34fSJonathan Roelofs {
607e434b34fSJonathan Roelofs     char _[34981];
~A2t5::A2608e434b34fSJonathan Roelofs     virtual ~A2() {}
609e434b34fSJonathan Roelofs 
getA2t5::A2610e434b34fSJonathan Roelofs     A2* getA2() {return this;}
611e434b34fSJonathan Roelofs };
612e434b34fSJonathan Roelofs 
613e434b34fSJonathan Roelofs struct A3
614e434b34fSJonathan Roelofs     : public A1,
615e434b34fSJonathan Roelofs       protected virtual A2
616e434b34fSJonathan Roelofs {
617e434b34fSJonathan Roelofs     char _[93481];
~A3t5::A3618e434b34fSJonathan Roelofs     virtual ~A3() {}
619e434b34fSJonathan Roelofs 
getA1t5::A3620e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t5::A3621e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA3t5::A3622e434b34fSJonathan Roelofs     A3* getA3() {return this;}
623e434b34fSJonathan Roelofs };
624e434b34fSJonathan Roelofs 
625e434b34fSJonathan Roelofs struct A4
626e434b34fSJonathan Roelofs     : public A1,
627e434b34fSJonathan Roelofs       public virtual A2
628e434b34fSJonathan Roelofs {
629e434b34fSJonathan Roelofs     char _[13489];
~A4t5::A4630e434b34fSJonathan Roelofs     virtual ~A4() {}
631e434b34fSJonathan Roelofs 
getA1t5::A4632e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t5::A4633e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA4t5::A4634e434b34fSJonathan Roelofs     A4* getA4() {return this;}
635e434b34fSJonathan Roelofs };
636e434b34fSJonathan Roelofs 
637e434b34fSJonathan Roelofs struct A5
638e434b34fSJonathan Roelofs     : public A3,
639e434b34fSJonathan Roelofs       public A4
640e434b34fSJonathan Roelofs {
641e434b34fSJonathan Roelofs     char _[41389];
~A5t5::A5642e434b34fSJonathan Roelofs     virtual ~A5() {}
643e434b34fSJonathan Roelofs 
getA14t5::A5644e434b34fSJonathan Roelofs     A1* getA14() {return A4::getA1();}
getA13t5::A5645e434b34fSJonathan Roelofs     A1* getA13() {return A3::getA1();}
getA2t5::A5646e434b34fSJonathan Roelofs     A2* getA2() {return A4::getA2();}
getA3t5::A5647e434b34fSJonathan Roelofs     A3* getA3() {return A3::getA3();}
getA4t5::A5648e434b34fSJonathan Roelofs     A4* getA4() {return A4::getA4();}
getA5t5::A5649e434b34fSJonathan Roelofs     A5* getA5() {return this;}
650e434b34fSJonathan Roelofs };
651e434b34fSJonathan Roelofs 
test()652e434b34fSJonathan Roelofs void test()
653e434b34fSJonathan Roelofs {
654e434b34fSJonathan Roelofs     A1 a1;
655e434b34fSJonathan Roelofs     A2 a2;
656e434b34fSJonathan Roelofs     A3 a3;
657e434b34fSJonathan Roelofs     A4 a4;
658e434b34fSJonathan Roelofs     A5 a5;
659e434b34fSJonathan Roelofs 
660e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
661e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
662e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
663e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA2()) == 0);
664e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
665e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
666e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
667e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
668e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
669e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
670e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
671e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
672e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
673e434b34fSJonathan Roelofs 
674e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
675e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
676e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA1()) == 0);
677e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
678e434b34fSJonathan Roelofs //    assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());  // cast to protected base
679e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
680e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
681e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
682e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
683e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
684e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
685e434b34fSJonathan Roelofs //    assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());  // cast to protected base
686e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
687e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
688e434b34fSJonathan Roelofs 
689e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
690e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
691e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
692e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA2()) == 0);
693e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
694e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
695e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
696e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
697e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
698e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
699e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
700e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
701e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
702e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
703e434b34fSJonathan Roelofs 
704e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
705e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
706e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
707e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
708e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
709e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
710e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
711e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
712e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
713e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
714e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
715e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
716e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
717e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
718e434b34fSJonathan Roelofs 
719e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
720e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
721e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
722e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
723e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
724e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
725e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
726e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
727e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
728e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
729e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
730e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
731e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
732e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
733e434b34fSJonathan Roelofs }
734e434b34fSJonathan Roelofs 
735e434b34fSJonathan Roelofs }  // t5
736e434b34fSJonathan Roelofs 
737e434b34fSJonathan Roelofs namespace t6
738e434b34fSJonathan Roelofs {
739e434b34fSJonathan Roelofs 
740e434b34fSJonathan Roelofs struct A1
741e434b34fSJonathan Roelofs {
742e434b34fSJonathan Roelofs     char _[43981];
~A1t6::A1743e434b34fSJonathan Roelofs     virtual ~A1() {}
744e434b34fSJonathan Roelofs 
getA1t6::A1745e434b34fSJonathan Roelofs     A1* getA1() {return this;}
746e434b34fSJonathan Roelofs };
747e434b34fSJonathan Roelofs 
748e434b34fSJonathan Roelofs struct A2
749e434b34fSJonathan Roelofs {
750e434b34fSJonathan Roelofs     char _[34981];
~A2t6::A2751e434b34fSJonathan Roelofs     virtual ~A2() {}
752e434b34fSJonathan Roelofs 
getA2t6::A2753e434b34fSJonathan Roelofs     A2* getA2() {return this;}
754e434b34fSJonathan Roelofs };
755e434b34fSJonathan Roelofs 
756e434b34fSJonathan Roelofs struct A3
757e434b34fSJonathan Roelofs     : public A1,
758e434b34fSJonathan Roelofs       public virtual A2
759e434b34fSJonathan Roelofs {
760e434b34fSJonathan Roelofs     char _[93481];
~A3t6::A3761e434b34fSJonathan Roelofs     virtual ~A3() {}
762e434b34fSJonathan Roelofs 
getA1t6::A3763e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t6::A3764e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA3t6::A3765e434b34fSJonathan Roelofs     A3* getA3() {return this;}
766e434b34fSJonathan Roelofs };
767e434b34fSJonathan Roelofs 
768e434b34fSJonathan Roelofs struct A4
769e434b34fSJonathan Roelofs     : protected A1,
770e434b34fSJonathan Roelofs       public virtual A2
771e434b34fSJonathan Roelofs {
772e434b34fSJonathan Roelofs     char _[13489];
~A4t6::A4773e434b34fSJonathan Roelofs     virtual ~A4() {}
774e434b34fSJonathan Roelofs 
getA1t6::A4775e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t6::A4776e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA4t6::A4777e434b34fSJonathan Roelofs     A4* getA4() {return this;}
778e434b34fSJonathan Roelofs };
779e434b34fSJonathan Roelofs 
780e434b34fSJonathan Roelofs struct A5
781e434b34fSJonathan Roelofs     : public A3,
782e434b34fSJonathan Roelofs       public A4
783e434b34fSJonathan Roelofs {
784e434b34fSJonathan Roelofs     char _[41389];
~A5t6::A5785e434b34fSJonathan Roelofs     virtual ~A5() {}
786e434b34fSJonathan Roelofs 
getA14t6::A5787e434b34fSJonathan Roelofs     A1* getA14() {return A4::getA1();}
getA13t6::A5788e434b34fSJonathan Roelofs     A1* getA13() {return A3::getA1();}
getA2t6::A5789e434b34fSJonathan Roelofs     A2* getA2() {return A4::getA2();}
getA3t6::A5790e434b34fSJonathan Roelofs     A3* getA3() {return A3::getA3();}
getA4t6::A5791e434b34fSJonathan Roelofs     A4* getA4() {return A4::getA4();}
getA5t6::A5792e434b34fSJonathan Roelofs     A5* getA5() {return this;}
793e434b34fSJonathan Roelofs };
794e434b34fSJonathan Roelofs 
test()795e434b34fSJonathan Roelofs void test()
796e434b34fSJonathan Roelofs {
797e434b34fSJonathan Roelofs     A1 a1;
798e434b34fSJonathan Roelofs     A2 a2;
799e434b34fSJonathan Roelofs     A3 a3;
800e434b34fSJonathan Roelofs     A4 a4;
801e434b34fSJonathan Roelofs     A5 a5;
802e434b34fSJonathan Roelofs 
803e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
804e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
805e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
806e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
807e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
808e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
809e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA2()) == 0);
810e434b34fSJonathan Roelofs //    assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());  // cast to protected base
811e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
812e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
813e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
814e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
815e434b34fSJonathan Roelofs //    assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());  // cast to protected base
816e434b34fSJonathan Roelofs 
817e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
818e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
819e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
820e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
821e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
822e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
823e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
824e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
825e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA14()) == 0);
826e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
827e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
828e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
829e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
830e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
831e434b34fSJonathan Roelofs 
832e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
833e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
834e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
835e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
836e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
837e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
838e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
839e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
840e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA14()) == 0);
841e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
842e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
843e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
844e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
845e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
846e434b34fSJonathan Roelofs 
847e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
848e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
849e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
850e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
851e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
852e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA1()) == 0);
853e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
854e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
855e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA14()) == 0);
856e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
857e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
858e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
859e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
860e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
861e434b34fSJonathan Roelofs 
862e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
863e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
864e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
865e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
866e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
867e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
868e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
869e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
870e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA14()) == 0);
871e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
872e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
873e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
874e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
875e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
876e434b34fSJonathan Roelofs }
877e434b34fSJonathan Roelofs 
878e434b34fSJonathan Roelofs }  // t6
879e434b34fSJonathan Roelofs 
880e434b34fSJonathan Roelofs namespace t7
881e434b34fSJonathan Roelofs {
882e434b34fSJonathan Roelofs 
883e434b34fSJonathan Roelofs struct A1
884e434b34fSJonathan Roelofs {
885e434b34fSJonathan Roelofs     char _[43981];
~A1t7::A1886e434b34fSJonathan Roelofs     virtual ~A1() {}
887e434b34fSJonathan Roelofs 
getA1t7::A1888e434b34fSJonathan Roelofs     A1* getA1() {return this;}
889e434b34fSJonathan Roelofs };
890e434b34fSJonathan Roelofs 
891e434b34fSJonathan Roelofs struct A2
892e434b34fSJonathan Roelofs {
893e434b34fSJonathan Roelofs     char _[34981];
~A2t7::A2894e434b34fSJonathan Roelofs     virtual ~A2() {}
895e434b34fSJonathan Roelofs 
getA2t7::A2896e434b34fSJonathan Roelofs     A2* getA2() {return this;}
897e434b34fSJonathan Roelofs };
898e434b34fSJonathan Roelofs 
899e434b34fSJonathan Roelofs struct A3
900e434b34fSJonathan Roelofs     : public A1,
901e434b34fSJonathan Roelofs       public virtual A2
902e434b34fSJonathan Roelofs {
903e434b34fSJonathan Roelofs     char _[93481];
~A3t7::A3904e434b34fSJonathan Roelofs     virtual ~A3() {}
905e434b34fSJonathan Roelofs 
getA1t7::A3906e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t7::A3907e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA3t7::A3908e434b34fSJonathan Roelofs     A3* getA3() {return this;}
909e434b34fSJonathan Roelofs };
910e434b34fSJonathan Roelofs 
911e434b34fSJonathan Roelofs struct A4
912e434b34fSJonathan Roelofs     : public A1,
913e434b34fSJonathan Roelofs       protected virtual A2
914e434b34fSJonathan Roelofs {
915e434b34fSJonathan Roelofs     char _[13489];
~A4t7::A4916e434b34fSJonathan Roelofs     virtual ~A4() {}
917e434b34fSJonathan Roelofs 
getA1t7::A4918e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t7::A4919e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA4t7::A4920e434b34fSJonathan Roelofs     A4* getA4() {return this;}
921e434b34fSJonathan Roelofs };
922e434b34fSJonathan Roelofs 
923e434b34fSJonathan Roelofs struct A5
924e434b34fSJonathan Roelofs     : public A3,
925e434b34fSJonathan Roelofs       public A4
926e434b34fSJonathan Roelofs {
927e434b34fSJonathan Roelofs     char _[41389];
~A5t7::A5928e434b34fSJonathan Roelofs     virtual ~A5() {}
929e434b34fSJonathan Roelofs 
getA14t7::A5930e434b34fSJonathan Roelofs     A1* getA14() {return A4::getA1();}
getA13t7::A5931e434b34fSJonathan Roelofs     A1* getA13() {return A3::getA1();}
getA2t7::A5932e434b34fSJonathan Roelofs     A2* getA2() {return A4::getA2();}
getA3t7::A5933e434b34fSJonathan Roelofs     A3* getA3() {return A3::getA3();}
getA4t7::A5934e434b34fSJonathan Roelofs     A4* getA4() {return A4::getA4();}
getA5t7::A5935e434b34fSJonathan Roelofs     A5* getA5() {return this;}
936e434b34fSJonathan Roelofs };
937e434b34fSJonathan Roelofs 
test()938e434b34fSJonathan Roelofs void test()
939e434b34fSJonathan Roelofs {
940e434b34fSJonathan Roelofs     A1 a1;
941e434b34fSJonathan Roelofs     A2 a2;
942e434b34fSJonathan Roelofs     A3 a3;
943e434b34fSJonathan Roelofs     A4 a4;
944e434b34fSJonathan Roelofs     A5 a5;
945e434b34fSJonathan Roelofs 
946e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
947e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
948e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
949e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
950e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
951e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
952e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA2()) == 0);
953e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
954e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
955e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
956e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
957e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
958e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
959e434b34fSJonathan Roelofs 
960e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
961e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
962e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
963e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
964e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
965e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA1()) == 0);
966e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
967e434b34fSJonathan Roelofs //    assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());  // cast to protected base
968e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
969e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
970e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
971e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
972e434b34fSJonathan Roelofs //    assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());  // cast to protected base
973e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
974e434b34fSJonathan Roelofs 
975e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
976e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
977e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
978e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
979e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
980e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
981e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
982e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
983e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA14()) == a5.getA3());
984e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
985e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
986e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
987e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA4()) == a5.getA3());
988e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
989e434b34fSJonathan Roelofs 
990e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
991e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
992e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
993e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
994e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
995e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
996e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA2()) == 0);
997e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
998e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
999e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA13()) == a5.getA4());
1000e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
1001e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA3()) == a5.getA4());
1002e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
1003e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
1004e434b34fSJonathan Roelofs 
1005e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
1006e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
1007e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
1008e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
1009e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
1010e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
1011e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
1012e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
1013e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
1014e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
1015e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
1016e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
1017e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
1018e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
1019e434b34fSJonathan Roelofs }
1020e434b34fSJonathan Roelofs 
1021e434b34fSJonathan Roelofs }  // t7
1022e434b34fSJonathan Roelofs 
1023e434b34fSJonathan Roelofs namespace t8
1024e434b34fSJonathan Roelofs {
1025e434b34fSJonathan Roelofs 
1026e434b34fSJonathan Roelofs struct A1
1027e434b34fSJonathan Roelofs {
1028e434b34fSJonathan Roelofs     char _[43981];
~A1t8::A11029e434b34fSJonathan Roelofs     virtual ~A1() {}
1030e434b34fSJonathan Roelofs 
getA1t8::A11031e434b34fSJonathan Roelofs     A1* getA1() {return this;}
1032e434b34fSJonathan Roelofs };
1033e434b34fSJonathan Roelofs 
1034e434b34fSJonathan Roelofs struct A2
1035e434b34fSJonathan Roelofs {
1036e434b34fSJonathan Roelofs     char _[34981];
~A2t8::A21037e434b34fSJonathan Roelofs     virtual ~A2() {}
1038e434b34fSJonathan Roelofs 
getA2t8::A21039e434b34fSJonathan Roelofs     A2* getA2() {return this;}
1040e434b34fSJonathan Roelofs };
1041e434b34fSJonathan Roelofs 
1042e434b34fSJonathan Roelofs struct A3
1043e434b34fSJonathan Roelofs     : public A1,
1044e434b34fSJonathan Roelofs       public virtual A2
1045e434b34fSJonathan Roelofs {
1046e434b34fSJonathan Roelofs     char _[93481];
~A3t8::A31047e434b34fSJonathan Roelofs     virtual ~A3() {}
1048e434b34fSJonathan Roelofs 
getA1t8::A31049e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t8::A31050e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA3t8::A31051e434b34fSJonathan Roelofs     A3* getA3() {return this;}
1052e434b34fSJonathan Roelofs };
1053e434b34fSJonathan Roelofs 
1054e434b34fSJonathan Roelofs struct A4
1055e434b34fSJonathan Roelofs     : public A1,
1056e434b34fSJonathan Roelofs       public virtual A2
1057e434b34fSJonathan Roelofs {
1058e434b34fSJonathan Roelofs     char _[13489];
~A4t8::A41059e434b34fSJonathan Roelofs     virtual ~A4() {}
1060e434b34fSJonathan Roelofs 
getA1t8::A41061e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t8::A41062e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA4t8::A41063e434b34fSJonathan Roelofs     A4* getA4() {return this;}
1064e434b34fSJonathan Roelofs };
1065e434b34fSJonathan Roelofs 
1066e434b34fSJonathan Roelofs struct A5
1067e434b34fSJonathan Roelofs     : protected A3,
1068e434b34fSJonathan Roelofs       public A4
1069e434b34fSJonathan Roelofs {
1070e434b34fSJonathan Roelofs     char _[41389];
~A5t8::A51071e434b34fSJonathan Roelofs     virtual ~A5() {}
1072e434b34fSJonathan Roelofs 
getA14t8::A51073e434b34fSJonathan Roelofs     A1* getA14() {return A4::getA1();}
getA13t8::A51074e434b34fSJonathan Roelofs     A1* getA13() {return A3::getA1();}
getA2t8::A51075e434b34fSJonathan Roelofs     A2* getA2() {return A4::getA2();}
getA3t8::A51076e434b34fSJonathan Roelofs     A3* getA3() {return A3::getA3();}
getA4t8::A51077e434b34fSJonathan Roelofs     A4* getA4() {return A4::getA4();}
getA5t8::A51078e434b34fSJonathan Roelofs     A5* getA5() {return this;}
1079e434b34fSJonathan Roelofs };
1080e434b34fSJonathan Roelofs 
test()1081e434b34fSJonathan Roelofs void test()
1082e434b34fSJonathan Roelofs {
1083e434b34fSJonathan Roelofs     A1 a1;
1084e434b34fSJonathan Roelofs     A2 a2;
1085e434b34fSJonathan Roelofs     A3 a3;
1086e434b34fSJonathan Roelofs     A4 a4;
1087e434b34fSJonathan Roelofs     A5 a5;
1088e434b34fSJonathan Roelofs 
1089e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1090e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
1091e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1092e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
1093e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
1094e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
1095e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
1096e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
1097e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
1098e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
1099e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
1100e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
1101e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
1102e434b34fSJonathan Roelofs 
1103e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1104e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1105e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
1106e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1107e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1108e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
1109e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
1110e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
1111e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA14()) == a5.getA2());
1112e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA13()) == 0);
1113e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
1114e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
1115e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
1116e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
1117e434b34fSJonathan Roelofs 
1118e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1119e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1120e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
1121e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1122e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1123e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
1124e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
1125e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
1126e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA14()) == 0);
1127e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
1128e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
1129e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
1130e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA4()) == 0);
1131e434b34fSJonathan Roelofs //    assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());  // cast to protected base
1132e434b34fSJonathan Roelofs 
1133e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
1134e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
1135e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
1136e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
1137e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
1138e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
1139e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
1140e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
1141e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
1142e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA13()) == 0);
1143e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
1144e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA3()) == 0);
1145e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
1146e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());
1147e434b34fSJonathan Roelofs 
1148e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
1149e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
1150e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
1151e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
1152e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
1153e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
1154e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
1155e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
1156e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA14()) == a5.getA5());
1157e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA13()) == 0);
1158e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
1159e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA3()) == 0);
1160e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA4()) == a5.getA5());
1161e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
1162e434b34fSJonathan Roelofs }
1163e434b34fSJonathan Roelofs 
1164e434b34fSJonathan Roelofs }  // t8
1165e434b34fSJonathan Roelofs 
1166e434b34fSJonathan Roelofs namespace t9
1167e434b34fSJonathan Roelofs {
1168e434b34fSJonathan Roelofs 
1169e434b34fSJonathan Roelofs struct A1
1170e434b34fSJonathan Roelofs {
1171e434b34fSJonathan Roelofs     char _[43981];
~A1t9::A11172e434b34fSJonathan Roelofs     virtual ~A1() {}
1173e434b34fSJonathan Roelofs 
getA1t9::A11174e434b34fSJonathan Roelofs     A1* getA1() {return this;}
1175e434b34fSJonathan Roelofs };
1176e434b34fSJonathan Roelofs 
1177e434b34fSJonathan Roelofs struct A2
1178e434b34fSJonathan Roelofs {
1179e434b34fSJonathan Roelofs     char _[34981];
~A2t9::A21180e434b34fSJonathan Roelofs     virtual ~A2() {}
1181e434b34fSJonathan Roelofs 
getA2t9::A21182e434b34fSJonathan Roelofs     A2* getA2() {return this;}
1183e434b34fSJonathan Roelofs };
1184e434b34fSJonathan Roelofs 
1185e434b34fSJonathan Roelofs struct A3
1186e434b34fSJonathan Roelofs     : public A1,
1187e434b34fSJonathan Roelofs       public virtual A2
1188e434b34fSJonathan Roelofs {
1189e434b34fSJonathan Roelofs     char _[93481];
~A3t9::A31190e434b34fSJonathan Roelofs     virtual ~A3() {}
1191e434b34fSJonathan Roelofs 
getA1t9::A31192e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t9::A31193e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA3t9::A31194e434b34fSJonathan Roelofs     A3* getA3() {return this;}
1195e434b34fSJonathan Roelofs };
1196e434b34fSJonathan Roelofs 
1197e434b34fSJonathan Roelofs struct A4
1198e434b34fSJonathan Roelofs     : public A1,
1199e434b34fSJonathan Roelofs       public virtual A2
1200e434b34fSJonathan Roelofs {
1201e434b34fSJonathan Roelofs     char _[13489];
~A4t9::A41202e434b34fSJonathan Roelofs     virtual ~A4() {}
1203e434b34fSJonathan Roelofs 
getA1t9::A41204e434b34fSJonathan Roelofs     A1* getA1() {return A1::getA1();}
getA2t9::A41205e434b34fSJonathan Roelofs     A2* getA2() {return A2::getA2();}
getA4t9::A41206e434b34fSJonathan Roelofs     A4* getA4() {return this;}
1207e434b34fSJonathan Roelofs };
1208e434b34fSJonathan Roelofs 
1209e434b34fSJonathan Roelofs struct A5
1210e434b34fSJonathan Roelofs     : public A3,
1211e434b34fSJonathan Roelofs       protected A4
1212e434b34fSJonathan Roelofs {
1213e434b34fSJonathan Roelofs     char _[41389];
~A5t9::A51214e434b34fSJonathan Roelofs     virtual ~A5() {}
1215e434b34fSJonathan Roelofs 
getA14t9::A51216e434b34fSJonathan Roelofs     A1* getA14() {return A4::getA1();}
getA13t9::A51217e434b34fSJonathan Roelofs     A1* getA13() {return A3::getA1();}
getA2t9::A51218e434b34fSJonathan Roelofs     A2* getA2() {return A4::getA2();}
getA3t9::A51219e434b34fSJonathan Roelofs     A3* getA3() {return A3::getA3();}
getA4t9::A51220e434b34fSJonathan Roelofs     A4* getA4() {return A4::getA4();}
getA5t9::A51221e434b34fSJonathan Roelofs     A5* getA5() {return this;}
1222e434b34fSJonathan Roelofs };
1223e434b34fSJonathan Roelofs 
test()1224e434b34fSJonathan Roelofs void test()
1225e434b34fSJonathan Roelofs {
1226e434b34fSJonathan Roelofs     A1 a1;
1227e434b34fSJonathan Roelofs     A2 a2;
1228e434b34fSJonathan Roelofs     A3 a3;
1229e434b34fSJonathan Roelofs     A4 a4;
1230e434b34fSJonathan Roelofs     A5 a5;
1231e434b34fSJonathan Roelofs 
1232e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a1.getA1()) == a1.getA1());
1233e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a2.getA2()) == 0);
1234e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA1()) == a3.getA1());
1235e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA2()) == a3.getA1());
1236e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a3.getA3()) == a3.getA1());
1237e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA1()) == a4.getA1());
1238e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA2()) == a4.getA1());
1239e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a4.getA4()) == a4.getA1());
1240e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA14()) == a5.getA14());
1241e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA13()) == a5.getA13());
1242e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA2()) == 0);
1243e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA3()) == a5.getA13());
1244e434b34fSJonathan Roelofs     assert(dynamic_cast<A1*>(a5.getA4()) == a5.getA14());
1245e434b34fSJonathan Roelofs 
1246e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a1.getA1()) == 0);
1247e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a2.getA2()) == a2.getA2());
1248e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA1()) == a3.getA2());
1249e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA2()) == a3.getA2());
1250e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a3.getA3()) == a3.getA2());
1251e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA1()) == a4.getA2());
1252e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA2()) == a4.getA2());
1253e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a4.getA4()) == a4.getA2());
1254e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA14()) == 0);
1255e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA13()) == a5.getA2());
1256e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA2()) == a5.getA2());
1257e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA3()) == a5.getA2());
1258e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA4()) == a5.getA2());
1259e434b34fSJonathan Roelofs     assert(dynamic_cast<A2*>(a5.getA5()) == a5.getA2());
1260e434b34fSJonathan Roelofs 
1261e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a1.getA1()) == 0);
1262e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a2.getA2()) == 0);
1263e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA1()) == a3.getA3());
1264e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA2()) == a3.getA3());
1265e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a3.getA3()) == a3.getA3());
1266e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA1()) == 0);
1267e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA2()) == 0);
1268e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a4.getA4()) == 0);
1269e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA14()) == 0);
1270e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA13()) == a5.getA3());
1271e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA2()) == a5.getA3());
1272e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA3()) == a5.getA3());
1273e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA4()) == 0);
1274e434b34fSJonathan Roelofs     assert(dynamic_cast<A3*>(a5.getA5()) == a5.getA3());
1275e434b34fSJonathan Roelofs 
1276e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a1.getA1()) == 0);
1277e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a2.getA2()) == 0);
1278e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA1()) == 0);
1279e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA2()) == 0);
1280e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a3.getA3()) == 0);
1281e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA1()) == a4.getA4());
1282e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA2()) == a4.getA4());
1283e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a4.getA4()) == a4.getA4());
1284e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA14()) == a5.getA4());
1285e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA13()) == 0);
1286e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA2()) == a5.getA4());
1287e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA3()) == 0);
1288e434b34fSJonathan Roelofs     assert(dynamic_cast<A4*>(a5.getA4()) == a5.getA4());
1289e434b34fSJonathan Roelofs //    assert(dynamic_cast<A4*>(a5.getA5()) == a5.getA4());  // cast to protected base
1290e434b34fSJonathan Roelofs 
1291e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a1.getA1()) == 0);
1292e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a2.getA2()) == 0);
1293e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA1()) == 0);
1294e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA2()) == 0);
1295e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a3.getA3()) == 0);
1296e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA1()) == 0);
1297e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA2()) == 0);
1298e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a4.getA4()) == 0);
1299e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA14()) == 0);
1300e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA13()) == a5.getA5());
1301e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA2()) == a5.getA5());
1302e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA3()) == a5.getA5());
1303e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA4()) == 0);
1304e434b34fSJonathan Roelofs     assert(dynamic_cast<A5*>(a5.getA5()) == a5.getA5());
1305e434b34fSJonathan Roelofs }
1306e434b34fSJonathan Roelofs 
1307e434b34fSJonathan Roelofs }  // t9
1308e434b34fSJonathan Roelofs 
1309e434b34fSJonathan Roelofs 
main(int,char **)1310504bc07dSLouis Dionne int main(int, char**)
1311e434b34fSJonathan Roelofs {
1312e434b34fSJonathan Roelofs     timer t;
1313e434b34fSJonathan Roelofs     t1::test();
1314e434b34fSJonathan Roelofs     t2::test();
1315e434b34fSJonathan Roelofs     t3::test();
1316e434b34fSJonathan Roelofs     t4::test();
1317e434b34fSJonathan Roelofs     t5::test();
1318e434b34fSJonathan Roelofs     t6::test();
1319e434b34fSJonathan Roelofs     t7::test();
1320e434b34fSJonathan Roelofs     t8::test();
1321e434b34fSJonathan Roelofs     t9::test();
1322504bc07dSLouis Dionne 
1323504bc07dSLouis Dionne     return 0;
1324e434b34fSJonathan Roelofs }
1325