Home | History | Annotate | Download | only in SemaTemplate
      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