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