| // { dg-do compile } | |
| bool f(); | |
| struct counted_base { | |
| virtual void destroy() { } | |
| void release() { if (f()) destroy(); } | |
| }; | |
| struct shared_count { | |
| shared_count() { } | |
| ~shared_count() { if (pi) pi->release(); } | |
| shared_count(shared_count& r) : pi(r.pi) { if (pi) pi->release(); } | |
| counted_base* pi; | |
| }; | |
| struct Foo; | |
| struct shared_ptr { | |
| Foo& operator*() { return *ptr; } | |
| Foo* ptr; | |
| shared_count refcount; | |
| }; | |
| struct Bar { | |
| Bar(Foo&, shared_ptr); | |
| }; | |
| void g() { | |
| shared_ptr foo; | |
| new Bar(*foo, foo); | |
| } | |