Clang Project

clang_source_code/test/CodeGenCXX/windows-itanium-dllexport.cpp
1// RUN: %clang_cc1 -emit-llvm -triple i686-windows-itanium -fdeclspec %s -o - | FileCheck %s
2
3#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
8struct __declspec(dllexport) s {
9  void f() {}
10};
11
12// CHECK: define {{.*}} dllexport {{.*}} @_ZN1saSERKS_
13// CHECK: define {{.*}} dllexport {{.*}} @_ZN1s1fEv
14
15template <class T>
16class c {
17  void f() {}
18};
19
20template class __declspec(dllexport) c<int>;
21
22// CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIiEaSERKS0_
23// CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIiE1fEv
24
25extern template class c<char>;
26template class __declspec(dllexport) c<char>;
27
28// CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIcEaSERKS0_
29// CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIcE1fEv
30
31c<double> g;
32template class __declspec(dllexport) c<double>;
33
34// CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIdEaSERKS0_
35// CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIdE1fEv
36
37template <class T>
38struct outer {
39  void f() {}
40  struct inner {
41    void f() {}
42  };
43};
44
45template class __declspec(dllexport) outer<int>;
46
47// CHECK: define {{.*}} dllexport {{.*}} @_ZN5outerIiE1fEv
48// CHECK-NOT: define {{.*}} dllexport {{.*}} @_ZN5outerIiE5inner1fEv
49
50extern template class __declspec(dllimport) outer<char>;
51USEMEMFUNC(outer<char>, f)
52USEMEMFUNC(outer<char>::inner, f)
53
54// CHECK: declare dllimport {{.*}} @_ZN5outerIcE1fEv
55// CHECK: define {{.*}} @_ZN5outerIcE5inner1fEv
56