1 // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s 2 3 // CHECK: Outer5Inner{{.*}}localE6memberE = external global 4 5 template<typename T> struct A { 6 virtual void f(T) { } 7 inline void g() { } 8 }; 9 10 // Explicit instantiations have external linkage. 11 12 // CHECK: define weak_odr void @_ZN1AIiE1gEv( 13 template void A<int>::g(); 14 15 // CHECK: define weak_odr void @_ZN1AIfE1fEf( 16 // CHECK: define weak_odr void @_ZN1AIfE1gEv( 17 // FIXME: This should also emit the vtable. 18 template struct A<float>; 19 20 // CHECK: define weak_odr void @_Z1fIiEvT_ 21 template <typename T> void f(T) { } 22 template void f<int>(int); 23 24 // CHECK: define weak_odr void @_Z1gIiEvT_ 25 template <typename T> inline void g(T) { } 26 template void g<int>(int); 27 28 template<typename T> 29 struct X0 { 30 virtual ~X0() { } 31 }; 32 33 template<typename T> 34 struct X1 : X0<T> { 35 virtual void blarg(); 36 }; 37 38 template<typename T> void X1<T>::blarg() { } 39 40 extern template struct X0<char>; 41 extern template struct X1<char>; 42 43 // CHECK: define linkonce_odr void @_ZN2X1IcED1Ev(%struct.X1* %this) unnamed_addr 44 void test_X1() { 45 X1<char> i1c; 46 } 47 48 namespace PR14825 { 49 struct Outer { 50 template <typename T> struct Inner { 51 static int member; 52 }; 53 template <typename T> void Get() { 54 int m = Inner<T>::member; 55 } 56 }; 57 58 void test() { 59 struct local {}; 60 Outer o; 61 typedef void (Outer::*mptr)(); 62 mptr method = &Outer::Get<local>; 63 } 64 } 65