classes.cc revision 1.1 1 1.1 christos /* This testcase is part of GDB, the GNU debugger.
2 1.1 christos
3 1.1 christos Copyright 1993-2014 Free Software Foundation, Inc.
4 1.1 christos
5 1.1 christos This program is free software; you can redistribute it and/or modify
6 1.1 christos it under the terms of the GNU General Public License as published by
7 1.1 christos the Free Software Foundation; either version 3 of the License, or
8 1.1 christos (at your option) any later version.
9 1.1 christos
10 1.1 christos This program is distributed in the hope that it will be useful,
11 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
12 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 1.1 christos GNU General Public License for more details.
14 1.1 christos
15 1.1 christos You should have received a copy of the GNU General Public License
16 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
17 1.1 christos
18 1.1 christos // Test various -*- C++ -*- things.
19 1.1 christos
20 1.1 christos // ====================== basic C++ types =======================
21 1.1 christos bool v_bool;
22 1.1 christos bool v_bool_array[2];
23 1.1 christos
24 1.1 christos typedef struct fleep fleep;
25 1.1 christos struct fleep { int a; } s;
26 1.1 christos
27 1.1 christos // ====================== simple class structures =======================
28 1.1 christos
29 1.1 christos struct default_public_struct {
30 1.1 christos // defaults to public:
31 1.1 christos int a;
32 1.1 christos int b;
33 1.1 christos };
34 1.1 christos
35 1.1 christos struct explicit_public_struct {
36 1.1 christos public:
37 1.1 christos int a;
38 1.1 christos int b;
39 1.1 christos };
40 1.1 christos
41 1.1 christos struct protected_struct {
42 1.1 christos protected:
43 1.1 christos int a;
44 1.1 christos int b;
45 1.1 christos };
46 1.1 christos
47 1.1 christos struct private_struct {
48 1.1 christos private:
49 1.1 christos int a;
50 1.1 christos int b;
51 1.1 christos };
52 1.1 christos
53 1.1 christos struct mixed_protection_struct {
54 1.1 christos public:
55 1.1 christos int a;
56 1.1 christos int b;
57 1.1 christos private:
58 1.1 christos int c;
59 1.1 christos int d;
60 1.1 christos protected:
61 1.1 christos int e;
62 1.1 christos int f;
63 1.1 christos public:
64 1.1 christos int g;
65 1.1 christos private:
66 1.1 christos int h;
67 1.1 christos protected:
68 1.1 christos int i;
69 1.1 christos };
70 1.1 christos
71 1.1 christos class public_class {
72 1.1 christos public:
73 1.1 christos int a;
74 1.1 christos int b;
75 1.1 christos };
76 1.1 christos
77 1.1 christos class protected_class {
78 1.1 christos protected:
79 1.1 christos int a;
80 1.1 christos int b;
81 1.1 christos };
82 1.1 christos
83 1.1 christos class default_private_class {
84 1.1 christos // defaults to private:
85 1.1 christos int a;
86 1.1 christos int b;
87 1.1 christos };
88 1.1 christos
89 1.1 christos class explicit_private_class {
90 1.1 christos private:
91 1.1 christos int a;
92 1.1 christos int b;
93 1.1 christos };
94 1.1 christos
95 1.1 christos class mixed_protection_class {
96 1.1 christos public:
97 1.1 christos int a;
98 1.1 christos int b;
99 1.1 christos private:
100 1.1 christos int c;
101 1.1 christos int d;
102 1.1 christos protected:
103 1.1 christos int e;
104 1.1 christos int f;
105 1.1 christos public:
106 1.1 christos int g;
107 1.1 christos private:
108 1.1 christos int h;
109 1.1 christos protected:
110 1.1 christos int i;
111 1.1 christos };
112 1.1 christos
113 1.1 christos class const_vol_method_class {
114 1.1 christos public:
115 1.1 christos int a;
116 1.1 christos int b;
117 1.1 christos int foo (int &) const;
118 1.1 christos int bar (int &) volatile;
119 1.1 christos int baz (int &) const volatile;
120 1.1 christos };
121 1.1 christos
122 1.1 christos int const_vol_method_class::foo (int & ir) const
123 1.1 christos {
124 1.1 christos return ir + 3;
125 1.1 christos }
126 1.1 christos int const_vol_method_class::bar (int & ir) volatile
127 1.1 christos {
128 1.1 christos return ir + 4;
129 1.1 christos }
130 1.1 christos int const_vol_method_class::baz (int & ir) const volatile
131 1.1 christos {
132 1.1 christos return ir + 5;
133 1.1 christos }
134 1.1 christos
135 1.1 christos // ========================= simple inheritance ==========================
136 1.1 christos
137 1.1 christos class A {
138 1.1 christos public:
139 1.1 christos int a;
140 1.1 christos int x;
141 1.1 christos };
142 1.1 christos
143 1.1 christos A g_A;
144 1.1 christos
145 1.1 christos class B : public A {
146 1.1 christos public:
147 1.1 christos int b;
148 1.1 christos int x;
149 1.1 christos };
150 1.1 christos
151 1.1 christos B g_B;
152 1.1 christos
153 1.1 christos class C : public A {
154 1.1 christos public:
155 1.1 christos int c;
156 1.1 christos int x;
157 1.1 christos };
158 1.1 christos
159 1.1 christos C g_C;
160 1.1 christos
161 1.1 christos class D : public B, public C {
162 1.1 christos public:
163 1.1 christos int d;
164 1.1 christos int x;
165 1.1 christos };
166 1.1 christos
167 1.1 christos D g_D;
168 1.1 christos
169 1.1 christos class E : public D {
170 1.1 christos public:
171 1.1 christos int e;
172 1.1 christos int x;
173 1.1 christos };
174 1.1 christos
175 1.1 christos E g_E;
176 1.1 christos
177 1.1 christos class class_with_anon_union
178 1.1 christos {
179 1.1 christos public:
180 1.1 christos int one;
181 1.1 christos union
182 1.1 christos {
183 1.1 christos int a;
184 1.1 christos long b;
185 1.1 christos };
186 1.1 christos };
187 1.1 christos
188 1.1 christos class_with_anon_union g_anon_union;
189 1.1 christos
190 1.1 christos void inheritance2 (void)
191 1.1 christos {
192 1.1 christos }
193 1.1 christos
194 1.1 christos void inheritance1 (void)
195 1.1 christos {
196 1.1 christos int ival;
197 1.1 christos int *intp;
198 1.1 christos
199 1.1 christos // {A::a, A::x}
200 1.1 christos
201 1.1 christos g_A.A::a = 1;
202 1.1 christos g_A.A::x = 2;
203 1.1 christos
204 1.1 christos // {{A::a,A::x},B::b,B::x}
205 1.1 christos
206 1.1 christos g_B.A::a = 3;
207 1.1 christos g_B.A::x = 4;
208 1.1 christos g_B.B::b = 5;
209 1.1 christos g_B.B::x = 6;
210 1.1 christos
211 1.1 christos // {{A::a,A::x},C::c,C::x}
212 1.1 christos
213 1.1 christos g_C.A::a = 7;
214 1.1 christos g_C.A::x = 8;
215 1.1 christos g_C.C::c = 9;
216 1.1 christos g_C.C::x = 10;
217 1.1 christos
218 1.1 christos // {{{A::a,A::x},B::b,B::x},{{A::a,A::x},C::c,C::x},D::d,D::x}
219 1.1 christos
220 1.1 christos // The following initialization code is non-portable, but allows us
221 1.1 christos // to initialize all members of g_D until we can fill in the missing
222 1.1 christos // initialization code with legal C++ code.
223 1.1 christos
224 1.1 christos for (intp = (int *) &g_D, ival = 11;
225 1.1 christos intp < ((int *) &g_D + sizeof (g_D) / sizeof (int));
226 1.1 christos intp++, ival++)
227 1.1 christos {
228 1.1 christos *intp = ival;
229 1.1 christos }
230 1.1 christos
231 1.1 christos // Overlay the nonportable initialization with legal initialization.
232 1.1 christos
233 1.1 christos // ????? = 11; (g_D.A::a = 11; is ambiguous)
234 1.1 christos // ????? = 12; (g_D.A::x = 12; is ambiguous)
235 1.1 christos /* djb 6-3-2000
236 1.1 christos
237 1.1 christos This should take care of it. Rather than try to initialize using an ambiguous
238 1.1 christos construct, use 2 unambiguous ones for each. Since the ambiguous a/x member is
239 1.1 christos coming from C, and B, initialize D's C::a, and B::a, and D's C::x and B::x.
240 1.1 christos */
241 1.1 christos g_D.C::a = 15;
242 1.1 christos g_D.C::x = 12;
243 1.1 christos g_D.B::a = 11;
244 1.1 christos g_D.B::x = 12;
245 1.1 christos g_D.B::b = 13;
246 1.1 christos g_D.B::x = 14;
247 1.1 christos // ????? = 15;
248 1.1 christos // ????? = 16;
249 1.1 christos g_D.C::c = 17;
250 1.1 christos g_D.C::x = 18;
251 1.1 christos g_D.D::d = 19;
252 1.1 christos g_D.D::x = 20;
253 1.1 christos
254 1.1 christos
255 1.1 christos // {{{{A::a,A::x},B::b,B::x},{{A::a,A::x},C::c,C::x},D::d,D::x}},E::e,E::x}
256 1.1 christos
257 1.1 christos // The following initialization code is non-portable, but allows us
258 1.1 christos // to initialize all members of g_D until we can fill in the missing
259 1.1 christos // initialization code with legal C++ code.
260 1.1 christos
261 1.1 christos for (intp = (int *) &g_E, ival = 21;
262 1.1 christos intp < ((int *) &g_E + sizeof (g_E) / sizeof (int));
263 1.1 christos intp++, ival++)
264 1.1 christos {
265 1.1 christos *intp = ival;
266 1.1 christos }
267 1.1 christos
268 1.1 christos // Overlay the nonportable initialization with legal initialization.
269 1.1 christos
270 1.1 christos // ????? = 21; (g_E.A::a = 21; is ambiguous)
271 1.1 christos // ????? = 22; (g_E.A::x = 22; is ambiguous)
272 1.1 christos g_E.B::b = 23;
273 1.1 christos g_E.B::x = 24;
274 1.1 christos // ????? = 25;
275 1.1 christos // ????? = 26;
276 1.1 christos g_E.C::c = 27;
277 1.1 christos g_E.C::x = 28;
278 1.1 christos g_E.D::d = 29;
279 1.1 christos g_E.D::x = 30;
280 1.1 christos g_E.E::e = 31;
281 1.1 christos g_E.E::x = 32;
282 1.1 christos
283 1.1 christos g_anon_union.one = 1;
284 1.1 christos g_anon_union.a = 2;
285 1.1 christos
286 1.1 christos inheritance2 ();
287 1.1 christos }
288 1.1 christos
289 1.1 christos // ======================== static member functions =====================
290 1.1 christos
291 1.1 christos class Static {
292 1.1 christos public:
293 1.1 christos static void ii(int, int);
294 1.1 christos };
295 1.1 christos void Static::ii (int, int) { }
296 1.1 christos
297 1.1 christos // ======================== virtual base classes=========================
298 1.1 christos
299 1.1 christos class vA {
300 1.1 christos public:
301 1.1 christos int va;
302 1.1 christos int vx;
303 1.1 christos };
304 1.1 christos
305 1.1 christos vA g_vA;
306 1.1 christos
307 1.1 christos class vB : public virtual vA {
308 1.1 christos public:
309 1.1 christos int vb;
310 1.1 christos int vx;
311 1.1 christos };
312 1.1 christos
313 1.1 christos vB g_vB;
314 1.1 christos
315 1.1 christos class vC : public virtual vA {
316 1.1 christos public:
317 1.1 christos int vc;
318 1.1 christos int vx;
319 1.1 christos };
320 1.1 christos
321 1.1 christos vC g_vC;
322 1.1 christos
323 1.1 christos class vD : public virtual vB, public virtual vC {
324 1.1 christos public:
325 1.1 christos int vd;
326 1.1 christos int vx;
327 1.1 christos };
328 1.1 christos
329 1.1 christos vD g_vD;
330 1.1 christos
331 1.1 christos class vE : public virtual vD {
332 1.1 christos public:
333 1.1 christos int ve;
334 1.1 christos int vx;
335 1.1 christos };
336 1.1 christos
337 1.1 christos vE g_vE;
338 1.1 christos
339 1.1 christos void inheritance4 (void)
340 1.1 christos {
341 1.1 christos }
342 1.1 christos
343 1.1 christos void inheritance3 (void)
344 1.1 christos {
345 1.1 christos int ival;
346 1.1 christos int *intp;
347 1.1 christos
348 1.1 christos // {vA::va, vA::vx}
349 1.1 christos
350 1.1 christos g_vA.vA::va = 1;
351 1.1 christos g_vA.vA::vx = 2;
352 1.1 christos
353 1.1 christos // {{vA::va, vA::vx}, vB::vb, vB::vx}
354 1.1 christos
355 1.1 christos g_vB.vA::va = 3;
356 1.1 christos g_vB.vA::vx = 4;
357 1.1 christos g_vB.vB::vb = 5;
358 1.1 christos g_vB.vB::vx = 6;
359 1.1 christos
360 1.1 christos // {{vA::va, vA::vx}, vC::vc, vC::vx}
361 1.1 christos
362 1.1 christos g_vC.vA::va = 7;
363 1.1 christos g_vC.vA::vx = 8;
364 1.1 christos g_vC.vC::vc = 9;
365 1.1 christos g_vC.vC::vx = 10;
366 1.1 christos
367 1.1 christos // {{{{vA::va, vA::vx}, vB::vb, vB::vx}, vC::vc, vC::vx}, vD::vd,vD::vx}
368 1.1 christos
369 1.1 christos g_vD.vA::va = 11;
370 1.1 christos g_vD.vA::vx = 12;
371 1.1 christos g_vD.vB::vb = 13;
372 1.1 christos g_vD.vB::vx = 14;
373 1.1 christos g_vD.vC::vc = 15;
374 1.1 christos g_vD.vC::vx = 16;
375 1.1 christos g_vD.vD::vd = 17;
376 1.1 christos g_vD.vD::vx = 18;
377 1.1 christos
378 1.1 christos
379 1.1 christos // {{{{{vA::va,vA::vx},vB::vb,vB::vx},vC::vc,vC::vx},vD::vd,vD::vx},vE::ve,vE::vx}
380 1.1 christos
381 1.1 christos g_vD.vA::va = 19;
382 1.1 christos g_vD.vA::vx = 20;
383 1.1 christos g_vD.vB::vb = 21;
384 1.1 christos g_vD.vB::vx = 22;
385 1.1 christos g_vD.vC::vc = 23;
386 1.1 christos g_vD.vC::vx = 24;
387 1.1 christos g_vD.vD::vd = 25;
388 1.1 christos g_vD.vD::vx = 26;
389 1.1 christos g_vE.vE::ve = 27;
390 1.1 christos g_vE.vE::vx = 28;
391 1.1 christos
392 1.1 christos inheritance4 ();
393 1.1 christos }
394 1.1 christos
395 1.1 christos // ======================================================================
396 1.1 christos
397 1.1 christos class Base1 {
398 1.1 christos public:
399 1.1 christos int x;
400 1.1 christos Base1(int i) { x = i; }
401 1.1 christos ~Base1 () { }
402 1.1 christos };
403 1.1 christos
404 1.1 christos typedef Base1 base1;
405 1.1 christos
406 1.1 christos class Foo
407 1.1 christos {
408 1.1 christos public:
409 1.1 christos int x;
410 1.1 christos int y;
411 1.1 christos static int st;
412 1.1 christos Foo (int i, int j) { x = i; y = j; }
413 1.1 christos int operator! ();
414 1.1 christos operator int ();
415 1.1 christos int times (int y);
416 1.1 christos };
417 1.1 christos
418 1.1 christos typedef Foo ByAnyOtherName;
419 1.1 christos
420 1.1 christos class Bar : public Base1, public Foo {
421 1.1 christos public:
422 1.1 christos int z;
423 1.1 christos Bar (int i, int j, int k) : Base1 (10*k), Foo (i, j) { z = k; }
424 1.1 christos };
425 1.1 christos
426 1.1 christos int Foo::operator! () { return !x; }
427 1.1 christos
428 1.1 christos int Foo::times (int y) { return x * y; }
429 1.1 christos
430 1.1 christos int Foo::st = 100;
431 1.1 christos
432 1.1 christos Foo::operator int() { return x; }
433 1.1 christos
434 1.1 christos ByAnyOtherName foo(10, 11);
435 1.1 christos Bar bar(20, 21, 22);
436 1.1 christos
437 1.1 christos class ClassWithEnum {
438 1.1 christos public:
439 1.1 christos enum PrivEnum { red, green, blue, yellow = 42 };
440 1.1 christos PrivEnum priv_enum;
441 1.1 christos int x;
442 1.1 christos };
443 1.1 christos
444 1.1 christos void enums2 (void)
445 1.1 christos {
446 1.1 christos }
447 1.1 christos
448 1.1 christos /* classes.exp relies on statement order in this function for testing
449 1.1 christos enumeration fields. */
450 1.1 christos
451 1.1 christos void enums1 ()
452 1.1 christos {
453 1.1 christos ClassWithEnum obj_with_enum;
454 1.1 christos obj_with_enum.priv_enum = ClassWithEnum::red;
455 1.1 christos obj_with_enum.x = 0;
456 1.1 christos enums2 ();
457 1.1 christos obj_with_enum.priv_enum = ClassWithEnum::green;
458 1.1 christos obj_with_enum.x = 1;
459 1.1 christos }
460 1.1 christos
461 1.1 christos class ClassParam {
462 1.1 christos public:
463 1.1 christos int Aptr_a (A *a) { return a->a; }
464 1.1 christos int Aptr_x (A *a) { return a->x; }
465 1.1 christos int Aref_a (A &a) { return a.a; }
466 1.1 christos int Aref_x (A &a) { return a.x; }
467 1.1 christos int Aval_a (A a) { return a.a; }
468 1.1 christos int Aval_x (A a) { return a.x; }
469 1.1 christos };
470 1.1 christos
471 1.1 christos ClassParam class_param;
472 1.1 christos
473 1.1 christos class Contains_static_instance
474 1.1 christos {
475 1.1 christos public:
476 1.1 christos int x;
477 1.1 christos int y;
478 1.1 christos Contains_static_instance (int i, int j) { x = i; y = j; }
479 1.1 christos static Contains_static_instance null;
480 1.1 christos };
481 1.1 christos
482 1.1 christos Contains_static_instance Contains_static_instance::null(0,0);
483 1.1 christos Contains_static_instance csi(10,20);
484 1.1 christos
485 1.1 christos class Contains_nested_static_instance
486 1.1 christos {
487 1.1 christos public:
488 1.1 christos class Nested
489 1.1 christos {
490 1.1 christos public:
491 1.1 christos Nested(int i) : z(i) {}
492 1.1 christos int z;
493 1.1 christos static Contains_nested_static_instance xx;
494 1.1 christos };
495 1.1 christos
496 1.1 christos Contains_nested_static_instance(int i, int j) : x(i), y(j) {}
497 1.1 christos
498 1.1 christos int x;
499 1.1 christos int y;
500 1.1 christos
501 1.1 christos static Contains_nested_static_instance null;
502 1.1 christos static Nested yy;
503 1.1 christos };
504 1.1 christos
505 1.1 christos Contains_nested_static_instance Contains_nested_static_instance::null(0, 0);
506 1.1 christos Contains_nested_static_instance::Nested Contains_nested_static_instance::yy(5);
507 1.1 christos Contains_nested_static_instance
508 1.1 christos Contains_nested_static_instance::Nested::xx(1,2);
509 1.1 christos Contains_nested_static_instance cnsi(30,40);
510 1.1 christos
511 1.1 christos typedef struct {
512 1.1 christos int one;
513 1.1 christos int two;
514 1.1 christos } tagless_struct;
515 1.1 christos tagless_struct v_tagless;
516 1.1 christos
517 1.1 christos /* Try to get the compiler to allocate a class in a register. */
518 1.1 christos class small {
519 1.1 christos public:
520 1.1 christos int x;
521 1.1 christos int method ();
522 1.1 christos };
523 1.1 christos
524 1.1 christos int
525 1.1 christos small::method ()
526 1.1 christos {
527 1.1 christos return x + 5;
528 1.1 christos }
529 1.1 christos
530 1.1 christos void marker_reg1 () {}
531 1.1 christos
532 1.1 christos int
533 1.1 christos register_class ()
534 1.1 christos {
535 1.1 christos /* We don't call any methods for v, so gcc version cygnus-2.3.3-930220
536 1.1 christos might put this variable in a register. This is a lose, though, because
537 1.1 christos it means that GDB can't call any methods for that variable. */
538 1.1 christos register small v;
539 1.1 christos
540 1.1 christos int i;
541 1.1 christos
542 1.1 christos /* Perform a computation sufficiently complicated that optimizing compilers
543 1.1 christos won't optimized out the variable. If some compiler constant-folds this
544 1.1 christos whole loop, maybe using a parameter to this function here would help. */
545 1.1 christos v.x = 0;
546 1.1 christos for (i = 0; i < 13; ++i)
547 1.1 christos v.x += i;
548 1.1 christos --v.x; /* v.x is now 77 */
549 1.1 christos marker_reg1 ();
550 1.1 christos return v.x + 5;
551 1.1 christos }
552 1.1 christos
553 1.1 christos void dummy()
554 1.1 christos {
555 1.1 christos v_bool = true;
556 1.1 christos v_bool_array[0] = false;
557 1.1 christos v_bool_array[1] = v_bool;
558 1.1 christos }
559 1.1 christos
560 1.1 christos void use_methods ()
561 1.1 christos {
562 1.1 christos /* Refer to methods so that they don't get optimized away. */
563 1.1 christos int i;
564 1.1 christos i = class_param.Aptr_a (&g_A);
565 1.1 christos i = class_param.Aptr_x (&g_A);
566 1.1 christos i = class_param.Aref_a (g_A);
567 1.1 christos i = class_param.Aref_x (g_A);
568 1.1 christos i = class_param.Aval_a (g_A);
569 1.1 christos i = class_param.Aval_x (g_A);
570 1.1 christos
571 1.1 christos base1 b (3);
572 1.1 christos }
573 1.1 christos
574 1.1 christos
575 1.1 christos int
576 1.1 christos main()
577 1.1 christos {
578 1.1 christos dummy();
579 1.1 christos inheritance1 ();
580 1.1 christos inheritance3 ();
581 1.1 christos enums1 ();
582 1.1 christos register_class ();
583 1.1 christos
584 1.1 christos /* FIXME: pmi gets optimized out. Need to do some more computation with
585 1.1 christos it or something. (No one notices, because the test is xfail'd anyway,
586 1.1 christos but that probably won't always be true...). */
587 1.1 christos int Foo::* pmi = &Foo::y;
588 1.1 christos
589 1.1 christos /* Make sure the AIX linker doesn't remove the variable. */
590 1.1 christos v_tagless.one = 5;
591 1.1 christos
592 1.1 christos use_methods ();
593 1.1 christos
594 1.1 christos return foo.*pmi;
595 1.1 christos }
596 1.1 christos
597 1.1 christos /* Create an instance for some classes, otherwise they get optimized away. */
598 1.1 christos
599 1.1 christos default_public_struct default_public_s;
600 1.1 christos explicit_public_struct explicit_public_s;
601 1.1 christos protected_struct protected_s;
602 1.1 christos private_struct private_s;
603 1.1 christos mixed_protection_struct mixed_protection_s;
604 1.1 christos public_class public_c;
605 1.1 christos protected_class protected_c;
606 1.1 christos default_private_class default_private_c;
607 1.1 christos explicit_private_class explicit_private_c;
608 1.1 christos mixed_protection_class mixed_protection_c;
609