annotate gcc/testsuite/g++.old-deja/g++.mike/virt5.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // { dg-do run }
kono
parents:
diff changeset
2 // Ensure that virtual base upcast and downcasting works on this
kono
parents:
diff changeset
3 // conversions during virtual function dispatch at ctor/dtor time
kono
parents:
diff changeset
4 // when dynamic vtable fixups for deltas are needed.
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 int fail = 0;
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 struct BASE1 {
kono
parents:
diff changeset
9 virtual ~BASE1 () { }
kono
parents:
diff changeset
10 };
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 class MID;
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 class BASE2 {
kono
parents:
diff changeset
15 public:
kono
parents:
diff changeset
16 virtual MID *VFN (){ return 0; }
kono
parents:
diff changeset
17 };
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 class MIBASE : public BASE1, public BASE2 { };
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 class VBB : public MIBASE {
kono
parents:
diff changeset
22 public:
kono
parents:
diff changeset
23 virtual long get_STATE () const = 0;
kono
parents:
diff changeset
24 void print_STATE() { if (get_STATE () != 87654321) fail = 1; }
kono
parents:
diff changeset
25 };
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 class VBD : public virtual VBB {
kono
parents:
diff changeset
28 long STATE;
kono
parents:
diff changeset
29 public:
kono
parents:
diff changeset
30 long get_STATE() const { return STATE; }
kono
parents:
diff changeset
31 VBD() { STATE = 87654321; }
kono
parents:
diff changeset
32 ~VBD() { STATE = 87654321; }
kono
parents:
diff changeset
33 };
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 class MID : public virtual VBD {
kono
parents:
diff changeset
36 public:
kono
parents:
diff changeset
37 MID () { print_STATE(); }
kono
parents:
diff changeset
38 ~MID () { print_STATE(); }
kono
parents:
diff changeset
39 virtual MID *VFN() { return this; }
kono
parents:
diff changeset
40 };
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 class LAST : public MID {
kono
parents:
diff changeset
43 public:
kono
parents:
diff changeset
44 LAST () { print_STATE(); }
kono
parents:
diff changeset
45 ~LAST () { print_STATE(); }
kono
parents:
diff changeset
46 };
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 int main() {
kono
parents:
diff changeset
49 MIBASE *o = new LAST;
kono
parents:
diff changeset
50 MID *p = o->VFN();
kono
parents:
diff changeset
51 p->print_STATE();
kono
parents:
diff changeset
52 delete o;
kono
parents:
diff changeset
53 return fail;
kono
parents:
diff changeset
54 }