// { dg-do run } struct ex; struct basic { int refcount; ex eval() const; basic() : refcount(0) {} }; struct ex { basic *bp; ex() : bp(0) { } ex(const basic &); virtual ~ex(); void construct_from_basic(const basic &); }; ex basic::eval() const { throw 1; } inline ex::ex(const basic &b) { construct_from_basic (b); } inline ex::~ex() { if (--bp->refcount == 0) delete bp; } void ex::construct_from_basic(const basic &b) { const ex & tmpex = b.eval(); bp = tmpex.bp; bp->refcount++; } ex pow() { return basic(); } int main() { try { pow (); } catch (int) {} return 0; }