OSDN Git Service

Initial revision
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.old-deja / g++.mike / virt5.C
1 // Ensure that virtual base upcast and downcasting works on this
2 // conversions during virtual function dispatch at ctor/dtor time
3 // when dynamic vtable fixups for deltas are needed.
4
5 int fail = 0;
6
7 struct BASE1 {
8   virtual ~BASE1 () { }      
9 };   
10
11 class MID;
12
13 class BASE2 {
14 public: 
15   virtual MID *VFN (){ return 0; }
16 };   
17
18 class MIBASE : public BASE1, public BASE2 { };   
19
20 class VBB : public MIBASE {
21 public:
22   virtual long get_STATE () const = 0;
23   void print_STATE() { if (get_STATE () != 87654321) fail = 1; }
24 };   
25
26 class VBD : public virtual VBB {
27   long STATE;
28 public:
29   long get_STATE() const { return STATE; }
30   VBD() { STATE = 87654321; }
31   ~VBD() { STATE = 87654321; }
32 };   
33
34 class MID : public virtual VBD {
35 public:
36   MID () { print_STATE(); }
37   ~MID () { print_STATE(); }
38   virtual MID *VFN() { return this; }
39 };  
40
41 class LAST : public MID {
42 public:
43   LAST () { print_STATE(); }
44   ~LAST () { print_STATE(); }
45 };
46
47 main() {
48   MIBASE *o = new LAST;
49   MID *p = o->VFN();
50   p->print_STATE();
51   delete o;
52   return fail;
53 }