blob: 408a3fd0a77ddac051d6ae7e0710585a079cbe71 [file] [log] [blame]
Martin Storsjo5be69bc2019-04-26 08:09:51 +00001// RUN: %clang_cc1 -emit-llvm -triple i686-mingw32 %s -o - | FileCheck %s
2
Martin Storsjoda93dec2019-04-26 19:31:39 +00003#define JOIN2(x, y) x##y
4#define JOIN(x, y) JOIN2(x, y)
5#define UNIQ(name) JOIN(name, __LINE__)
6#define USEMEMFUNC(class, func) void (class::*UNIQ(use)())() { return &class::func; }
7
Martin Storsjo5be69bc2019-04-26 08:09:51 +00008template <class T>
9class c {
Martin Storsjo9534e9d2019-04-26 19:31:46 +000010 void f() {}
Martin Storsjo5be69bc2019-04-26 08:09:51 +000011};
12
Martin Storsjo5be69bc2019-04-26 08:09:51 +000013template class __declspec(dllexport) c<int>;
14
15// CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIiE1fEv
16
17extern template class __declspec(dllexport) c<char>;
18template class c<char>;
19
20// CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIcE1fEv
21
22extern template class c<double>;
23template class __declspec(dllexport) c<double>;
24
25// CHECK-NOT: define {{.*}} dllexport {{.*}} @_ZN1cIdE1fEv
26
27template <class T>
28struct outer {
29 void f();
30 struct inner {
31 void f();
32 };
33};
34
35template <class T> void outer<T>::f() {}
36template <class T> void outer<T>::inner::f() {}
37
38template class __declspec(dllexport) outer<int>;
39
40// CHECK: define {{.*}} dllexport {{.*}} @_ZN5outerIiE1fEv
41// CHECK-NOT: define {{.*}} dllexport {{.*}} @_ZN5outerIiE5inner1fEv
Martin Storsjoda93dec2019-04-26 19:31:39 +000042
43extern template class __declspec(dllimport) outer<char>;
44USEMEMFUNC(outer<char>, f)
45USEMEMFUNC(outer<char>::inner, f)
46
47// CHECK: declare dllimport {{.*}} @_ZN5outerIcE1fEv
48// CHECK: define {{.*}} @_ZN5outerIcE5inner1fEv