blob: 3acd12ef0bc532e01b9de92478b84216119fab3a [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
Nick Lewyckyf91cbd52013-01-10 01:46:29 +00002
3// CHECK: Outer5Inner{{.*}}localE6memberE = external global
4
Anders Carlsson548e60e2009-12-10 22:25:34 +00005template<typename T> struct A {
6 virtual void f(T) { }
7 inline void g() { }
8};
9
10// Explicit instantiations have external linkage.
11
Douglas Gregor8f51a4f2010-03-13 18:23:07 +000012// CHECK: define weak_odr void @_ZN1AIiE1gEv(
Anders Carlsson548e60e2009-12-10 22:25:34 +000013template void A<int>::g();
14
Douglas Gregor8f51a4f2010-03-13 18:23:07 +000015// CHECK: define weak_odr void @_ZN1AIfE1fEf(
16// CHECK: define weak_odr void @_ZN1AIfE1gEv(
Anders Carlsson548e60e2009-12-10 22:25:34 +000017// FIXME: This should also emit the vtable.
18template struct A<float>;
19
Douglas Gregor8f51a4f2010-03-13 18:23:07 +000020// CHECK: define weak_odr void @_Z1fIiEvT_
Anders Carlsson548e60e2009-12-10 22:25:34 +000021template <typename T> void f(T) { }
22template void f<int>(int);
23
Douglas Gregor8f51a4f2010-03-13 18:23:07 +000024// CHECK: define weak_odr void @_Z1gIiEvT_
Anders Carlsson548e60e2009-12-10 22:25:34 +000025template <typename T> inline void g(T) { }
26template void g<int>(int);
27
Douglas Gregorb0769102010-05-06 23:13:35 +000028template<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
Rafael Espindola0691a5c2011-01-25 19:10:24 +000043// CHECK: define linkonce_odr void @_ZN2X1IcED1Ev(%struct.X1* %this) unnamed_addr
Douglas Gregorb0769102010-05-06 23:13:35 +000044void test_X1() {
45 X1<char> i1c;
46}
47
Nick Lewyckyf91cbd52013-01-10 01:46:29 +000048namespace 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}