1// { dg-do compile } 2// { dg-options "-fno-exceptions" } 3 4typedef unsigned int uint; 5struct QShared { 6 bool deref() { 7 return !--count; 8 } 9 uint count; 10}; 11template <class T> class QValueListNode { 12public: 13 QValueListNode<T>* next; 14 QValueListNode<T>* prev; 15}; 16template <class T> class QValueListPrivate : public QShared { 17public: 18 typedef QValueListNode<T> Node; 19 typedef QValueListNode<T>* NodePtr; 20 QValueListPrivate(); 21 void derefAndDelete() { 22 if ( deref() ) delete this; 23 } 24 ~QValueListPrivate(); 25 NodePtr node; 26}; 27template <class T> QValueListPrivate<T>::QValueListPrivate() { 28 node = new Node; 29 node->next = node->prev = node; 30} 31template <class T> QValueListPrivate<T>::~QValueListPrivate() { 32 NodePtr p = node->next; 33 while( p != node ) { 34 NodePtr x = p->next; 35 delete p; 36 p = x; 37 } 38} 39template <class T> class QValueList { 40public: 41 QValueList() { 42 sh = new QValueListPrivate<T>; 43 } 44 ~QValueList() { 45 sh->derefAndDelete(); 46 } 47 QValueListPrivate<T>* sh; 48}; 49class Cell { 50 QValueList<Cell*> obscuringCells() const; 51}; 52QValueList<Cell*> Cell::obscuringCells() const { 53 QValueList<Cell*> empty; 54} 55