http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60787
Markus Trippelsdorf <trippels at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2014-04-08 CC| |trippels at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #2 from Markus Trippelsdorf <trippels at gcc dot gnu.org> --- This is what creduce came up with: template <class T> void destroy (T *); template <class FI> struct ArrayFill { ArrayFill (FI, FI &p2) : tgt_start_ (), tgt_end_ (p2) {} template <class Val> void m_fn1 (Val &, int &) { while (tgt_cur_ != tgt_end_) ++tgt_cur_; } ~ArrayFill () throw() { if (tgt_cur_ != tgt_end_) while (tgt_cur_ != tgt_start_) { --tgt_cur_; destroy (&*tgt_cur_); } } const FI tgt_start_, tgt_end_; FI tgt_cur_; }; template <class FI, class Val> inline FI uninitialized_fill (FI &p1, FI &p2, Val &p3, int &p4) { ArrayFill<FI> a (p1, p2); a.m_fn1 (p3, p4); } template <class, typename> struct A { typedef int *pointer; typedef int &const_reference; template <class Val2> int m_fn1 (const A<Val2, int> &p1) { return cur_ == p1.cur_; } const_reference operator*() {} void operator++() { if (last_) cur_ = first_; } void operator--() { --cur_; } pointer cur_; pointer first_; pointer last_; }; template <class Val, class Val2, typename BufSize> inline int operator==(A<Val, BufSize> &p1, const A<Val2, BufSize> &p2) { return p1.m_fn1 (p2); } template <class Val, class Val2, typename BufSize> inline int operator!=(A<Val, BufSize> &p1, const A<Val2, BufSize> &p2) { return !(p1 == p2); } struct B { typedef A<int, int>::const_reference const_reference; }; class C { public: typedef B::const_reference const_reference; int *p_ma_; struct MapCreator { ~MapCreator (); }; struct MultiNodeCreator { MultiNodeCreator (A<int, int>::pointer *, A<int, int>::pointer *, int &p3) : ma_ (p3) { } ~MultiNodeCreator () throw(); void m_fn1 (); int &ma_; }; void m_fn1 (A<int, int>::pointer *, A<int, int>::pointer *, int &) { MultiNodeCreator b (0, 0, *p_ma_); b.m_fn1 (); } C::MapCreator initialize_map__new_map; int &m_fn2_p3; void m_fn2 (int, int) { m_fn1 (0, 0, m_fn2_p3); this->finish_.cur_ = this->finish_.first_; } C (int &); A<int, int> start_; A<int, int> finish_; }; class G : C { void m_fn3 (const_reference p1, const int &) { this->m_fn2 (0, 0); uninitialized_fill (this->start_, this->finish_, p1, *this->p_ma_); } public: G (int, const_reference p2, int &p3) : C (p3) { m_fn3 (p2, 0); } void m_fn4 (const_reference p1) { G (0, p1, *this->p_ma_); } }; class F { void m_fn1 (int &); G m_jobs; }; void F::m_fn1 (int &p1) { m_jobs.m_fn4 (p1); }