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)40 foo_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()65 void foo_e::setfoo_c() {
66         bar_b(0) = func;				// { dg-error "" }
67 }
68 
69 template class foo_c<foo_a>;
70