111
|
1 // { dg-do run }
|
|
2 #include <stddef.h>
|
|
3
|
|
4 void *p;
|
|
5 int fail;
|
|
6
|
|
7 class HeapTracked {
|
|
8 public:
|
|
9 virtual ~HeapTracked() = 0;
|
|
10 void *operator new(size_t size);
|
|
11 void operator delete(void *ptr);
|
|
12 static bool isObjectAllocation(const HeapTracked *ptr);
|
|
13 };
|
|
14
|
|
15 HeapTracked::~HeapTracked(){}
|
|
16 void * HeapTracked::operator new(size_t size)
|
|
17 {
|
|
18 void * memPtr = ::operator new(size);
|
|
19 p = memPtr;
|
|
20 return memPtr;
|
|
21 }
|
|
22
|
|
23 void HeapTracked::operator delete(void *ptr)
|
|
24 {
|
|
25 if (p != ptr)
|
|
26 fail = 1;
|
|
27 ::operator delete(ptr);
|
|
28 }
|
|
29
|
|
30 bool HeapTracked::isObjectAllocation(const HeapTracked *ptr)
|
|
31 {
|
|
32 if (p != const_cast<void*>(dynamic_cast<const void*>(ptr)))
|
|
33 fail = 1;
|
|
34 return false;
|
|
35 }
|
|
36
|
|
37 class Mumble1: public virtual HeapTracked {
|
|
38 double d;
|
|
39 public:
|
|
40 virtual ~Mumble1(){}
|
|
41 };
|
|
42
|
|
43 class Mumble2: public virtual HeapTracked {
|
|
44 double d;
|
|
45 public:
|
|
46 virtual ~Mumble2(){}
|
|
47 };
|
|
48
|
|
49 class Foo: virtual public HeapTracked,
|
|
50 virtual public Mumble1,
|
|
51 virtual public Mumble2 {
|
|
52 public:
|
|
53 ~Foo(){}
|
|
54 };
|
|
55
|
|
56 int main()
|
|
57 {
|
|
58 Foo *pf = new Foo;
|
|
59 pf->isObjectAllocation(pf);
|
|
60
|
|
61 Mumble1 *pm1 = pf;
|
|
62 pm1->isObjectAllocation(pm1);
|
|
63
|
|
64 Mumble2 *pm2 = pf;
|
|
65 pm2->isObjectAllocation(pm2);
|
|
66
|
|
67 // delete pf;
|
|
68 // delete pm1;
|
|
69 delete pm2;
|
|
70
|
|
71 return fail;
|
|
72 }
|