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> &)34 std_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) const42 void Streamer<Foo>::operator () (std_ostream& o) const // expected-note{{requested here}}
43 {
44 }
45 
main(void)46 int main(void)
47 {
48     Foo foo;
49     cout << foo;
50 }
51