// { dg-do assemble } // GROUPS passed scope pt class Link { public: Link(); Link(Link *); private: Link *next_; friend class IListBase; friend class IListIterBase; }; inline Link::Link() : next_(0) { } inline Link::Link(Link *next) : next_(next) { } class IListBase { public: IListBase(); IListBase(Link *); void append(Link *); void insert(Link *); Link *head(); int empty(); Link *get(); void remove(Link *); private: Link *head_; friend class IListIterBase; }; inline IListBase::IListBase() : head_(0) { } inline IListBase::IListBase(Link *head) : head_(head) { } inline void IListBase::insert(Link *p) { p->next_ = head_; head_ = p; } inline Link *IListBase::head() { return head_; } inline int IListBase::empty() { return head_ == 0; } inline Link *IListBase::get() { Link *tem = head_; head_ = head_->next_; return tem; } template class IListIter; template class IList : private IListBase { public: IList() { } IList(T *p) : IListBase(p) { } ~IList(); void append(T *p) { IListBase::append(p); } void insert(T *p) { IListBase::insert(p); } void remove(T *p) { IListBase::remove(p); } T *head() { return (T *)IListBase::head(); } T *get() { return (T *)IListBase::get(); } IListBase::empty; // { dg-warning "deprecated" } friend class IListIter; }; template IList::~IList() { while (!empty()) delete get(); } class IListIterBase { public: IListIterBase(const IListBase &); int done(); Link *cur(); void next(); private: Link *p_; }; inline IListIterBase::IListIterBase(const IListBase &list) : p_(list.head_) { } inline int IListIterBase::done() { return p_ == 0; } inline Link *IListIterBase::cur() { return p_; } inline void IListIterBase::next() { p_ = p_->next_; } template class IListIter : private IListIterBase { public: IListIter(const IList &list) : IListIterBase(list) { } T *cur() { return (T *)IListIterBase::cur(); } IListIterBase::next; // { dg-warning "deprecated" } IListIterBase::done; // { dg-warning "deprecated" } }; struct A { IList list; int x; void foo(); }; void A::foo() { for (IListIter iter(list); !iter.done(); iter.next()) ; x = 0; }