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