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