1 // RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11
3 // If a friend function is defined in several non-template classes,
8 friend void func1(int) {} // expected-note{{previous definition is here}}
11 friend void func1(int) {} // expected-error{{redefinition of 'func1'}}
15 // If a friend function is defined in both non-template and template
16 // classes it is an error only if the template is instantiated.
20 friend void func2(int) {}
22 template<typename T
> struct C2b
{
23 friend void func2(int) {}
28 friend void func3(int) {} // expected-note{{previous definition is here}}
30 template<typename T
> struct C3b
{
31 friend void func3(int) {} // expected-error{{redefinition of 'func3'}}
33 C3b
<long> c3
; // expected-note{{in instantiation of template class 'C3b<long>' requested here}}
36 // If a friend function is defined in several template classes it is an error
37 // only if several templates are instantiated.
40 template<typename T
> struct C4a
{
41 friend void func4(int) {}
43 template<typename T
> struct C4b
{
44 friend void func4(int) {}
49 template<typename T
> struct C5a
{
50 friend void func5(int) {}
52 template<typename T
> struct C5b
{
53 friend void func5(int) {}
58 template<typename T
> struct C6a
{
59 friend void func6(int) {} // expected-note{{previous definition is here}}
61 template<typename T
> struct C6b
{
62 friend void func6(int) {} // expected-error{{redefinition of 'func6'}}
65 C6b
<int*> c6b
; // expected-note{{in instantiation of template class 'C6b<int *>' requested here}}
68 template<typename T
> struct C7
{
69 friend void func7(int) {} // expected-error{{redefinition of 'func7'}}
70 // expected-note@-1{{previous definition is here}}
73 C7
<int*> c7b
; // expected-note{{in instantiation of template class 'C7<int *>' requested here}}
76 // Even if clases are not instantiated and hence friend functions defined in them are not
77 // available, their declarations can be checked.
79 void func8(int); // expected-note{{previous declaration is here}}
80 template<typename T
> struct C8a
{
81 friend long func8(int); // expected-error{{functions that differ only in their return type cannot be overloaded}}
84 void func9(int); // expected-note{{previous declaration is here}}
85 template<typename T
> struct C9a
{
86 friend int func9(int); // expected-error{{functions that differ only in their return type cannot be overloaded}}
89 void func10(int); // expected-note{{previous declaration is here}}
90 template<typename T
> struct C10a
{
91 friend int func10(int); // expected-error{{functions that differ only in their return type cannot be overloaded}}
94 void func_11(); // expected-note{{previous declaration is here}}
95 template<typename T
> class C11
{
96 friend int func_11(); // expected-error{{functions that differ only in their return type cannot be overloaded}}
99 void func_12(int x
); // expected-note{{previous declaration is here}}
100 template<typename T
> class C12
{
101 friend void func_12(int x
= 0); // expected-error{{friend declaration specifying a default argument must be the only declaration}}
104 // Friend function with uninstantiated body is still a definition.
106 template<typename T
> struct C20
{
107 friend void func_20() {} // expected-note{{previous definition is here}}
110 void func_20() {} // expected-error{{redefinition of 'func_20'}}
112 template<typename T
> struct C21a
{
113 friend void func_21() {} // expected-note{{previous definition is here}}
115 template<typename T
> struct C21b
{
116 friend void func_21() {} // expected-error{{redefinition of 'func_21'}}
119 C21b
<int> c21bi
; // expected-note{{in instantiation of template class 'C21b<int>' requested here}}
121 template<typename T
> struct C22a
{
122 friend void func_22() {} // expected-note{{previous definition is here}}
124 template<typename T
> struct C22b
{
125 friend void func_22();
129 void func_22() {} // expected-error{{redefinition of 'func_22'}}
132 // Case of template friend functions.
134 template<typename T
> void func_31(T
*x
);
135 template<typename T1
>
137 template<typename T
> friend void func_31(T
*x
) {}
139 template<typename T1
>
141 template<typename T
> friend void func_31(T
*x
) {}
145 template<typename T
> inline void func_32(T
*x
) {}
146 template<typename T1
>
148 template<typename T
> friend void func_32(T
*x
) {}
150 template<typename T1
>
152 template<typename T
> friend void func_32(T
*x
) {}
156 template<typename T1
>
158 template<typename T
> friend void func_33(T
*x
) {}
160 template<typename T1
>
162 template<typename T
> friend void func_33(T
*x
) {}
166 template<typename T
> inline void func_34(T
*x
) {} // expected-note{{previous definition is here}}
167 template<typename T1
>
169 template<typename T
> friend void func_34(T
*x
) {} // expected-error{{redefinition of 'func_34'}}
172 C34
<int> v34
; // expected-note{{in instantiation of template class 'C34<int>' requested here}}
175 template<typename T
> inline void func_35(T
*x
);
176 template<typename T1
>
178 template<typename T
> friend void func_35(T
*x
) {} // expected-note{{previous definition is here}}
180 template<typename T1
>
182 template<typename T
> friend void func_35(T
*x
) {} // expected-error{{redefinition of 'func_35'}}
186 C35b
<int> v35b
; // expected-note{{in instantiation of template class 'C35b<int>' requested here}}
189 template<typename T
> void func_36(T
*x
);
190 template<typename T1
>
192 template<typename T
> friend void func_36(T
*x
) {} // expected-error{{redefinition of 'func_36'}}
193 // expected-note@-1{{previous definition is here}}
197 C36
<long> v36b
; //expected-note{{in instantiation of template class 'C36<long>' requested here}}
200 template<typename T
> void func_37(T
*x
);
201 template<typename T1
>
203 template<typename T
> friend void func_37(T
*x
) {} // expected-note{{previous definition is here}}
207 template<typename T
> void func_37(T
*x
) {} // expected-error{{redefinition of 'func_37'}}
218 friend int leak(t
) { return sizeof(v
); } // expected-error{{redefinition of 'leak'}} expected-note{{previous definition is here}}
221 template struct m
<char>;
222 template struct m
<short>; // expected-note{{in instantiation of template class 'pr22307::m<short>' requested here}}
232 void f(unsigned long long);
234 template<typename T
> struct X
{
235 friend void f(unsigned long long) {
240 int main() { f(1234); }
248 template< int value
>
251 { return value
; } // return 0; is OK
254 template class set
< 5 >;
266 int main(int argc
, char* argv
[]) {
270 template <typename T
>
272 friend void Function() { }
275 template class Test
<int>;
282 void internal() const { }
283 friend void operator+(int const &, Somewhat
<T
> const &) {} // expected-error{{redefinition of 'operator+'}}
286 void operator+(int const &, Somewhat
<char> const &x
) { // expected-note {{previous definition is here}}
287 x
.internal(); // expected-note{{in instantiation of template class 'pr14785::Somewhat<char>' requested here}}
292 template <typename K
> struct B
{
293 template <typename A
> bool insert(A
&);
296 template <typename K
>
297 template <typename A
> bool B
<K
>::insert(A
&x
) { return x
< x
; }
299 template <typename K
> class D
{
304 bool insert() { return t
.insert(x
); }
305 template <typename K1
> friend bool operator<(const D
<K1
> &, const D
<K1
> &);
308 template <typename K
> bool operator<(const D
<K
> &, const D
<K
> &);
320 friend void friend_function_template() {} // expected-error{{redefinition of 'friend_function_template'}}
321 // expected-note@-1{{previous definition is here}}
325 wrapper
<int> y
; // expected-note{{in instantiation of template class 'PR39742::wrapper<int>' requested here}}