1// { dg-do run } 2// prms-id: 8018 3 4class RefCount { 5private: 6 int nref; 7 8public: 9 RefCount() : nref(0) {} 10 ~RefCount() {} 11 12 int nrefs() const { return nref; } 13 int reference() { 14 nref++; 15 return nref; 16 } 17 int unreference() { 18 nref--; 19 return nref; 20 } 21}; 22 23class A : public RefCount { 24public: 25 A() {} 26 ~A() {} 27}; 28 29class RefA { 30private: 31 A *p; 32 33 void clear() { 34 if (p) { 35 p->unreference(); 36 if (!p->nrefs()) 37 delete p; 38 } 39 } 40 41public: 42 RefA(A* a) : p(a) { if (p) p->reference(); } 43 RefA(const RefA& a) : p(a.p) { if (p) p->reference(); } 44 ~RefA() { clear(); } 45 46 A* operator->() { return p; } 47 48 RefA& operator=(const RefA& a) { 49 clear(); 50 p=a.p; 51 if (p) 52 p->reference(); 53 return *this; 54 } 55 56 RefA& operator=(A* a) { 57 clear(); 58 p=a; 59 if (p) 60 p->reference(); 61 return *this; 62 } 63}; 64 65class AccRefA { 66private: 67 RefA a; 68 69public: 70 AccRefA(A* ap) : a(ap) {} 71 AccRefA(const RefA& ar) : a(ar) {} 72 ~AccRefA() {} 73 74 operator RefA&() { return a; } 75 RefA& result() { return a; } 76}; 77 78int 79main() { 80 RefA a1 = new A; 81 AccRefA aa1(a1); 82 RefA a3 = aa1; 83 84 if (a1->nrefs() != 3) 85 return 1; 86} 87