1 // { dg-do compile }
2 
3 // Copyright (C) 2003 Free Software Foundation
4 // Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
5 
6 // Member function of class template as friend
7 // Erroneous case: mismatch during specialization
8 
9 template <class T> struct A {
10   template <class U> void f(U);
11   void g();
12   void h();
13   void i(int);
14   template <T t> void j();
15 };
16 
17 class C {
18   int ii;				// { dg-message "private" }
19   template <class U> template <class V>
20     friend void A<U>::f(V);
21   template <class U> friend void A<U>::g();
22   template <class U> friend void A<U>::h();
23   template <class U> friend void A<U>::i(int);
24   template <class U> template <U t>
25     friend void A<U>::j();
26 };
27 
28 template <class T> struct A<T*> {
29   void f(int);
30   template <class U> void g();
31   int h();
32   void i(char);
33   template <int> void j();
34 };
35 
36 template <class T> void A<T*>::f(int)
37 {
38   C c;
39   c.ii = 0;				// { dg-error "context" }
40 }
41 
42 template <class T> template <class U> void A<T*>::g()
43 {
44   C c;
45   c.ii = 0;				// { dg-error "context" }
46 }
47 
48 template <class T> int A<T*>::h()
49 {
50   C c;
51   c.ii = 0;				// { dg-error "context" }
52   return 0;
53 }
54 
55 template <class T> void A<T*>::i(char)
56 {
57   C c;
58   c.ii = 0;				// { dg-error "context" }
59 }
60 
61 template <class T> template <int> void A<T*>::j()
62 {
63   C c;
64   c.ii = 0;				// { dg-error "context" }
65 }
66 
67 template <> struct A<char> {
68   void f(int);
69   template <class U> void g();
70   int h();
71   void i(char);
72   template <int> void j();
73 };
74 
75 void A<char>::f(int)
76 {
77   C c;
78   c.ii = 0;				// { dg-error "context" }
79 }
80 
81 template <class U> void A<char>::g()
82 {
83   C c;
84   c.ii = 0;				// { dg-error "context" }
85 }
86 
87 template <> void A<char>::g<int>()
88 {
89   C c;
90   c.ii = 0;				// { dg-error "context" }
91 }
92 
93 int A<char>::h()
94 {
95   C c;
96   c.ii = 0;				// { dg-error "context" }
97   return 0;
98 }
99 
100 void A<char>::i(char)
101 {
102   C c;
103   c.ii = 0;				// { dg-error "context" }
104 }
105 
106 template <int> void A<char>::j()
107 {
108   C c;
109   c.ii = 0;				// { dg-error "context" }
110 }
111 
112 template <> void A<char>::j<0>()
113 {
114   C c;
115   c.ii = 0;				// { dg-error "context" }
116 }
117 
118 int main()
119 {
120   A<int *> a1;
121   a1.f(0);				// { dg-message "required" }
122   a1.g<char>();				// { dg-message "required" }
123   a1.g<int>();				// { dg-message "required" }
124   a1.h();				// { dg-message "required" }
125   a1.i('a');				// { dg-message "required" }
126   a1.j<1>();				// { dg-message "required" }
127   A<char> a2;
128   a2.f(0);
129   a2.g<char>();				// { dg-message "required" }
130   a2.g<int>();
131   a2.h();
132   a2.i('a');
133   a2.j<1>();				// { dg-message "required" }
134   a2.j<0>();
135 }
136