1 // { dg-do assemble } 2 // { dg-additional-options "-Wno-register" } 3 4 class foo_a { 5 protected: func(int xi)6 double func(int xi) {return 0.0;} 7 public: foo_a()8 foo_a() {} 9 }; 10 11 class foo_b { 12 public: 13 foo_b(int); 14 foo_b(); 15 ~foo_b(); 16 foo_b(const foo_b&); 17 double& operator()(int); 18 foo_b& operator=(foo_b&); 19 void bar_a(int); 20 }; 21 22 foo_b& operator*(foo_b&, foo_b&); 23 foo_b& operator*(double, foo_b&); 24 25 template <class TP> 26 class foo_c { 27 typedef double (TP::* Tmatf)(int); 28 int m; 29 Tmatf* a; 30 void foo_cinst (int mm); 31 public: 32 foo_c(int mm); foo_c()33 foo_c() {m = 0; a = 0;} ~foo_c()34 ~foo_c() {delete a;} 35 double (TP::*& operator()(int i))(int) {return a[i];} 36 foo_b& bug_func(int); 37 }; 38 39 template <class TP> bug_func(int x)40foo_b& foo_c<TP>::bug_func(int x) { 41 static foo_b retval(m); 42 retval.bar_a(m); 43 for (register int i = 0; i < m; i++) 44 retval(i) = (*(operator()(i)))(x); // { dg-error "invalid use of unary '\\\*'" } 45 return retval; 46 } 47 48 template <class TP> 49 class foo_d { 50 protected: 51 foo_c<TP> bar_b; 52 public: foo_d()53 foo_d() {} ~foo_d()54 virtual ~foo_d() {} 55 virtual void setfoo_c(); 56 }; 57 58 class foo_e : public foo_a, public foo_d<foo_a> { 59 public: 60 foo_e(); ~foo_e()61 ~foo_e() {} 62 void setfoo_c(); 63 }; 64 setfoo_c()65void foo_e::setfoo_c() { 66 bar_b(0) = func; // { dg-error "" } 67 } 68 69 template class foo_c<foo_a>; 70