// { dg-do run } // prms-id: 8018 class RefCount { private: int nref; public: RefCount() : nref(0) {} ~RefCount() {} int nrefs() const { return nref; } int reference() { nref++; return nref; } int unreference() { nref--; return nref; } }; class A : public RefCount { public: A() {} ~A() {} }; class RefA { private: A *p; void clear() { if (p) { p->unreference(); if (!p->nrefs()) delete p; } } public: RefA(A* a) : p(a) { if (p) p->reference(); } RefA(const RefA& a) : p(a.p) { if (p) p->reference(); } ~RefA() { clear(); } A* operator->() { return p; } RefA& operator=(const RefA& a) { clear(); p=a.p; if (p) p->reference(); return *this; } RefA& operator=(A* a) { clear(); p=a; if (p) p->reference(); return *this; } }; class AccRefA { private: RefA a; public: AccRefA(A* ap) : a(ap) {} AccRefA(const RefA& ar) : a(ar) {} ~AccRefA() {} operator RefA&() { return a; } RefA& result() { return a; } }; int main() { RefA a1 = new A; AccRefA aa1(a1); RefA a3 = aa1; if (a1->nrefs() != 3) return 1; }