1 // RUN: %clang_cc1 %s -emit-llvm -triple %itanium_abi_triple -o - | FileCheck %s 2 // RUN: %clang_cc1 %s -DREDEFINE -verify 3 // PR8007: friend function not instantiated. 4 5 // CHECK: define linkonce_odr{{.*}}_ZlsR11std_ostreamRK8StreamerI3FooE 6 7 struct std_ostream 8 { 9 int dummy; 10 }; 11 12 std_ostream cout; 13 14 template <typename STRUCT_TYPE> 15 struct Streamer 16 { operator <<(std_ostream & o,const Streamer & f)17 friend std_ostream& operator << (std_ostream& o, const Streamer& f) // expected-error{{redefinition of 'operator<<'}} 18 { 19 Streamer s(f); 20 s(o); 21 return o; 22 } 23 StreamerStreamer24 Streamer(const STRUCT_TYPE& s) : s(s) {} 25 26 const STRUCT_TYPE& s; 27 void operator () (std_ostream&) const; 28 }; 29 30 typedef struct Foo {} Foo; 31 32 inline std_ostream& operator << (std_ostream&, const Streamer<Foo>&); 33 #ifdef REDEFINE operator <<(std_ostream & o,const Streamer<Foo> &)34std_ostream& operator << (std_ostream& o, const Streamer<Foo>&) // expected-note{{is here}} 35 { 36 // Sema should flag this as a redefinition 37 return o; 38 } 39 #endif 40 41 template <> operator ()(std_ostream & o) const42void Streamer<Foo>::operator () (std_ostream& o) const // expected-note{{requested here}} 43 { 44 } 45 main(void)46int main(void) 47 { 48 Foo foo; 49 cout << foo; 50 } 51