1*11efff7fSkettenis /* This test script is part of GDB, the GNU debugger.
2*11efff7fSkettenis
3*11efff7fSkettenis Copyright 1993, 1994, 1997, 1998, 1999, 2003, 2004,
4*11efff7fSkettenis Free Software Foundation, Inc.
5*11efff7fSkettenis
6*11efff7fSkettenis This program is free software; you can redistribute it and/or modify
7*11efff7fSkettenis it under the terms of the GNU General Public License as published by
8*11efff7fSkettenis the Free Software Foundation; either version 2 of the License, or
9*11efff7fSkettenis (at your option) any later version.
10*11efff7fSkettenis
11*11efff7fSkettenis This program is distributed in the hope that it will be useful,
12*11efff7fSkettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
13*11efff7fSkettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14*11efff7fSkettenis GNU General Public License for more details.
15*11efff7fSkettenis
16*11efff7fSkettenis You should have received a copy of the GNU General Public License
17*11efff7fSkettenis along with this program; if not, write to the Free Software
18*11efff7fSkettenis Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19*11efff7fSkettenis */
20*11efff7fSkettenis
21b725ae77Skettenis // Pls try the following program on virtual functions and try to do print on
22b725ae77Skettenis // most of the code in main(). Almost none of them works !
23b725ae77Skettenis
24b725ae77Skettenis //
25b725ae77Skettenis // The inheritance structure is:
26b725ae77Skettenis //
27b725ae77Skettenis // V : VA VB
28b725ae77Skettenis // A : (V)
29b725ae77Skettenis // B : A
30b725ae77Skettenis // D : AD (V)
31b725ae77Skettenis // C : (V)
32b725ae77Skettenis // E : B (V) D C
33b725ae77Skettenis //
34b725ae77Skettenis
35b725ae77Skettenis class VA
36b725ae77Skettenis {
37b725ae77Skettenis public:
38b725ae77Skettenis int va;
39b725ae77Skettenis };
40b725ae77Skettenis
41b725ae77Skettenis class VB
42b725ae77Skettenis {
43b725ae77Skettenis public:
44b725ae77Skettenis int vb;
45b725ae77Skettenis int fvb();
46b725ae77Skettenis virtual int vvb();
47b725ae77Skettenis };
48b725ae77Skettenis
49b725ae77Skettenis class V : public VA, public VB
50b725ae77Skettenis {
51b725ae77Skettenis public:
52b725ae77Skettenis int f();
53b725ae77Skettenis virtual int vv();
54b725ae77Skettenis int w;
55b725ae77Skettenis };
56b725ae77Skettenis
57b725ae77Skettenis class A : virtual public V
58b725ae77Skettenis {
59b725ae77Skettenis public:
60b725ae77Skettenis virtual int f();
61b725ae77Skettenis private:
62b725ae77Skettenis int a;
63b725ae77Skettenis };
64b725ae77Skettenis
65b725ae77Skettenis class B : public A
66b725ae77Skettenis {
67b725ae77Skettenis public:
68b725ae77Skettenis int f();
69b725ae77Skettenis private:
70b725ae77Skettenis int b;
71b725ae77Skettenis };
72b725ae77Skettenis
73b725ae77Skettenis class C : public virtual V
74b725ae77Skettenis {
75b725ae77Skettenis public:
76b725ae77Skettenis int c;
77b725ae77Skettenis };
78b725ae77Skettenis
79b725ae77Skettenis class AD
80b725ae77Skettenis {
81b725ae77Skettenis public:
82b725ae77Skettenis virtual int vg() = 0;
83b725ae77Skettenis };
84b725ae77Skettenis
85b725ae77Skettenis class D : public AD, virtual public V
86b725ae77Skettenis {
87b725ae77Skettenis public:
88b725ae77Skettenis static void s();
89b725ae77Skettenis virtual int vg();
90b725ae77Skettenis virtual int vd();
91b725ae77Skettenis int fd();
92b725ae77Skettenis int d;
93b725ae77Skettenis };
94b725ae77Skettenis
95b725ae77Skettenis class E : public B, virtual public V, public D, public C
96b725ae77Skettenis {
97b725ae77Skettenis public:
98b725ae77Skettenis int f();
99b725ae77Skettenis int vg();
100b725ae77Skettenis int vv();
101b725ae77Skettenis int e;
102b725ae77Skettenis };
103b725ae77Skettenis
104b725ae77Skettenis D dd;
105b725ae77Skettenis D* ppd = ⅆ
106b725ae77Skettenis AD* pAd = ⅆ
107b725ae77Skettenis
108b725ae77Skettenis A a;
109b725ae77Skettenis B b;
110b725ae77Skettenis C c;
111b725ae77Skettenis D d;
112b725ae77Skettenis E e;
113b725ae77Skettenis V v;
114b725ae77Skettenis VB vb;
115b725ae77Skettenis
116b725ae77Skettenis
117b725ae77Skettenis A* pAa = &a;
118b725ae77Skettenis A* pAe = &e;
119b725ae77Skettenis
120b725ae77Skettenis B* pBe = &e;
121b725ae77Skettenis
122b725ae77Skettenis D* pDd = &d;
123b725ae77Skettenis D* pDe = &e;
124b725ae77Skettenis
125b725ae77Skettenis V* pVa = &a;
126b725ae77Skettenis V* pVv = &v;
127b725ae77Skettenis V* pVe = &e;
128b725ae77Skettenis V* pVd = &d;
129b725ae77Skettenis
130b725ae77Skettenis AD* pADe = &e;
131b725ae77Skettenis
132b725ae77Skettenis E* pEe = &e;
133b725ae77Skettenis
134b725ae77Skettenis VB* pVB = &vb;
135b725ae77Skettenis
init()136b725ae77Skettenis void init()
137b725ae77Skettenis {
138b725ae77Skettenis a.vb = 1;
139b725ae77Skettenis b.vb = 2;
140b725ae77Skettenis c.vb = 3;
141b725ae77Skettenis d.vb = 4;
142b725ae77Skettenis e.vb = 5;
143b725ae77Skettenis v.vb = 6;
144b725ae77Skettenis vb.vb = 7;
145b725ae77Skettenis
146b725ae77Skettenis d.d = 1;
147b725ae77Skettenis e.d = 2;
148b725ae77Skettenis }
149b725ae77Skettenis
150b725ae77Skettenis extern "C" int printf(const char *, ...);
151b725ae77Skettenis
152b725ae77Skettenis int all_count = 0;
153b725ae77Skettenis int failed_count = 0;
154b725ae77Skettenis
155b725ae77Skettenis #define TEST(EXPR, EXPECTED) \
156b725ae77Skettenis ret = EXPR; \
157b725ae77Skettenis if (ret != EXPECTED) {\
158b725ae77Skettenis printf("Failed %s is %d, should be %d!\n", #EXPR, ret, EXPECTED); \
159b725ae77Skettenis failed_count++; } \
160b725ae77Skettenis all_count++;
161b725ae77Skettenis
162b725ae77Skettenis int ret;
163b725ae77Skettenis
test_calls()164b725ae77Skettenis void test_calls()
165b725ae77Skettenis {
166b725ae77Skettenis TEST(pAe->f(), 20);
167b725ae77Skettenis TEST(pAa->f(), 1);
168b725ae77Skettenis
169b725ae77Skettenis TEST(pDe->vg(), 202);
170b725ae77Skettenis TEST(pADe->vg(), 202);
171b725ae77Skettenis TEST(pDd->vg(), 101);
172b725ae77Skettenis
173b725ae77Skettenis TEST(pEe->vvb(), 411);
174b725ae77Skettenis
175b725ae77Skettenis TEST(pVB->vvb(), 407);
176b725ae77Skettenis
177b725ae77Skettenis TEST(pBe->vvb(), 411);
178b725ae77Skettenis TEST(pDe->vvb(), 411);
179b725ae77Skettenis
180b725ae77Skettenis TEST(pEe->vd(), 282);
181b725ae77Skettenis TEST(pEe->fvb(), 311);
182b725ae77Skettenis
183b725ae77Skettenis TEST(pEe->D::vg(), 102);
184b725ae77Skettenis printf("Did %d tests, of which %d failed.\n", all_count, failed_count);
185b725ae77Skettenis }
186b725ae77Skettenis #ifdef usestubs
187b725ae77Skettenis extern "C" {
188b725ae77Skettenis void set_debug_traps();
189b725ae77Skettenis void breakpoint();
190b725ae77Skettenis };
191b725ae77Skettenis #endif
192b725ae77Skettenis
main()193b725ae77Skettenis int main()
194b725ae77Skettenis {
195b725ae77Skettenis #ifdef usestubs
196b725ae77Skettenis set_debug_traps();
197b725ae77Skettenis breakpoint();
198b725ae77Skettenis #endif
199b725ae77Skettenis init();
200b725ae77Skettenis
201b725ae77Skettenis e.w = 7;
202b725ae77Skettenis e.vb = 11;
203b725ae77Skettenis
204b725ae77Skettenis test_calls();
205b725ae77Skettenis return 0;
206b725ae77Skettenis
207b725ae77Skettenis }
208b725ae77Skettenis
f()209b725ae77Skettenis int A::f() {return 1;}
f()210b725ae77Skettenis int B::f() {return 2;}
s()211b725ae77Skettenis void D::s() {}
f()212b725ae77Skettenis int E::f() {return 20;}
vg()213b725ae77Skettenis int D::vg() {return 100+d;}
vg()214b725ae77Skettenis int E::vg() {return 200+d;}
f()215b725ae77Skettenis int V::f() {return 600+w;}
vv()216b725ae77Skettenis int V::vv() {return 400+w;}
vv()217b725ae77Skettenis int E::vv() {return 450+w;}
fd()218b725ae77Skettenis int D::fd() {return 250+d;}
vd()219b725ae77Skettenis int D::vd() {return 280+d;}
fvb()220b725ae77Skettenis int VB::fvb() {return 300+vb;}
vvb()221b725ae77Skettenis int VB::vvb() {return 400+vb;}
222