1// { dg-do assemble  }
2// GROUPS passed visibility
3// Used to say:
4// manip.cc:17: member `_f' is a private member of class `B<int>'
5// manip.cc:17: member `_a' is a private member of class `B<int>'
6
7class A {};
8
9template <class TP>
10class B;
11
12template <class TP>
13inline A &
14operator<< (A &o, const B<TP> &m);
15
16template <class TP>
17class B
18{
19  A &(*_f) (A &, TP);
20  TP _a;
21public:
22  B (A &(*f) (A &, TP), TP a) : _f (f), _a (a) {}
23  friend A &operator<< <>(A &o, const B<TP> &m);
24};
25
26template <class TP>
27inline A &
28operator<< (A &o, const B<TP> &m)
29{
30  (*m._f) (o, m._a);
31  return o;
32}
33
34A &setw (A &, int);
35B<int> setw (int n)
36{
37  return B<int> (setw, n);
38}
39
40A x;
41
42void f ()
43{
44  x << setw (2);
45}
46