2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / gcc / testsuite / g++.old-deja / g++.mike / p8018.C
blobf085b6e82575f6f011794430b7e93c7b38c462e0
1 // { dg-do run  }
2 // prms-id: 8018
4 class RefCount {
5 private:
6   int nref;
8 public:
9   RefCount() : nref(0) {}
10   ~RefCount() {}
12   int nrefs() const { return nref; }
13   int reference() {
14     nref++;
15     return nref;
16   }
17   int unreference() {
18     nref--;
19     return nref;
20   }
23 class A : public RefCount {
24 public:
25   A() {}
26   ~A() {}
29 class RefA {
30 private:
31   A *p;
33   void clear() {
34     if (p) {
35       p->unreference();
36       if (!p->nrefs())
37         delete p;
38     }
39   }
41 public:
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(); }
46   A* operator->() { return p; }
48   RefA& operator=(const RefA& a) {
49     clear();
50     p=a.p;
51     if (p)
52       p->reference();
53     return *this;
54   }
56   RefA& operator=(A* a) {
57     clear();
58     p=a;
59     if (p)
60       p->reference();
61     return *this;
62   }
65 class AccRefA {
66 private:
67   RefA a;
69 public:
70   AccRefA(A* ap) : a(ap) {}
71   AccRefA(const RefA& ar) : a(ar) {}
72   ~AccRefA() {}
74   operator RefA&() { return a; }
75   RefA& result() { return a; }
78 int
79 main() {
80   RefA a1 = new A;
81   AccRefA aa1(a1);
82   RefA a3 = aa1;
84   if (a1->nrefs() != 3)
85     return 1;