| // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s | 
 |  | 
 | // CHECK: Outer5Inner{{.*}}localE6memberE = external global | 
 |  | 
 | template<typename T> struct A { | 
 |   virtual void f(T) { } | 
 |   inline void g() { }  | 
 | }; | 
 |  | 
 | // Explicit instantiations have external linkage. | 
 |  | 
 | // CHECK-LABEL: define weak_odr void @_ZN1AIiE1gEv( | 
 | template void A<int>::g(); | 
 |  | 
 | // CHECK-LABEL: define weak_odr void @_ZN1AIfE1fEf( | 
 | // CHECK-LABEL: define weak_odr void @_ZN1AIfE1gEv( | 
 | // FIXME: This should also emit the vtable. | 
 | template struct A<float>; | 
 |  | 
 | // CHECK-LABEL: define weak_odr void @_Z1fIiEvT_ | 
 | template <typename T> void f(T) { } | 
 | template void f<int>(int); | 
 |  | 
 | // CHECK-LABEL: define weak_odr void @_Z1gIiEvT_ | 
 | template <typename T> inline void g(T) { } | 
 | template void g<int>(int); | 
 |  | 
 | template<typename T> | 
 | struct X0 { | 
 |   virtual ~X0() { } | 
 | }; | 
 |  | 
 | template<typename T> | 
 | struct X1 : X0<T> { | 
 |   virtual void blarg(); | 
 | }; | 
 |  | 
 | template<typename T> void X1<T>::blarg() { } | 
 |  | 
 | extern template struct X0<char>; | 
 | extern template struct X1<char>; | 
 |  | 
 | // CHECK-LABEL: define linkonce_odr void @_ZN2X1IcED1Ev(ptr {{[^,]*}} %this) unnamed_addr | 
 | void test_X1() { | 
 |   X1<char> i1c; | 
 | } | 
 |  | 
 | namespace PR14825 { | 
 | struct Outer { | 
 |   template <typename T> struct Inner { | 
 |     static int member; | 
 |   }; | 
 |   template <typename T> void Get() { | 
 |     int m = Inner<T>::member; | 
 |   } | 
 | }; | 
 |  | 
 | void test() { | 
 |   struct local {}; | 
 |   Outer o; | 
 |   typedef void (Outer::*mptr)(); | 
 |   mptr method = &Outer::Get<local>; | 
 | } | 
 | } |