2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / gcc / testsuite / g++.old-deja / g++.mike / p2746.C
blob1bc1ce3591e172bcd6c239a5349aa698ea01d300
1 // { dg-do assemble  }
2 // GROUPS passed scope pt
3 class Link {
4 public:
5   Link();
6   Link(Link *);
7 private:
8   Link *next_;
10 friend class IListBase;
11 friend class IListIterBase;
14 inline
15 Link::Link() : next_(0)
19 inline
20 Link::Link(Link *next) : next_(next)
24 class IListBase {
25 public:
26   IListBase();
27   IListBase(Link *);
28   void  append(Link *);
29   void insert(Link *);
30   Link *head();
31   int empty();
32   Link *get();
33   void remove(Link *);
34 private:
35   Link *head_;
36 friend class IListIterBase;
39 inline
40 IListBase::IListBase() : head_(0)
44 inline
45 IListBase::IListBase(Link *head) : head_(head)
49 inline
50 void IListBase::insert(Link *p)
52   p->next_ = head_;
53   head_ = p;
56 inline
57 Link *IListBase::head()
59   return head_;
62 inline
63 int IListBase::empty()
65   return head_ == 0;
68 inline
69 Link *IListBase::get()
71   Link *tem = head_;
72   head_ = head_->next_;
73   return tem;
75   
76 template<class T> class IListIter;
78 template<class T>
79 class IList : private IListBase {
80 public:
81   IList() { }
82   IList(T *p) : IListBase(p) { }
83   ~IList();
84   void append(T *p) { IListBase::append(p); }
85   void insert(T *p) { IListBase::insert(p); }
86   void remove(T *p) { IListBase::remove(p); }
87   T *head() { return (T *)IListBase::head(); }
88   T *get() { return (T *)IListBase::get(); }
89   IListBase::empty;
90 friend class IListIter<T>;
93 template<class T>
94 IList<T>::~IList()
96   while (!empty())
97     delete get();
100 class IListIterBase {
101 public:
102   IListIterBase(const IListBase &);
103   int done();
104   Link *cur();
105   void next();
106 private:
107   Link *p_;
110 inline
111 IListIterBase::IListIterBase(const IListBase &list) : p_(list.head_)
115 inline
116 int IListIterBase::done()
118   return p_ == 0;
121 inline
122 Link *IListIterBase::cur()
124   return p_;
127 inline
128 void IListIterBase::next()
130   p_ = p_->next_;
134 template<class T>
135 class IListIter : private IListIterBase {
136 public:
137   IListIter(const IList<T> &list) : IListIterBase(list) { }
138   T *cur() { return (T *)IListIterBase::cur(); }
139   IListIterBase::next;
140   IListIterBase::done;
144 struct A {
145   IList<Link> list;
146   int x;
147   void foo();
151 void A::foo()
153   for (IListIter<Link> iter(list); !iter.done(); iter.next())
154     ;
155   x = 0;