1 // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s 2 template<typename T> struct A { 3 virtual void f(T) { } 4 inline void g() { } 5 }; 6 7 // Explicit instantiations have external linkage. 8 9 // CHECK: define weak_odr void @_ZN1AIiE1gEv( 10 template void A<int>::g(); 11 12 // CHECK: define weak_odr void @_ZN1AIfE1fEf( 13 // CHECK: define weak_odr void @_ZN1AIfE1gEv( 14 // FIXME: This should also emit the vtable. 15 template struct A<float>; 16 17 // CHECK: define weak_odr void @_Z1fIiEvT_ 18 template <typename T> void f(T) { } 19 template void f<int>(int); 20 21 // CHECK: define weak_odr void @_Z1gIiEvT_ 22 template <typename T> inline void g(T) { } 23 template void g<int>(int); 24 25 template<typename T> 26 struct X0 { 27 virtual ~X0() { } 28 }; 29 30 template<typename T> 31 struct X1 : X0<T> { 32 virtual void blarg(); 33 }; 34 35 template<typename T> void X1<T>::blarg() { } 36 37 extern template struct X0<char>; 38 extern template struct X1<char>; 39 40 // CHECK: define linkonce_odr void @_ZN2X1IcED1Ev(%struct.X1* %this) unnamed_addr 41 void test_X1() { 42 X1<char> i1c; 43 } 44 45