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