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'}}
141 friend int leak(t) { return sizeof(v); } // expected-error{{redefinition of 'leak'}} expected-note{{previous definition is here}}
144 template struct m<char>;
145 template struct m<short>; // expected-note{{in instantiation of template class 'pr22307::m<short>' requested here}}
155 void f(unsigned long long);
157 template<typename T> struct X {
158 friend void f(unsigned long long) {
163 int main() { f(1234); }
171 template< int value >
174 { return value; } // return 0; is OK
177 template class set< 5 >;
189 int main(int argc, char* argv[]) {
193 template <typename T>
195 friend void Function() { }
198 template class Test<int>;
205 void internal() const { }
206 friend void operator+(int const &, Somewhat<T> const &) {} // expected-error{{redefinition of 'operator+'}}
209 void operator+(int const &, Somewhat<char> const &x) { // expected-note {{previous definition is here}}
210 x.internal(); // expected-note{{in instantiation of template class 'pr14785::Somewhat<char>' requested here}}
215 template <typename K> struct B {
216 template <typename A> bool insert(A &);
219 template <typename K>
220 template <typename A> bool B<K>::insert(A &x) { return x < x; }
222 template <typename K> class D {
227 bool insert() { return t.insert(x); }
228 template <typename K1> friend bool operator<(const D<K1> &, const D<K1> &);
231 template <typename K> bool operator<(const D<K> &, const D<K> &);