Home | History | Annotate | Download | only in SemaTemplate
      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 {
     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 
     24     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
     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 <>
     42 void Streamer<Foo>::operator () (std_ostream& o) const // expected-note{{requested here}}
     43 {
     44 }
     45 
     46 int main(void)
     47 {
     48     Foo foo;
     49     cout << foo;
     50 }
     51