view gcc/testsuite/g++.old-deja/g++.mike/p8018.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
line wrap: on
line source

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