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