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