// 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;
}
