// { dg-do assemble } // PRMS id: g++/13340 class rectangle { public: rectangle(); int overlaps() const; }; class region { friend class region_impl; public: region(); typedef int (region::* region_func)() const; }; class region_impl { friend class region; private: rectangle content, mbb; region_impl *link_p; region_impl(const rectangle &content); public: int iterate(region *region_p, region::region_func what, const rectangle &clip_rect) const; int iterate(region *region_p, region::region_func what, const region_impl &clip_rgn) const; }; int region_impl::iterate (region *region_p, region::region_func what, const rectangle &clip_rect) const { for (const region_impl *p = this; p != 0 && p->mbb.overlaps(); p = p->link_p) if (p->content.overlaps()) if (!(region_p->*what)()) return 0; return 1; } int region_impl::iterate (region *region_p, region::region_func what, const region_impl &clip_rgn) const { for (const region_impl *p = this; p != 0 && p->mbb.overlaps(); p = p->link_p) if (!clip_rgn.iterate(region_p, what, p->content)) return 0; return 1; }