1// { dg-do assemble  }
2// PRMS id: g++/13340
3
4class rectangle {
5
6public:
7  rectangle();
8  int overlaps() const;
9
10};
11
12class region
13{
14  friend class region_impl;
15
16public:
17  region();
18  typedef int (region::* region_func)() const;
19
20};
21
22class region_impl  {
23  friend class region;
24
25private:
26  rectangle content, mbb;
27  region_impl *link_p;
28  region_impl(const rectangle &content);
29
30public:
31  int iterate(region *region_p, region::region_func what,
32	      const rectangle &clip_rect) const;
33  int iterate(region *region_p, region::region_func what,
34	      const region_impl &clip_rgn) const;
35};
36
37
38int
39region_impl::iterate (region *region_p, region::region_func what,
40		      const rectangle &clip_rect) const
41{
42  for (const region_impl *p = this; p != 0 && p->mbb.overlaps();
43       p = p->link_p)
44    if (p->content.overlaps())
45      if (!(region_p->*what)()) return 0;
46  return 1;
47}
48
49int
50region_impl::iterate (region *region_p, region::region_func what,
51		      const region_impl &clip_rgn) const
52{
53  for (const region_impl *p = this; p != 0 && p->mbb.overlaps();
54       p = p->link_p)
55    if (!clip_rgn.iterate(region_p, what, p->content)) return 0;
56  return 1;
57}
58