| // { 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); |
| } |
| |
| // { dg-final { cleanup-tree-dump "vect" } } |