// { dg-do compile }
// { dg-options "-fno-exceptions" }

typedef unsigned int uint;
struct QShared {
    bool deref() {
	return !--count;
    }
    uint count;
};
template <class T> class QValueListNode {
public:
    QValueListNode<T>* next;
    QValueListNode<T>* prev;
};
template <class T> class QValueListPrivate : public QShared {
public:
    typedef QValueListNode<T> Node;
    typedef QValueListNode<T>* NodePtr;
    QValueListPrivate();
    void derefAndDelete()     {
	if ( deref() )      delete this;
    }
    ~QValueListPrivate();
    NodePtr node;
};
template <class T>  QValueListPrivate<T>::QValueListPrivate() {
    node = new Node;
    node->next = node->prev = node;
}
template <class T>  QValueListPrivate<T>::~QValueListPrivate() {
    NodePtr p = node->next;
    while( p != node ) {
	NodePtr x = p->next;
	delete p;
	p = x;
    }
}
template <class T> class QValueList {
public:
    QValueList() {
	sh = new QValueListPrivate<T>;
    }
    ~QValueList() {
	sh->derefAndDelete();
    }
    QValueListPrivate<T>* sh;
};
class Cell {
    QValueList<Cell*> obscuringCells() const;
};
QValueList<Cell*> Cell::obscuringCells() const {
    QValueList<Cell*> empty;
    return QValueList<Cell*>();
}
