// { dg-do assemble } class foo_a { protected: double func(int xi) {return 0.0;} public: foo_a() {} }; class foo_b { public: foo_b(int); foo_b(); ~foo_b(); foo_b(const foo_b&); double& operator()(int); foo_b& operator=(foo_b&); void bar_a(int); }; foo_b& operator*(foo_b&, foo_b&); foo_b& operator*(double, foo_b&); template class foo_c { typedef double (TP::* Tmatf)(int); int m; Tmatf* a; void foo_cinst (int mm); public: foo_c(int mm); foo_c() {m = 0; a = 0;} ~foo_c() {delete a;} double (TP::*& operator()(int i))(int) {return a[i];} foo_b& bug_func(int); }; template foo_b& foo_c::bug_func(int x) { static foo_b retval(m); retval.bar_a(m); for (register int i = 0; i < m; i++) retval(i) = (*(operator()(i)))(x); // { dg-error "" } return retval; } template class foo_d { protected: foo_c bar_b; public: foo_d() {} virtual ~foo_d() {} virtual void setfoo_c(); }; class foo_e : public foo_a, public foo_d { public: foo_e(); ~foo_e() {} void setfoo_c(); }; void foo_e::setfoo_c() { bar_b(0) = func; // { dg-error "" } } template class foo_c;