blob: e88b7e97c3e7dfeea45f0dcbe2337143a45a174f [file] [log] [blame]
Stephen Hines176edba2014-12-01 14:53:08 -08001// RUN: %clang_cc1 -triple i686-windows-msvc -fms-compatibility -emit-llvm -std=c++1y -O0 -o - %s -DMSABI | FileCheck --check-prefix=MSC --check-prefix=M32 %s
2// RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-compatibility -emit-llvm -std=c++1y -O0 -o - %s -DMSABI | FileCheck --check-prefix=MSC --check-prefix=M64 %s
3// RUN: %clang_cc1 -triple i686-windows-gnu -emit-llvm -std=c++1y -O0 -o - %s | FileCheck --check-prefix=GNU --check-prefix=G32 %s
4// RUN: %clang_cc1 -triple x86_64-windows-gnu -emit-llvm -std=c++1y -O0 -o - %s | FileCheck --check-prefix=GNU --check-prefix=G64 %s
5// RUN: %clang_cc1 -triple i686-windows-msvc -fms-compatibility -emit-llvm -std=c++1y -O1 -o - %s -DMSABI | FileCheck --check-prefix=MO1 %s
6// RUN: %clang_cc1 -triple i686-windows-gnu -emit-llvm -std=c++1y -O1 -o - %s | FileCheck --check-prefix=GO1 %s
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007
8// Helper structs to make templates more expressive.
9struct ImplicitInst_Imported {};
10struct ExplicitDecl_Imported {};
11struct ExplicitInst_Imported {};
12struct ExplicitSpec_Imported {};
13struct ExplicitSpec_Def_Imported {};
14struct ExplicitSpec_InlineDef_Imported {};
15struct ExplicitSpec_NotImported {};
16
17#define JOIN2(x, y) x##y
18#define JOIN(x, y) JOIN2(x, y)
19#define UNIQ(name) JOIN(name, __LINE__)
20#define USE(func) void UNIQ(use)() { func(); }
21#define USEMV(cls, var) int UNIQ(use)() { return ref(cls::var); }
22#define USEMF(cls, fun) template<> void useMemFun<__LINE__, cls>() { cls().fun(); }
23#define USESPECIALS(cls) void UNIQ(use)() { useSpecials<cls>(); }
24
25template<typename T>
26T ref(T const& v) { return v; }
27
28template<int Line, typename T>
29void useMemFun();
30
31template<typename T>
32void useSpecials() {
33 T v; // Default constructor
34
35 T c1(static_cast<const T&>(v)); // Copy constructor
36 T c2 = static_cast<const T&>(v); // Copy constructor
37 T c3;
38 c3 = static_cast<const T&>(v); // Copy assignment
39
40 T m1(static_cast<T&&>(v)); // Move constructor
41 T m2 = static_cast<T&&>(v); // Move constructor
42 T m3;
43 m3 = static_cast<T&&>(v); // Move assignment
44}
45
46// Used to force non-trivial special members.
47struct ForceNonTrivial {
48 ForceNonTrivial();
49 ~ForceNonTrivial();
50 ForceNonTrivial(const ForceNonTrivial&);
51 ForceNonTrivial& operator=(const ForceNonTrivial&);
52 ForceNonTrivial(ForceNonTrivial&&);
53 ForceNonTrivial& operator=(ForceNonTrivial&&);
54};
55
56
57
58//===----------------------------------------------------------------------===//
59// Class members
60//===----------------------------------------------------------------------===//
61
62// Import individual members of a class.
63struct ImportMembers {
64 struct Nested;
65
Stephen Hines176edba2014-12-01 14:53:08 -080066 // M32-DAG: define x86_thiscallcc void @"\01?normalDef@ImportMembers@@QAEXXZ"(%struct.ImportMembers* %this)
67 // M64-DAG: define void @"\01?normalDef@ImportMembers@@QEAAXXZ"(%struct.ImportMembers* %this)
68 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?normalDecl@ImportMembers@@QAEXXZ"(%struct.ImportMembers*)
69 // M64-DAG: declare dllimport void @"\01?normalDecl@ImportMembers@@QEAAXXZ"(%struct.ImportMembers*)
70 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?normalInclass@ImportMembers@@QAEXXZ"(%struct.ImportMembers*)
71 // M64-DAG: declare dllimport void @"\01?normalInclass@ImportMembers@@QEAAXXZ"(%struct.ImportMembers*)
72 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?normalInlineDef@ImportMembers@@QAEXXZ"(%struct.ImportMembers*)
73 // M64-DAG: declare dllimport void @"\01?normalInlineDef@ImportMembers@@QEAAXXZ"(%struct.ImportMembers*)
74 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?normalInlineDecl@ImportMembers@@QAEXXZ"(%struct.ImportMembers*)
75 // M64-DAG: declare dllimport void @"\01?normalInlineDecl@ImportMembers@@QEAAXXZ"(%struct.ImportMembers*)
76 // G32-DAG: define x86_thiscallcc void @_ZN13ImportMembers9normalDefEv(%struct.ImportMembers* %this)
77 // G64-DAG: define void @_ZN13ImportMembers9normalDefEv(%struct.ImportMembers* %this)
78 // G32-DAG: declare dllimport x86_thiscallcc void @_ZN13ImportMembers10normalDeclEv(%struct.ImportMembers*)
79 // G64-DAG: declare dllimport void @_ZN13ImportMembers10normalDeclEv(%struct.ImportMembers*)
80 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers13normalInclassEv(%struct.ImportMembers* %this)
81 // G64-DAG: define linkonce_odr void @_ZN13ImportMembers13normalInclassEv(%struct.ImportMembers* %this)
82 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers15normalInlineDefEv(%struct.ImportMembers* %this)
83 // G64-DAG: define linkonce_odr void @_ZN13ImportMembers15normalInlineDefEv(%struct.ImportMembers* %this)
84 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers16normalInlineDeclEv(%struct.ImportMembers* %this)
85 // G64-DAG: define linkonce_odr void @_ZN13ImportMembers16normalInlineDeclEv(%struct.ImportMembers* %this)
Stephen Hines6bcf27b2014-05-29 04:14:42 -070086 // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?normalInclass@ImportMembers@@QAEXXZ"(
87 // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?normalInlineDef@ImportMembers@@QAEXXZ"(
88 // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?normalInlineDecl@ImportMembers@@QAEXXZ"(
Stephen Hines176edba2014-12-01 14:53:08 -080089 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers13normalInclassEv(
90 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers15normalInlineDefEv(
91 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers16normalInlineDeclEv(
Stephen Hines6bcf27b2014-05-29 04:14:42 -070092 __declspec(dllimport) void normalDef(); // dllimport ignored
93 __declspec(dllimport) void normalDecl();
94 __declspec(dllimport) void normalInclass() {}
95 __declspec(dllimport) void normalInlineDef();
96 __declspec(dllimport) inline void normalInlineDecl();
97
Stephen Hines176edba2014-12-01 14:53:08 -080098 // M32-DAG: define x86_thiscallcc void @"\01?virtualDef@ImportMembers@@UAEXXZ"(%struct.ImportMembers* %this)
99 // M64-DAG: define void @"\01?virtualDef@ImportMembers@@UEAAXXZ"(%struct.ImportMembers* %this)
100 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?virtualDecl@ImportMembers@@UAEXXZ"(%struct.ImportMembers*)
101 // M64-DAG: declare dllimport void @"\01?virtualDecl@ImportMembers@@UEAAXXZ"(%struct.ImportMembers*)
102 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?virtualInclass@ImportMembers@@UAEXXZ"(%struct.ImportMembers*)
103 // M64-DAG: declare dllimport void @"\01?virtualInclass@ImportMembers@@UEAAXXZ"(%struct.ImportMembers*)
104 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?virtualInlineDef@ImportMembers@@UAEXXZ"(%struct.ImportMembers*)
105 // M64-DAG: declare dllimport void @"\01?virtualInlineDef@ImportMembers@@UEAAXXZ"(%struct.ImportMembers*)
106 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?virtualInlineDecl@ImportMembers@@UAEXXZ"(%struct.ImportMembers*)
107 // M64-DAG: declare dllimport void @"\01?virtualInlineDecl@ImportMembers@@UEAAXXZ"(%struct.ImportMembers*)
108 // G32-DAG: define x86_thiscallcc void @_ZN13ImportMembers10virtualDefEv(%struct.ImportMembers* %this)
109 // G64-DAG: define void @_ZN13ImportMembers10virtualDefEv(%struct.ImportMembers* %this)
110 // G32-DAG: declare dllimport x86_thiscallcc void @_ZN13ImportMembers11virtualDeclEv(%struct.ImportMembers*)
111 // G64-DAG: declare dllimport void @_ZN13ImportMembers11virtualDeclEv(%struct.ImportMembers*)
112 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers14virtualInclassEv(%struct.ImportMembers* %this)
113 // G64-DAG: define linkonce_odr void @_ZN13ImportMembers14virtualInclassEv(%struct.ImportMembers* %this)
114 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers16virtualInlineDefEv(%struct.ImportMembers* %this)
115 // G64-DAG: define linkonce_odr void @_ZN13ImportMembers16virtualInlineDefEv(%struct.ImportMembers* %this)
116 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers17virtualInlineDeclEv(%struct.ImportMembers* %this)
117 // G64-DAG: define linkonce_odr void @_ZN13ImportMembers17virtualInlineDeclEv(%struct.ImportMembers* %this)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700118 // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?virtualInclass@ImportMembers@@UAEXXZ"(
119 // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?virtualInlineDef@ImportMembers@@UAEXXZ"(
120 // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?virtualInlineDecl@ImportMembers@@UAEXXZ"(
Stephen Hines176edba2014-12-01 14:53:08 -0800121 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers14virtualInclassEv(
122 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers16virtualInlineDefEv(
123 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers17virtualInlineDeclEv(
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700124 __declspec(dllimport) virtual void virtualDef(); // dllimport ignored
125 __declspec(dllimport) virtual void virtualDecl();
126 __declspec(dllimport) virtual void virtualInclass() {}
127 __declspec(dllimport) virtual void virtualInlineDef();
128 __declspec(dllimport) virtual inline void virtualInlineDecl();
129
130 // MSC-DAG: define void @"\01?staticDef@ImportMembers@@SAXXZ"()
131 // MSC-DAG: declare dllimport void @"\01?staticDecl@ImportMembers@@SAXXZ"()
132 // MSC-DAG: declare dllimport void @"\01?staticInclass@ImportMembers@@SAXXZ"()
133 // MSC-DAG: declare dllimport void @"\01?staticInlineDef@ImportMembers@@SAXXZ"()
134 // MSC-DAG: declare dllimport void @"\01?staticInlineDecl@ImportMembers@@SAXXZ"()
135 // GNU-DAG: define void @_ZN13ImportMembers9staticDefEv()
136 // GNU-DAG: declare dllimport void @_ZN13ImportMembers10staticDeclEv()
Stephen Hines176edba2014-12-01 14:53:08 -0800137 // GNU-DAG: define linkonce_odr void @_ZN13ImportMembers13staticInclassEv()
138 // GNU-DAG: define linkonce_odr void @_ZN13ImportMembers15staticInlineDefEv()
139 // GNU-DAG: define linkonce_odr void @_ZN13ImportMembers16staticInlineDeclEv()
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700140 // MO1-DAG: define available_externally dllimport void @"\01?staticInclass@ImportMembers@@SAXXZ"()
141 // MO1-DAG: define available_externally dllimport void @"\01?staticInlineDef@ImportMembers@@SAXXZ"()
142 // MO1-DAG: define available_externally dllimport void @"\01?staticInlineDecl@ImportMembers@@SAXXZ"()
Stephen Hines176edba2014-12-01 14:53:08 -0800143 // GO1-DAG: define linkonce_odr void @_ZN13ImportMembers13staticInclassEv()
144 // GO1-DAG: define linkonce_odr void @_ZN13ImportMembers15staticInlineDefEv()
145 // GO1-DAG: define linkonce_odr void @_ZN13ImportMembers16staticInlineDeclEv()
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700146 __declspec(dllimport) static void staticDef(); // dllimport ignored
147 __declspec(dllimport) static void staticDecl();
148 __declspec(dllimport) static void staticInclass() {}
149 __declspec(dllimport) static void staticInlineDef();
150 __declspec(dllimport) static inline void staticInlineDecl();
151
152 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?protectedNormalDecl@ImportMembers@@IAEXXZ"(%struct.ImportMembers*)
153 // M64-DAG: declare dllimport void @"\01?protectedNormalDecl@ImportMembers@@IEAAXXZ"(%struct.ImportMembers*)
154 // G32-DAG: declare dllimport x86_thiscallcc void @_ZN13ImportMembers19protectedNormalDeclEv(%struct.ImportMembers*)
155 // G64-DAG: declare dllimport void @_ZN13ImportMembers19protectedNormalDeclEv(%struct.ImportMembers*)
156 // MSC-DAG: declare dllimport void @"\01?protectedStaticDecl@ImportMembers@@KAXXZ"()
157 // GNU-DAG: declare dllimport void @_ZN13ImportMembers19protectedStaticDeclEv()
158protected:
159 __declspec(dllimport) void protectedNormalDecl();
160 __declspec(dllimport) static void protectedStaticDecl();
161
162 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?privateNormalDecl@ImportMembers@@AAEXXZ"(%struct.ImportMembers*)
163 // M64-DAG: declare dllimport void @"\01?privateNormalDecl@ImportMembers@@AEAAXXZ"(%struct.ImportMembers*)
164 // G32-DAG: declare dllimport x86_thiscallcc void @_ZN13ImportMembers17privateNormalDeclEv(%struct.ImportMembers*)
165 // G64-DAG: declare dllimport void @_ZN13ImportMembers17privateNormalDeclEv(%struct.ImportMembers*)
166 // MSC-DAG: declare dllimport void @"\01?privateStaticDecl@ImportMembers@@CAXXZ"()
167 // GNU-DAG: declare dllimport void @_ZN13ImportMembers17privateStaticDeclEv()
168private:
169 __declspec(dllimport) void privateNormalDecl();
170 __declspec(dllimport) static void privateStaticDecl();
171
172 // M32-DAG: declare x86_thiscallcc void @"\01?ignored@ImportMembers@@QAEXXZ"(%struct.ImportMembers*)
173 // M64-DAG: declare void @"\01?ignored@ImportMembers@@QEAAXXZ"(%struct.ImportMembers*)
174 // G32-DAG: declare x86_thiscallcc void @_ZN13ImportMembers7ignoredEv(%struct.ImportMembers*)
175 // G64-DAG: declare void @_ZN13ImportMembers7ignoredEv(%struct.ImportMembers*)
176public:
177 void ignored();
178
179 // MSC-DAG: @"\01?StaticField@ImportMembers@@2HA" = external dllimport global i32
180 // MSC-DAG: @"\01?StaticConstField@ImportMembers@@2HB" = external dllimport constant i32
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700181 // MSC-DAG: @"\01?StaticConstFieldEqualInit@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4
182 // MSC-DAG: @"\01?StaticConstFieldBraceInit@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4
183 // MSC-DAG: @"\01?ConstexprField@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700184 // GNU-DAG: @_ZN13ImportMembers11StaticFieldE = external dllimport global i32
185 // GNU-DAG: @_ZN13ImportMembers16StaticConstFieldE = external dllimport constant i32
186 // GNU-DAG: @_ZN13ImportMembers25StaticConstFieldEqualInitE = external dllimport constant i32
187 // GNU-DAG: @_ZN13ImportMembers25StaticConstFieldBraceInitE = external dllimport constant i32
188 // GNU-DAG: @_ZN13ImportMembers14ConstexprFieldE = external dllimport constant i32
189 __declspec(dllimport) static int StaticField;
190 __declspec(dllimport) static const int StaticConstField;
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700191 __declspec(dllimport) static const int StaticConstFieldEqualInit = 1;
192 __declspec(dllimport) static const int StaticConstFieldBraceInit{1};
193 __declspec(dllimport) constexpr static int ConstexprField = 1;
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700194
195 template<int Line, typename T> friend void useMemFun();
196};
197
198 void ImportMembers::normalDef() {} // dllimport ignored
199inline void ImportMembers::normalInlineDef() {}
200 void ImportMembers::normalInlineDecl() {}
201 void ImportMembers::virtualDef() {} // dllimport ignored
202inline void ImportMembers::virtualInlineDef() {}
203 void ImportMembers::virtualInlineDecl() {}
204 void ImportMembers::staticDef() {} // dllimport ignored
205inline void ImportMembers::staticInlineDef() {}
206 void ImportMembers::staticInlineDecl() {}
207
208USEMF(ImportMembers, normalDef)
209USEMF(ImportMembers, normalDecl)
210USEMF(ImportMembers, normalInclass)
211USEMF(ImportMembers, normalInlineDef)
212USEMF(ImportMembers, normalInlineDecl)
213USEMF(ImportMembers, virtualDef)
214USEMF(ImportMembers, virtualDecl)
215USEMF(ImportMembers, virtualInclass)
216USEMF(ImportMembers, virtualInlineDef)
217USEMF(ImportMembers, virtualInlineDecl)
218USEMF(ImportMembers, staticDef)
219USEMF(ImportMembers, staticDecl)
220USEMF(ImportMembers, staticInclass)
221USEMF(ImportMembers, staticInlineDef)
222USEMF(ImportMembers, staticInlineDecl)
223USEMF(ImportMembers, protectedNormalDecl)
224USEMF(ImportMembers, protectedStaticDecl)
225USEMF(ImportMembers, privateNormalDecl)
226USEMF(ImportMembers, privateStaticDecl)
227USEMF(ImportMembers, ignored)
228
229USEMV(ImportMembers, StaticField)
230USEMV(ImportMembers, StaticConstField)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700231USEMV(ImportMembers, StaticConstFieldEqualInit)
232USEMV(ImportMembers, StaticConstFieldBraceInit)
233USEMV(ImportMembers, ConstexprField)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700234
235
236// Import individual members of a nested class.
237struct ImportMembers::Nested {
Stephen Hines176edba2014-12-01 14:53:08 -0800238 // M32-DAG: define x86_thiscallcc void @"\01?normalDef@Nested@ImportMembers@@QAEXXZ"(%"struct.ImportMembers::Nested"* %this)
239 // M64-DAG: define void @"\01?normalDef@Nested@ImportMembers@@QEAAXXZ"(%"struct.ImportMembers::Nested"* %this)
240 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?normalDecl@Nested@ImportMembers@@QAEXXZ"(%"struct.ImportMembers::Nested"*)
241 // M64-DAG: declare dllimport void @"\01?normalDecl@Nested@ImportMembers@@QEAAXXZ"(%"struct.ImportMembers::Nested"*)
242 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?normalInclass@Nested@ImportMembers@@QAEXXZ"(%"struct.ImportMembers::Nested"*)
243 // M64-DAG: declare dllimport void @"\01?normalInclass@Nested@ImportMembers@@QEAAXXZ"(%"struct.ImportMembers::Nested"*)
244 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?normalInlineDef@Nested@ImportMembers@@QAEXXZ"(%"struct.ImportMembers::Nested"*)
245 // M64-DAG: declare dllimport void @"\01?normalInlineDef@Nested@ImportMembers@@QEAAXXZ"(%"struct.ImportMembers::Nested"*)
246 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?normalInlineDecl@Nested@ImportMembers@@QAEXXZ"(%"struct.ImportMembers::Nested"*)
247 // M64-DAG: declare dllimport void @"\01?normalInlineDecl@Nested@ImportMembers@@QEAAXXZ"(%"struct.ImportMembers::Nested"*)
248 // G32-DAG: define x86_thiscallcc void @_ZN13ImportMembers6Nested9normalDefEv(%"struct.ImportMembers::Nested"* %this)
249 // G64-DAG: define void @_ZN13ImportMembers6Nested9normalDefEv(%"struct.ImportMembers::Nested"* %this)
250 // G32-DAG: declare dllimport x86_thiscallcc void @_ZN13ImportMembers6Nested10normalDeclEv(%"struct.ImportMembers::Nested"*)
251 // G64-DAG: declare dllimport void @_ZN13ImportMembers6Nested10normalDeclEv(%"struct.ImportMembers::Nested"*)
252 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested13normalInclassEv(%"struct.ImportMembers::Nested"* %this)
253 // G64-DAG: define linkonce_odr void @_ZN13ImportMembers6Nested13normalInclassEv(%"struct.ImportMembers::Nested"* %this)
254 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested15normalInlineDefEv(%"struct.ImportMembers::Nested"* %this)
255 // G64-DAG: define linkonce_odr void @_ZN13ImportMembers6Nested15normalInlineDefEv(%"struct.ImportMembers::Nested"* %this)
256 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested16normalInlineDeclEv(%"struct.ImportMembers::Nested"* %this)
257 // G64-DAG: define linkonce_odr void @_ZN13ImportMembers6Nested16normalInlineDeclEv(%"struct.ImportMembers::Nested"* %this)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700258 // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?normalInclass@Nested@ImportMembers@@QAEXXZ"(
259 // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?normalInlineDef@Nested@ImportMembers@@QAEXXZ"(
260 // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?normalInlineDecl@Nested@ImportMembers@@QAEXXZ"(
Stephen Hines176edba2014-12-01 14:53:08 -0800261 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested13normalInclassEv(
262 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested15normalInlineDefEv(
263 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested16normalInlineDeclEv(
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700264 __declspec(dllimport) void normalDef(); // dllimport ignored
265 __declspec(dllimport) void normalDecl();
266 __declspec(dllimport) void normalInclass() {}
267 __declspec(dllimport) void normalInlineDef();
268 __declspec(dllimport) inline void normalInlineDecl();
269
Stephen Hines176edba2014-12-01 14:53:08 -0800270 // M32-DAG: define x86_thiscallcc void @"\01?virtualDef@Nested@ImportMembers@@UAEXXZ"(%"struct.ImportMembers::Nested"* %this)
271 // M64-DAG: define void @"\01?virtualDef@Nested@ImportMembers@@UEAAXXZ"(%"struct.ImportMembers::Nested"* %this)
272 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?virtualDecl@Nested@ImportMembers@@UAEXXZ"(%"struct.ImportMembers::Nested"*)
273 // M64-DAG: declare dllimport void @"\01?virtualDecl@Nested@ImportMembers@@UEAAXXZ"(%"struct.ImportMembers::Nested"*)
274 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?virtualInclass@Nested@ImportMembers@@UAEXXZ"(%"struct.ImportMembers::Nested"*)
275 // M64-DAG: declare dllimport void @"\01?virtualInclass@Nested@ImportMembers@@UEAAXXZ"(%"struct.ImportMembers::Nested"*)
276 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?virtualInlineDef@Nested@ImportMembers@@UAEXXZ"(%"struct.ImportMembers::Nested"*)
277 // M64-DAG: declare dllimport void @"\01?virtualInlineDef@Nested@ImportMembers@@UEAAXXZ"(%"struct.ImportMembers::Nested"*)
278 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?virtualInlineDecl@Nested@ImportMembers@@UAEXXZ"(%"struct.ImportMembers::Nested"*)
279 // M64-DAG: declare dllimport void @"\01?virtualInlineDecl@Nested@ImportMembers@@UEAAXXZ"(%"struct.ImportMembers::Nested"*)
280 // G32-DAG: define x86_thiscallcc void @_ZN13ImportMembers6Nested10virtualDefEv(%"struct.ImportMembers::Nested"* %this)
281 // G64-DAG: define void @_ZN13ImportMembers6Nested10virtualDefEv(%"struct.ImportMembers::Nested"* %this)
282 // G32-DAG: declare dllimport x86_thiscallcc void @_ZN13ImportMembers6Nested11virtualDeclEv(%"struct.ImportMembers::Nested"*)
283 // G64-DAG: declare dllimport void @_ZN13ImportMembers6Nested11virtualDeclEv(%"struct.ImportMembers::Nested"*)
284 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested14virtualInclassEv(%"struct.ImportMembers::Nested"* %this)
285 // G64-DAG: define linkonce_odr void @_ZN13ImportMembers6Nested14virtualInclassEv(%"struct.ImportMembers::Nested"* %this)
286 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested16virtualInlineDefEv(%"struct.ImportMembers::Nested"* %this)
287 // G64-DAG: define linkonce_odr void @_ZN13ImportMembers6Nested16virtualInlineDefEv(%"struct.ImportMembers::Nested"* %this)
288 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested17virtualInlineDeclEv(%"struct.ImportMembers::Nested"* %this)
289 // G64-DAG: define linkonce_odr void @_ZN13ImportMembers6Nested17virtualInlineDeclEv(%"struct.ImportMembers::Nested"* %this)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700290
291 // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?virtualInclass@Nested@ImportMembers@@UAEXXZ"(
292 // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?virtualInlineDef@Nested@ImportMembers@@UAEXXZ"(
293 // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?virtualInlineDecl@Nested@ImportMembers@@UAEXXZ"(
Stephen Hines176edba2014-12-01 14:53:08 -0800294 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested14virtualInclassEv(
295 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested16virtualInlineDefEv(
296 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested17virtualInlineDeclEv(
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700297 __declspec(dllimport) virtual void virtualDef(); // dllimport ignored
298 __declspec(dllimport) virtual void virtualDecl();
299 __declspec(dllimport) virtual void virtualInclass() {}
300 __declspec(dllimport) virtual void virtualInlineDef();
301 __declspec(dllimport) virtual inline void virtualInlineDecl();
302
303 // MSC-DAG: define void @"\01?staticDef@Nested@ImportMembers@@SAXXZ"()
304 // MSC-DAG: declare dllimport void @"\01?staticDecl@Nested@ImportMembers@@SAXXZ"()
305 // MSC-DAG: declare dllimport void @"\01?staticInclass@Nested@ImportMembers@@SAXXZ"()
306 // MSC-DAG: declare dllimport void @"\01?staticInlineDef@Nested@ImportMembers@@SAXXZ"()
307 // MSC-DAG: declare dllimport void @"\01?staticInlineDecl@Nested@ImportMembers@@SAXXZ"()
308 // GNU-DAG: define void @_ZN13ImportMembers6Nested9staticDefEv()
309 // GNU-DAG: declare dllimport void @_ZN13ImportMembers6Nested10staticDeclEv()
Stephen Hines176edba2014-12-01 14:53:08 -0800310 // GNU-DAG: define linkonce_odr void @_ZN13ImportMembers6Nested13staticInclassEv()
311 // GNU-DAG: define linkonce_odr void @_ZN13ImportMembers6Nested15staticInlineDefEv()
312 // GNU-DAG: define linkonce_odr void @_ZN13ImportMembers6Nested16staticInlineDeclEv()
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700313 // MO1-DAG: define available_externally dllimport void @"\01?staticInclass@Nested@ImportMembers@@SAXXZ"()
314 // MO1-DAG: define available_externally dllimport void @"\01?staticInlineDef@Nested@ImportMembers@@SAXXZ"()
315 // MO1-DAG: define available_externally dllimport void @"\01?staticInlineDecl@Nested@ImportMembers@@SAXXZ"()
Stephen Hines176edba2014-12-01 14:53:08 -0800316 // GO1-DAG: define linkonce_odr void @_ZN13ImportMembers6Nested13staticInclassEv()
317 // GO1-DAG: define linkonce_odr void @_ZN13ImportMembers6Nested15staticInlineDefEv()
318 // GO1-DAG: define linkonce_odr void @_ZN13ImportMembers6Nested16staticInlineDeclEv()
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700319 __declspec(dllimport) static void staticDef(); // dllimport ignored
320 __declspec(dllimport) static void staticDecl();
321 __declspec(dllimport) static void staticInclass() {}
322 __declspec(dllimport) static void staticInlineDef();
323 __declspec(dllimport) static inline void staticInlineDecl();
324
325 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?protectedNormalDecl@Nested@ImportMembers@@IAEXXZ"(%"struct.ImportMembers::Nested"*)
326 // M64-DAG: declare dllimport void @"\01?protectedNormalDecl@Nested@ImportMembers@@IEAAXXZ"(%"struct.ImportMembers::Nested"*)
327 // G32-DAG: declare dllimport x86_thiscallcc void @_ZN13ImportMembers6Nested19protectedNormalDeclEv(%"struct.ImportMembers::Nested"*)
328 // G64-DAG: declare dllimport void @_ZN13ImportMembers6Nested19protectedNormalDeclEv(%"struct.ImportMembers::Nested"*)
329 // MSC-DAG: declare dllimport void @"\01?protectedStaticDecl@Nested@ImportMembers@@KAXXZ"()
330 // GNU-DAG: declare dllimport void @_ZN13ImportMembers6Nested19protectedStaticDeclEv()
331protected:
332 __declspec(dllimport) void protectedNormalDecl();
333 __declspec(dllimport) static void protectedStaticDecl();
334
335 // M32-DAG: declare dllimport x86_thiscallcc void @"\01?privateNormalDecl@Nested@ImportMembers@@AAEXXZ"(%"struct.ImportMembers::Nested"*)
336 // M64-DAG: declare dllimport void @"\01?privateNormalDecl@Nested@ImportMembers@@AEAAXXZ"(%"struct.ImportMembers::Nested"*)
337 // G32-DAG: declare dllimport x86_thiscallcc void @_ZN13ImportMembers6Nested17privateNormalDeclEv(%"struct.ImportMembers::Nested"*)
338 // G64-DAG: declare dllimport void @_ZN13ImportMembers6Nested17privateNormalDeclEv(%"struct.ImportMembers::Nested"*)
339 // MSC-DAG: declare dllimport void @"\01?privateStaticDecl@Nested@ImportMembers@@CAXXZ"()
340 // GNU-DAG: declare dllimport void @_ZN13ImportMembers6Nested17privateStaticDeclEv()
341private:
342 __declspec(dllimport) void privateNormalDecl();
343 __declspec(dllimport) static void privateStaticDecl();
344
345 // M32-DAG: declare x86_thiscallcc void @"\01?ignored@Nested@ImportMembers@@QAEXXZ"(%"struct.ImportMembers::Nested"*)
346 // M64-DAG: declare void @"\01?ignored@Nested@ImportMembers@@QEAAXXZ"(%"struct.ImportMembers::Nested"*)
347 // G32-DAG: declare x86_thiscallcc void @_ZN13ImportMembers6Nested7ignoredEv(%"struct.ImportMembers::Nested"*)
348 // G64-DAG: declare void @_ZN13ImportMembers6Nested7ignoredEv(%"struct.ImportMembers::Nested"*)
349public:
350 void ignored();
351
352 // MSC-DAG: @"\01?StaticField@Nested@ImportMembers@@2HA" = external dllimport global i32
353 // MSC-DAG: @"\01?StaticConstField@Nested@ImportMembers@@2HB" = external dllimport constant i32
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700354 // MSC-DAG: @"\01?StaticConstFieldEqualInit@Nested@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4
355 // MSC-DAG: @"\01?StaticConstFieldBraceInit@Nested@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4
356 // MSC-DAG: @"\01?ConstexprField@Nested@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700357 // GNU-DAG: @_ZN13ImportMembers6Nested11StaticFieldE = external dllimport global i32
358 // GNU-DAG: @_ZN13ImportMembers6Nested16StaticConstFieldE = external dllimport constant i32
359 // GNU-DAG: @_ZN13ImportMembers6Nested25StaticConstFieldEqualInitE = external dllimport constant i32
360 // GNU-DAG: @_ZN13ImportMembers6Nested25StaticConstFieldBraceInitE = external dllimport constant i32
361 // GNU-DAG: @_ZN13ImportMembers6Nested14ConstexprFieldE = external dllimport constant i32
362 __declspec(dllimport) static int StaticField;
363 __declspec(dllimport) static const int StaticConstField;
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700364 __declspec(dllimport) static const int StaticConstFieldEqualInit = 1;
365 __declspec(dllimport) static const int StaticConstFieldBraceInit{1};
366 __declspec(dllimport) constexpr static int ConstexprField = 1;
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700367
368 template<int Line, typename T> friend void useMemFun();
369};
370
371 void ImportMembers::Nested::normalDef() {} // dllimport ignored
372inline void ImportMembers::Nested::normalInlineDef() {}
373 void ImportMembers::Nested::normalInlineDecl() {}
374 void ImportMembers::Nested::virtualDef() {} // dllimport ignored
375inline void ImportMembers::Nested::virtualInlineDef() {}
376 void ImportMembers::Nested::virtualInlineDecl() {}
377 void ImportMembers::Nested::staticDef() {} // dllimport ignored
378inline void ImportMembers::Nested::staticInlineDef() {}
379 void ImportMembers::Nested::staticInlineDecl() {}
380
381USEMF(ImportMembers::Nested, normalDef)
382USEMF(ImportMembers::Nested, normalDecl)
383USEMF(ImportMembers::Nested, normalInclass)
384USEMF(ImportMembers::Nested, normalInlineDef)
385USEMF(ImportMembers::Nested, normalInlineDecl)
386USEMF(ImportMembers::Nested, virtualDef)
387USEMF(ImportMembers::Nested, virtualDecl)
388USEMF(ImportMembers::Nested, virtualInclass)
389USEMF(ImportMembers::Nested, virtualInlineDef)
390USEMF(ImportMembers::Nested, virtualInlineDecl)
391USEMF(ImportMembers::Nested, staticDef)
392USEMF(ImportMembers::Nested, staticDecl)
393USEMF(ImportMembers::Nested, staticInclass)
394USEMF(ImportMembers::Nested, staticInlineDef)
395USEMF(ImportMembers::Nested, staticInlineDecl)
396USEMF(ImportMembers::Nested, protectedNormalDecl)
397USEMF(ImportMembers::Nested, protectedStaticDecl)
398USEMF(ImportMembers::Nested, privateNormalDecl)
399USEMF(ImportMembers::Nested, privateStaticDecl)
400USEMF(ImportMembers::Nested, ignored)
401
402USEMV(ImportMembers::Nested, StaticField)
403USEMV(ImportMembers::Nested, StaticConstField)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700404USEMV(ImportMembers::Nested, StaticConstFieldEqualInit)
405USEMV(ImportMembers::Nested, StaticConstFieldBraceInit)
406USEMV(ImportMembers::Nested, ConstexprField)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700407
408
409// Import special member functions.
410struct ImportSpecials {
411 // M32-DAG: declare dllimport x86_thiscallcc %struct.ImportSpecials* @"\01??0ImportSpecials@@QAE@XZ"(%struct.ImportSpecials* returned)
412 // M64-DAG: declare dllimport %struct.ImportSpecials* @"\01??0ImportSpecials@@QEAA@XZ"(%struct.ImportSpecials* returned)
413 // G32-DAG: declare dllimport x86_thiscallcc void @_ZN14ImportSpecialsC1Ev(%struct.ImportSpecials*)
414 // G64-DAG: declare dllimport void @_ZN14ImportSpecialsC1Ev(%struct.ImportSpecials*)
415 __declspec(dllimport) ImportSpecials();
416
417 // M32-DAG: declare dllimport x86_thiscallcc void @"\01??1ImportSpecials@@QAE@XZ"(%struct.ImportSpecials*)
418 // M64-DAG: declare dllimport void @"\01??1ImportSpecials@@QEAA@XZ"(%struct.ImportSpecials*)
419 // G32-DAG: declare dllimport x86_thiscallcc void @_ZN14ImportSpecialsD1Ev(%struct.ImportSpecials*)
420 // G64-DAG: declare dllimport void @_ZN14ImportSpecialsD1Ev(%struct.ImportSpecials*)
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700421 __declspec(dllimport) ~ImportSpecials();
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700422
Stephen Hines176edba2014-12-01 14:53:08 -0800423 // M32-DAG: declare dllimport x86_thiscallcc %struct.ImportSpecials* @"\01??0ImportSpecials@@QAE@ABU0@@Z"(%struct.ImportSpecials* returned, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
424 // M64-DAG: declare dllimport %struct.ImportSpecials* @"\01??0ImportSpecials@@QEAA@AEBU0@@Z"(%struct.ImportSpecials* returned, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
425 // G32-DAG: declare dllimport x86_thiscallcc void @_ZN14ImportSpecialsC1ERKS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
426 // G64-DAG: declare dllimport void @_ZN14ImportSpecialsC1ERKS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700427 __declspec(dllimport) ImportSpecials(const ImportSpecials&);
428
Stephen Hines176edba2014-12-01 14:53:08 -0800429 // M32-DAG: declare dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @"\01??4ImportSpecials@@QAEAAU0@ABU0@@Z"(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
430 // M64-DAG: declare dllimport dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @"\01??4ImportSpecials@@QEAAAEAU0@AEBU0@@Z"(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
431 // G32-DAG: declare dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @_ZN14ImportSpecialsaSERKS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
432 // G64-DAG: declare dllimport dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @_ZN14ImportSpecialsaSERKS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700433 __declspec(dllimport) ImportSpecials& operator=(const ImportSpecials&);
434
Stephen Hines176edba2014-12-01 14:53:08 -0800435 // M32-DAG: declare dllimport x86_thiscallcc %struct.ImportSpecials* @"\01??0ImportSpecials@@QAE@$$QAU0@@Z"(%struct.ImportSpecials* returned, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
436 // M64-DAG: declare dllimport %struct.ImportSpecials* @"\01??0ImportSpecials@@QEAA@$$QEAU0@@Z"(%struct.ImportSpecials* returned, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
437 // G32-DAG: declare dllimport x86_thiscallcc void @_ZN14ImportSpecialsC1EOS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
438 // G64-DAG: declare dllimport void @_ZN14ImportSpecialsC1EOS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700439 __declspec(dllimport) ImportSpecials(ImportSpecials&&);
440
Stephen Hines176edba2014-12-01 14:53:08 -0800441 // M32-DAG: declare dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @"\01??4ImportSpecials@@QAEAAU0@$$QAU0@@Z"(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
442 // M64-DAG: declare dllimport dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @"\01??4ImportSpecials@@QEAAAEAU0@$$QEAU0@@Z"(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
443 // G32-DAG: declare dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @_ZN14ImportSpecialsaSEOS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
444 // G64-DAG: declare dllimport dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @_ZN14ImportSpecialsaSEOS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700445 __declspec(dllimport) ImportSpecials& operator=(ImportSpecials&&);
446};
447USESPECIALS(ImportSpecials)
448
449
450// Export inline special member functions.
451struct ImportInlineSpecials {
Stephen Hines176edba2014-12-01 14:53:08 -0800452 // M32-DAG: declare dllimport x86_thiscallcc %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QAE@XZ"(%struct.ImportInlineSpecials* returned)
453 // M64-DAG: declare dllimport %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QEAA@XZ"(%struct.ImportInlineSpecials* returned)
454 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsC1Ev(%struct.ImportInlineSpecials* %this)
455 // G64-DAG: define linkonce_odr void @_ZN20ImportInlineSpecialsC1Ev(%struct.ImportInlineSpecials* %this)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700456 // MO1-DAG: define available_externally dllimport x86_thiscallcc %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QAE@XZ"(
Stephen Hines176edba2014-12-01 14:53:08 -0800457 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsC1Ev(
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700458 __declspec(dllimport) ImportInlineSpecials() {}
459
Stephen Hines176edba2014-12-01 14:53:08 -0800460 // M32-DAG: declare dllimport x86_thiscallcc void @"\01??1ImportInlineSpecials@@QAE@XZ"(%struct.ImportInlineSpecials*)
461 // M64-DAG: declare dllimport void @"\01??1ImportInlineSpecials@@QEAA@XZ"(%struct.ImportInlineSpecials*)
462 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsD1Ev(%struct.ImportInlineSpecials* %this)
463 // G64-DAG: define linkonce_odr void @_ZN20ImportInlineSpecialsD1Ev(%struct.ImportInlineSpecials* %this)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700464 // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01??1ImportInlineSpecials@@QAE@XZ"(
Stephen Hines176edba2014-12-01 14:53:08 -0800465 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsD1Ev(
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700466 __declspec(dllimport) ~ImportInlineSpecials() {}
467
Stephen Hines176edba2014-12-01 14:53:08 -0800468 // M32-DAG: declare dllimport x86_thiscallcc %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QAE@ABU0@@Z"(%struct.ImportInlineSpecials* returned, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
469 // M64-DAG: declare dllimport %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QEAA@AEBU0@@Z"(%struct.ImportInlineSpecials* returned, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
470 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsC1ERKS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
471 // G64-DAG: define linkonce_odr void @_ZN20ImportInlineSpecialsC1ERKS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700472 // MO1-DAG: define available_externally dllimport x86_thiscallcc %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QAE@ABU0@@Z"(
Stephen Hines176edba2014-12-01 14:53:08 -0800473 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsC1ERKS_(
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700474 __declspec(dllimport) inline ImportInlineSpecials(const ImportInlineSpecials&);
475
Stephen Hines176edba2014-12-01 14:53:08 -0800476 // M32-DAG: declare dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @"\01??4ImportInlineSpecials@@QAEAAU0@ABU0@@Z"(%struct.ImportInlineSpecials*, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
477 // M64-DAG: declare dllimport dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @"\01??4ImportInlineSpecials@@QEAAAEAU0@AEBU0@@Z"(%struct.ImportInlineSpecials*, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
478 // G32-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @_ZN20ImportInlineSpecialsaSERKS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
479 // G64-DAG: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @_ZN20ImportInlineSpecialsaSERKS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
480 // MO1-DAG: define available_externally dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @"\01??4ImportInlineSpecials@@QAEAAU0@ABU0@@Z"(
481 // GO1-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @_ZN20ImportInlineSpecialsaSERKS_(
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700482 __declspec(dllimport) ImportInlineSpecials& operator=(const ImportInlineSpecials&);
483
Stephen Hines176edba2014-12-01 14:53:08 -0800484 // M32-DAG: declare dllimport x86_thiscallcc %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QAE@$$QAU0@@Z"(%struct.ImportInlineSpecials* returned, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
485 // M64-DAG: declare dllimport %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QEAA@$$QEAU0@@Z"(%struct.ImportInlineSpecials* returned, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
486 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsC1EOS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
487 // G64-DAG: define linkonce_odr void @_ZN20ImportInlineSpecialsC1EOS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700488 // MO1-DAG: define available_externally dllimport x86_thiscallcc %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QAE@$$QAU0@@Z"(
Stephen Hines176edba2014-12-01 14:53:08 -0800489 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsC1EOS_(
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700490 __declspec(dllimport) ImportInlineSpecials(ImportInlineSpecials&&) {}
491
Stephen Hines176edba2014-12-01 14:53:08 -0800492 // M32-DAG: declare dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @"\01??4ImportInlineSpecials@@QAEAAU0@$$QAU0@@Z"(%struct.ImportInlineSpecials*, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
493 // M64-DAG: declare dllimport dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @"\01??4ImportInlineSpecials@@QEAAAEAU0@$$QEAU0@@Z"(%struct.ImportInlineSpecials*, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
494 // G32-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @_ZN20ImportInlineSpecialsaSEOS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
495 // G64-DAG: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @_ZN20ImportInlineSpecialsaSEOS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
496 // MO1-DAG: define available_externally dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @"\01??4ImportInlineSpecials@@QAEAAU0@$$QAU0@@Z"(
497 // GO1-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @_ZN20ImportInlineSpecialsaSEOS_(
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700498 __declspec(dllimport) ImportInlineSpecials& operator=(ImportInlineSpecials&&) { return *this; }
499};
500ImportInlineSpecials::ImportInlineSpecials(const ImportInlineSpecials&) {}
501inline ImportInlineSpecials& ImportInlineSpecials::operator=(const ImportInlineSpecials&) { return *this; }
502USESPECIALS(ImportInlineSpecials)
503
504
505// Import defaulted member functions.
506struct ImportDefaulted {
Stephen Hines176edba2014-12-01 14:53:08 -0800507 // M32-DAG: declare dllimport x86_thiscallcc %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QAE@XZ"(%struct.ImportDefaulted* returned)
508 // M64-DAG: declare dllimport %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QEAA@XZ"(%struct.ImportDefaulted* returned)
509 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN15ImportDefaultedC1Ev(%struct.ImportDefaulted* %this)
510 // G64-DAG: define linkonce_odr void @_ZN15ImportDefaultedC1Ev(%struct.ImportDefaulted* %this)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700511 // MO1-DAG: define available_externally dllimport x86_thiscallcc %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QAE@XZ"(%struct.ImportDefaulted* returned %this)
Stephen Hines176edba2014-12-01 14:53:08 -0800512 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN15ImportDefaultedC1Ev(%struct.ImportDefaulted* %this)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700513 __declspec(dllimport) ImportDefaulted() = default;
514
Stephen Hines176edba2014-12-01 14:53:08 -0800515 // M32-DAG: declare dllimport x86_thiscallcc void @"\01??1ImportDefaulted@@QAE@XZ"(%struct.ImportDefaulted*)
516 // M64-DAG: declare dllimport void @"\01??1ImportDefaulted@@QEAA@XZ"(%struct.ImportDefaulted*)
517 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN15ImportDefaultedD1Ev(%struct.ImportDefaulted* %this)
518 // G64-DAG: define linkonce_odr void @_ZN15ImportDefaultedD1Ev(%struct.ImportDefaulted* %this)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700519 // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01??1ImportDefaulted@@QAE@XZ"(%struct.ImportDefaulted* %this)
Stephen Hines176edba2014-12-01 14:53:08 -0800520 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN15ImportDefaultedD1Ev(%struct.ImportDefaulted* %this)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700521 __declspec(dllimport) ~ImportDefaulted() = default;
522
Stephen Hines176edba2014-12-01 14:53:08 -0800523 // M32-DAG: declare dllimport x86_thiscallcc %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QAE@ABU0@@Z"(%struct.ImportDefaulted* returned, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
524 // M64-DAG: declare dllimport %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QEAA@AEBU0@@Z"(%struct.ImportDefaulted* returned, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
525 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN15ImportDefaultedC1ERKS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
526 // G64-DAG: define linkonce_odr void @_ZN15ImportDefaultedC1ERKS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
527 // MO1-DAG: define available_externally dllimport x86_thiscallcc %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QAE@ABU0@@Z"(%struct.ImportDefaulted* returned %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
528 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN15ImportDefaultedC1ERKS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700529 __declspec(dllimport) ImportDefaulted(const ImportDefaulted&) = default;
530
Stephen Hines176edba2014-12-01 14:53:08 -0800531 // M32-DAG: declare dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @"\01??4ImportDefaulted@@QAEAAU0@ABU0@@Z"(%struct.ImportDefaulted*, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
532 // M64-DAG: declare dllimport dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @"\01??4ImportDefaulted@@QEAAAEAU0@AEBU0@@Z"(%struct.ImportDefaulted*, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
533 // G32-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @_ZN15ImportDefaultedaSERKS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
534 // G64-DAG: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @_ZN15ImportDefaultedaSERKS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
535 // MO1-DAG: define available_externally dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @"\01??4ImportDefaulted@@QAEAAU0@ABU0@@Z"(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
536 // GO1-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @_ZN15ImportDefaultedaSERKS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700537 __declspec(dllimport) ImportDefaulted& operator=(const ImportDefaulted&) = default;
538
Stephen Hines176edba2014-12-01 14:53:08 -0800539 // M32-DAG: declare dllimport x86_thiscallcc %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QAE@$$QAU0@@Z"(%struct.ImportDefaulted* returned, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
540 // M64-DAG: declare dllimport %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QEAA@$$QEAU0@@Z"(%struct.ImportDefaulted* returned, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
541 // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN15ImportDefaultedC1EOS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
542 // G64-DAG: define linkonce_odr void @_ZN15ImportDefaultedC1EOS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
543 // MO1-DAG: define available_externally dllimport x86_thiscallcc %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QAE@$$QAU0@@Z"(%struct.ImportDefaulted* returned %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
544 // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN15ImportDefaultedC1EOS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700545 __declspec(dllimport) ImportDefaulted(ImportDefaulted&&) = default;
546
Stephen Hines176edba2014-12-01 14:53:08 -0800547 // M32-DAG: declare dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @"\01??4ImportDefaulted@@QAEAAU0@$$QAU0@@Z"(%struct.ImportDefaulted*, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
548 // M64-DAG: declare dllimport dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @"\01??4ImportDefaulted@@QEAAAEAU0@$$QEAU0@@Z"(%struct.ImportDefaulted*, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
549 // G32-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @_ZN15ImportDefaultedaSEOS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
550 // G64-DAG: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @_ZN15ImportDefaultedaSEOS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
551 // MO1-DAG: define available_externally dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @"\01??4ImportDefaulted@@QAEAAU0@$$QAU0@@Z"(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
552 // GO1-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @_ZN15ImportDefaultedaSEOS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700553 __declspec(dllimport) ImportDefaulted& operator=(ImportDefaulted&&) = default;
554
555 ForceNonTrivial v; // ensure special members are non-trivial
556};
557USESPECIALS(ImportDefaulted)
558
559
560// Import defaulted member function definitions.
561struct ImportDefaultedDefs {
562 __declspec(dllimport) inline ImportDefaultedDefs();
563 __declspec(dllimport) inline ~ImportDefaultedDefs();
564
565 __declspec(dllimport) ImportDefaultedDefs(const ImportDefaultedDefs&);
566 __declspec(dllimport) ImportDefaultedDefs& operator=(const ImportDefaultedDefs&);
567
568 __declspec(dllimport) ImportDefaultedDefs(ImportDefaultedDefs&&);
569 __declspec(dllimport) ImportDefaultedDefs& operator=(ImportDefaultedDefs&&);
570};
571
Stephen Hines176edba2014-12-01 14:53:08 -0800572#ifdef MSABI
573// For MinGW, the function will not be dllimport, and we cannot add the attribute now.
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700574// M32-DAG: declare dllimport x86_thiscallcc %struct.ImportDefaultedDefs* @"\01??0ImportDefaultedDefs@@QAE@XZ"(%struct.ImportDefaultedDefs* returned)
575// M64-DAG: declare dllimport %struct.ImportDefaultedDefs* @"\01??0ImportDefaultedDefs@@QEAA@XZ"(%struct.ImportDefaultedDefs* returned)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700576__declspec(dllimport) ImportDefaultedDefs::ImportDefaultedDefs() = default;
Stephen Hines176edba2014-12-01 14:53:08 -0800577#endif
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700578
Stephen Hines176edba2014-12-01 14:53:08 -0800579#ifdef MSABI
580// For MinGW, the function will not be dllimport, and we cannot add the attribute now.
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700581// M32-DAG: declare dllimport x86_thiscallcc void @"\01??1ImportDefaultedDefs@@QAE@XZ"(%struct.ImportDefaultedDefs*)
582// M64-DAG: declare dllimport void @"\01??1ImportDefaultedDefs@@QEAA@XZ"(%struct.ImportDefaultedDefs*)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700583__declspec(dllimport) ImportDefaultedDefs::~ImportDefaultedDefs() = default;
Stephen Hines176edba2014-12-01 14:53:08 -0800584#endif
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700585
Stephen Hines176edba2014-12-01 14:53:08 -0800586// M32-DAG: declare dllimport x86_thiscallcc %struct.ImportDefaultedDefs* @"\01??0ImportDefaultedDefs@@QAE@ABU0@@Z"(%struct.ImportDefaultedDefs* returned, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
587// M64-DAG: declare dllimport %struct.ImportDefaultedDefs* @"\01??0ImportDefaultedDefs@@QEAA@AEBU0@@Z"(%struct.ImportDefaultedDefs* returned, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
588// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN19ImportDefaultedDefsC1ERKS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
589// G64-DAG: define linkonce_odr void @_ZN19ImportDefaultedDefsC1ERKS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700590inline ImportDefaultedDefs::ImportDefaultedDefs(const ImportDefaultedDefs&) = default;
591
Stephen Hines176edba2014-12-01 14:53:08 -0800592// M32-DAG: declare dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @"\01??4ImportDefaultedDefs@@QAEAAU0@ABU0@@Z"(%struct.ImportDefaultedDefs*, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
593// M64-DAG: declare dllimport dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @"\01??4ImportDefaultedDefs@@QEAAAEAU0@AEBU0@@Z"(%struct.ImportDefaultedDefs*, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
594// G32-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @_ZN19ImportDefaultedDefsaSERKS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
595// G64-DAG: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @_ZN19ImportDefaultedDefsaSERKS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700596inline ImportDefaultedDefs& ImportDefaultedDefs::operator=(const ImportDefaultedDefs&) = default;
597
Stephen Hines176edba2014-12-01 14:53:08 -0800598// M32-DAG: define x86_thiscallcc %struct.ImportDefaultedDefs* @"\01??0ImportDefaultedDefs@@QAE@$$QAU0@@Z"(%struct.ImportDefaultedDefs* returned %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
599// M64-DAG: define %struct.ImportDefaultedDefs* @"\01??0ImportDefaultedDefs@@QEAA@$$QEAU0@@Z"(%struct.ImportDefaultedDefs* returned %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
600// G32-DAG: define x86_thiscallcc void @_ZN19ImportDefaultedDefsC1EOS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
601// G64-DAG: define void @_ZN19ImportDefaultedDefsC1EOS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
602// G32-DAG: define x86_thiscallcc void @_ZN19ImportDefaultedDefsC2EOS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
603// G64-DAG: define void @_ZN19ImportDefaultedDefsC2EOS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700604ImportDefaultedDefs::ImportDefaultedDefs(ImportDefaultedDefs&&) = default; // dllimport ignored
605
Stephen Hines176edba2014-12-01 14:53:08 -0800606// M32-DAG: define x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @"\01??4ImportDefaultedDefs@@QAEAAU0@$$QAU0@@Z"(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
607// M64-DAG: define dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @"\01??4ImportDefaultedDefs@@QEAAAEAU0@$$QEAU0@@Z"(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
608// G32-DAG: define x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @_ZN19ImportDefaultedDefsaSEOS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
609// G64-DAG: define dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @_ZN19ImportDefaultedDefsaSEOS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700610ImportDefaultedDefs& ImportDefaultedDefs::operator=(ImportDefaultedDefs&&) = default; // dllimport ignored
611
612USESPECIALS(ImportDefaultedDefs)
613
614
615// Import allocation functions.
616struct ImportAlloc {
617 __declspec(dllimport) void* operator new(__SIZE_TYPE__);
618 __declspec(dllimport) void* operator new[](__SIZE_TYPE__);
619 __declspec(dllimport) void operator delete(void*);
620 __declspec(dllimport) void operator delete[](void*);
621};
622
623// M32-DAG: declare dllimport i8* @"\01??2ImportAlloc@@SAPAXI@Z"(i32)
624// M64-DAG: declare dllimport i8* @"\01??2ImportAlloc@@SAPEAX_K@Z"(i64)
625// G32-DAG: declare dllimport i8* @_ZN11ImportAllocnwEj(i32)
626// G64-DAG: declare dllimport i8* @_ZN11ImportAllocnwEy(i64)
627void UNIQ(use)() { new ImportAlloc(); }
628
629// M32-DAG: declare dllimport i8* @"\01??_UImportAlloc@@SAPAXI@Z"(i32)
630// M64-DAG: declare dllimport i8* @"\01??_UImportAlloc@@SAPEAX_K@Z"(i64)
631// G32-DAG: declare dllimport i8* @_ZN11ImportAllocnaEj(i32)
632// G64-DAG: declare dllimport i8* @_ZN11ImportAllocnaEy(i64)
633void UNIQ(use)() { new ImportAlloc[1]; }
634
635// M32-DAG: declare dllimport void @"\01??3ImportAlloc@@SAXPAX@Z"(i8*)
636// M64-DAG: declare dllimport void @"\01??3ImportAlloc@@SAXPEAX@Z"(i8*)
637// G32-DAG: declare dllimport void @_ZN11ImportAllocdlEPv(i8*)
638// G64-DAG: declare dllimport void @_ZN11ImportAllocdlEPv(i8*)
639void UNIQ(use)(ImportAlloc* ptr) { delete ptr; }
640
641// M32-DAG: declare dllimport void @"\01??_VImportAlloc@@SAXPAX@Z"(i8*)
642// M64-DAG: declare dllimport void @"\01??_VImportAlloc@@SAXPEAX@Z"(i8*)
643// G32-DAG: declare dllimport void @_ZN11ImportAllocdaEPv(i8*)
644// G64-DAG: declare dllimport void @_ZN11ImportAllocdaEPv(i8*)
645void UNIQ(use)(ImportAlloc* ptr) { delete[] ptr; }
646
647
648//===----------------------------------------------------------------------===//
649// Class member templates
650//===----------------------------------------------------------------------===//
651
652struct MemFunTmpl {
653 template<typename T> void normalDef() {}
654 template<typename T> __declspec(dllimport) void importedNormal() {}
655 template<typename T> static void staticDef() {}
656 template<typename T> __declspec(dllimport) static void importedStatic() {}
657};
658
659// Import implicit instantiation of an imported member function template.
Stephen Hines176edba2014-12-01 14:53:08 -0800660// M32-DAG: declare dllimport x86_thiscallcc void @"\01??$importedNormal@UImplicitInst_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
661// M64-DAG: declare dllimport void @"\01??$importedNormal@UImplicitInst_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
662// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN10MemFunTmpl14importedNormalI21ImplicitInst_ImportedEEvv(%struct.MemFunTmpl* %this)
663// G64-DAG: define linkonce_odr void @_ZN10MemFunTmpl14importedNormalI21ImplicitInst_ImportedEEvv(%struct.MemFunTmpl* %this)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700664USEMF(MemFunTmpl, importedNormal<ImplicitInst_Imported>)
665
666// MSC-DAG: declare dllimport void @"\01??$importedStatic@UImplicitInst_Imported@@@MemFunTmpl@@SAXXZ"()
Stephen Hines176edba2014-12-01 14:53:08 -0800667// GNU-DAG: define linkonce_odr void @_ZN10MemFunTmpl14importedStaticI21ImplicitInst_ImportedEEvv()
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700668USE(MemFunTmpl::importedStatic<ImplicitInst_Imported>)
669
670
671// Import explicit instantiation declaration of an imported member function
672// template.
673// M32-DAG: declare dllimport x86_thiscallcc void @"\01??$importedNormal@UExplicitDecl_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
674// M64-DAG: declare dllimport void @"\01??$importedNormal@UExplicitDecl_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
Stephen Hines176edba2014-12-01 14:53:08 -0800675// G32-DAG: declare x86_thiscallcc void @_ZN10MemFunTmpl14importedNormalI21ExplicitDecl_ImportedEEvv(%struct.MemFunTmpl*)
676// G64-DAG: declare void @_ZN10MemFunTmpl14importedNormalI21ExplicitDecl_ImportedEEvv(%struct.MemFunTmpl*)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700677extern template void MemFunTmpl::importedNormal<ExplicitDecl_Imported>();
678USEMF(MemFunTmpl, importedNormal<ExplicitDecl_Imported>)
679
680// MSC-DAG: declare dllimport void @"\01??$importedStatic@UExplicitDecl_Imported@@@MemFunTmpl@@SAXXZ"()
Stephen Hines176edba2014-12-01 14:53:08 -0800681// GNU-DAG: declare void @_ZN10MemFunTmpl14importedStaticI21ExplicitDecl_ImportedEEvv()
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700682extern template void MemFunTmpl::importedStatic<ExplicitDecl_Imported>();
683USE(MemFunTmpl::importedStatic<ExplicitDecl_Imported>)
684
685
686// Import explicit instantiation definition of an imported member function
687// template.
688// M32-DAG: declare dllimport x86_thiscallcc void @"\01??$importedNormal@UExplicitInst_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
689// M64-DAG: declare dllimport void @"\01??$importedNormal@UExplicitInst_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
Stephen Hines176edba2014-12-01 14:53:08 -0800690// G32-DAG: define weak_odr x86_thiscallcc void @_ZN10MemFunTmpl14importedNormalI21ExplicitInst_ImportedEEvv(%struct.MemFunTmpl* %this)
691// G64-DAG: define weak_odr void @_ZN10MemFunTmpl14importedNormalI21ExplicitInst_ImportedEEvv(%struct.MemFunTmpl* %this)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700692template void MemFunTmpl::importedNormal<ExplicitInst_Imported>();
693USEMF(MemFunTmpl, importedNormal<ExplicitInst_Imported>)
694
695// MSC-DAG: declare dllimport void @"\01??$importedStatic@UExplicitInst_Imported@@@MemFunTmpl@@SAXXZ"()
Stephen Hines176edba2014-12-01 14:53:08 -0800696// GNU-DAG: define weak_odr void @_ZN10MemFunTmpl14importedStaticI21ExplicitInst_ImportedEEvv()
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700697template void MemFunTmpl::importedStatic<ExplicitInst_Imported>();
698USE(MemFunTmpl::importedStatic<ExplicitInst_Imported>)
699
700
701// Import specialization of an imported member function template.
702// M32-DAG: declare dllimport x86_thiscallcc void @"\01??$importedNormal@UExplicitSpec_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
703// M64-DAG: declare dllimport void @"\01??$importedNormal@UExplicitSpec_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
704// G32-DAG: declare dllimport x86_thiscallcc void @_ZN10MemFunTmpl14importedNormalI21ExplicitSpec_ImportedEEvv(%struct.MemFunTmpl*)
705// G64-DAG: declare dllimport void @_ZN10MemFunTmpl14importedNormalI21ExplicitSpec_ImportedEEvv(%struct.MemFunTmpl*)
706template<> __declspec(dllimport) void MemFunTmpl::importedNormal<ExplicitSpec_Imported>();
707USEMF(MemFunTmpl, importedNormal<ExplicitSpec_Imported>)
708
709// M32-DAG-FIXME: declare dllimport x86_thiscallcc void @"\01??$importedNormal@UExplicitSpec_Def_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
710// M64-DAG-FIXME: declare dllimport void @"\01??$importedNormal@UExplicitSpec_Def_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
711#ifdef MSABI
712//template<> __declspec(dllimport) void MemFunTmpl::importedNormal<ExplicitSpec_Def_Imported>() {}
713//USEMF(MemFunTmpl, importedNormal<ExplicitSpec_Def_Imported>)
714#endif
715
Stephen Hines176edba2014-12-01 14:53:08 -0800716// M32-DAG: declare dllimport x86_thiscallcc void @"\01??$importedNormal@UExplicitSpec_InlineDef_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
717// M64-DAG: declare dllimport void @"\01??$importedNormal@UExplicitSpec_InlineDef_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
718// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN10MemFunTmpl14importedNormalI31ExplicitSpec_InlineDef_ImportedEEvv(%struct.MemFunTmpl* %this)
719// G64-DAG: define linkonce_odr void @_ZN10MemFunTmpl14importedNormalI31ExplicitSpec_InlineDef_ImportedEEvv(%struct.MemFunTmpl* %this)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700720template<> __declspec(dllimport) inline void MemFunTmpl::importedNormal<ExplicitSpec_InlineDef_Imported>() {}
721USEMF(MemFunTmpl, importedNormal<ExplicitSpec_InlineDef_Imported>)
722
723
724// MSC-DAG: declare dllimport void @"\01??$importedStatic@UExplicitSpec_Imported@@@MemFunTmpl@@SAXXZ"()
725// GNU-DAG: declare dllimport void @_ZN10MemFunTmpl14importedStaticI21ExplicitSpec_ImportedEEvv()
726template<> __declspec(dllimport) void MemFunTmpl::importedStatic<ExplicitSpec_Imported>();
727USE(MemFunTmpl::importedStatic<ExplicitSpec_Imported>)
728
729// MSC-DAG-FIXME: declare dllimport void @"\01??$importedStatic@UExplicitSpec_Def_Imported@@@MemFunTmpl@@SAXXZ"()
730#ifdef MSABI
731//template<> __declspec(dllimport) void MemFunTmpl::importedStatic<ExplicitSpec_Def_Imported>() {}
732//USE(MemFunTmpl::importedStatic<ExplicitSpec_Def_Imported>)
733#endif
734
735// MSC-DAG: declare dllimport void @"\01??$importedStatic@UExplicitSpec_InlineDef_Imported@@@MemFunTmpl@@SAXXZ"()
Stephen Hines176edba2014-12-01 14:53:08 -0800736// GNU-DAG: define linkonce_odr void @_ZN10MemFunTmpl14importedStaticI31ExplicitSpec_InlineDef_ImportedEEvv()
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700737template<> __declspec(dllimport) inline void MemFunTmpl::importedStatic<ExplicitSpec_InlineDef_Imported>() {}
738USE(MemFunTmpl::importedStatic<ExplicitSpec_InlineDef_Imported>)
739
740
741// Not importing specialization of an imported member function template without
742// explicit dllimport.
743// M32-DAG: define x86_thiscallcc void @"\01??$importedNormal@UExplicitSpec_NotImported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl* %this)
744// M64-DAG: define void @"\01??$importedNormal@UExplicitSpec_NotImported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl* %this)
745// G32-DAG: define x86_thiscallcc void @_ZN10MemFunTmpl14importedNormalI24ExplicitSpec_NotImportedEEvv(%struct.MemFunTmpl* %this)
746// G64-DAG: define void @_ZN10MemFunTmpl14importedNormalI24ExplicitSpec_NotImportedEEvv(%struct.MemFunTmpl* %this)
747template<> void MemFunTmpl::importedNormal<ExplicitSpec_NotImported>() {}
748USEMF(MemFunTmpl, importedNormal<ExplicitSpec_NotImported>)
749
750// MSC-DAG: define void @"\01??$importedStatic@UExplicitSpec_NotImported@@@MemFunTmpl@@SAXXZ"()
751// GNU-DAG: define void @_ZN10MemFunTmpl14importedStaticI24ExplicitSpec_NotImportedEEvv()
752template<> void MemFunTmpl::importedStatic<ExplicitSpec_NotImported>() {}
753USE(MemFunTmpl::importedStatic<ExplicitSpec_NotImported>)
754
755
756// Import explicit instantiation declaration of a non-imported member function
757// template.
758// M32-DAG: declare dllimport x86_thiscallcc void @"\01??$normalDef@UExplicitDecl_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
759// M64-DAG: declare dllimport void @"\01??$normalDef@UExplicitDecl_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
Stephen Hines176edba2014-12-01 14:53:08 -0800760// G32-DAG: declare x86_thiscallcc void @_ZN10MemFunTmpl9normalDefI21ExplicitDecl_ImportedEEvv(%struct.MemFunTmpl*)
761// G64-DAG: declare void @_ZN10MemFunTmpl9normalDefI21ExplicitDecl_ImportedEEvv(%struct.MemFunTmpl*)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700762extern template __declspec(dllimport) void MemFunTmpl::normalDef<ExplicitDecl_Imported>();
763USEMF(MemFunTmpl, normalDef<ExplicitDecl_Imported>)
764
765// MSC-DAG: declare dllimport void @"\01??$staticDef@UExplicitDecl_Imported@@@MemFunTmpl@@SAXXZ"()
Stephen Hines176edba2014-12-01 14:53:08 -0800766// GNU-DAG: declare void @_ZN10MemFunTmpl9staticDefI21ExplicitDecl_ImportedEEvv()
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700767extern template __declspec(dllimport) void MemFunTmpl::staticDef<ExplicitDecl_Imported>();
768USE(MemFunTmpl::staticDef<ExplicitDecl_Imported>)
769
770
771// Import explicit instantiation definition of a non-imported member function
772// template.
773// M32-DAG: declare dllimport x86_thiscallcc void @"\01??$normalDef@UExplicitInst_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
774// M64-DAG: declare dllimport void @"\01??$normalDef@UExplicitInst_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
Stephen Hines176edba2014-12-01 14:53:08 -0800775// G32-DAG: define weak_odr x86_thiscallcc void @_ZN10MemFunTmpl9normalDefI21ExplicitInst_ImportedEEvv(%struct.MemFunTmpl* %this)
776// G64-DAG: define weak_odr void @_ZN10MemFunTmpl9normalDefI21ExplicitInst_ImportedEEvv(%struct.MemFunTmpl* %this)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700777template __declspec(dllimport) void MemFunTmpl::normalDef<ExplicitInst_Imported>();
778USEMF(MemFunTmpl, normalDef<ExplicitInst_Imported>)
779
780// MSC-DAG: declare dllimport void @"\01??$staticDef@UExplicitInst_Imported@@@MemFunTmpl@@SAXXZ"()
Stephen Hines176edba2014-12-01 14:53:08 -0800781// GNU-DAG: define weak_odr void @_ZN10MemFunTmpl9staticDefI21ExplicitInst_ImportedEEvv()
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700782template __declspec(dllimport) void MemFunTmpl::staticDef<ExplicitInst_Imported>();
783USE(MemFunTmpl::staticDef<ExplicitInst_Imported>)
784
785
786// Import specialization of a non-imported member function template.
787// M32-DAG: declare dllimport x86_thiscallcc void @"\01??$normalDef@UExplicitSpec_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
788// M64-DAG: declare dllimport void @"\01??$normalDef@UExplicitSpec_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
789// G32-DAG: declare dllimport x86_thiscallcc void @_ZN10MemFunTmpl9normalDefI21ExplicitSpec_ImportedEEvv(%struct.MemFunTmpl*)
790// G64-DAG: declare dllimport void @_ZN10MemFunTmpl9normalDefI21ExplicitSpec_ImportedEEvv(%struct.MemFunTmpl*)
791template<> __declspec(dllimport) void MemFunTmpl::normalDef<ExplicitSpec_Imported>();
792USEMF(MemFunTmpl, normalDef<ExplicitSpec_Imported>)
793
794// M32-DAG-FIXME: declare dllimport x86_thiscallcc void @"\01??$normalDef@UExplicitSpec_Def_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
795// M64-DAG-FIXME: declare dllimport void @"\01??$normalDef@UExplicitSpec_Def_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
796#ifdef MSABI
797//template<> __declspec(dllimport) void MemFunTmpl::normalDef<ExplicitSpec_Def_Imported>() {}
798//USEMF(MemFunTmpl, normalDef<ExplicitSpec_Def_Imported>)
799#endif
800
Stephen Hines176edba2014-12-01 14:53:08 -0800801// M32-DAG: declare dllimport x86_thiscallcc void @"\01??$normalDef@UExplicitSpec_InlineDef_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
802// M64-DAG: declare dllimport void @"\01??$normalDef@UExplicitSpec_InlineDef_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
803// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN10MemFunTmpl9normalDefI31ExplicitSpec_InlineDef_ImportedEEvv(%struct.MemFunTmpl* %this)
804// G64-DAG: define linkonce_odr void @_ZN10MemFunTmpl9normalDefI31ExplicitSpec_InlineDef_ImportedEEvv(%struct.MemFunTmpl* %this)
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700805template<> __declspec(dllimport) inline void MemFunTmpl::normalDef<ExplicitSpec_InlineDef_Imported>() {}
806USEMF(MemFunTmpl, normalDef<ExplicitSpec_InlineDef_Imported>)
807
808
809// MSC-DAG: declare dllimport void @"\01??$staticDef@UExplicitSpec_Imported@@@MemFunTmpl@@SAXXZ"()
810// GNU-DAG: declare dllimport void @_ZN10MemFunTmpl9staticDefI21ExplicitSpec_ImportedEEvv()
811template<> __declspec(dllimport) void MemFunTmpl::staticDef<ExplicitSpec_Imported>();
812USE(MemFunTmpl::staticDef<ExplicitSpec_Imported>)
813
814// MSC-DAG-FIXME: declare dllimport void @"\01??$staticDef@UExplicitSpec_Def_Imported@@@MemFunTmpl@@SAXXZ"()
815#ifdef MSABI
816//template<> __declspec(dllimport) void MemFunTmpl::staticDef<ExplicitSpec_Def_Imported>() {}
817//USE(MemFunTmpl::staticDef<ExplicitSpec_Def_Imported>)
818#endif
819
820// MSC-DAG: declare dllimport void @"\01??$staticDef@UExplicitSpec_InlineDef_Imported@@@MemFunTmpl@@SAXXZ"()
Stephen Hines176edba2014-12-01 14:53:08 -0800821// GNU-DAG: define linkonce_odr void @_ZN10MemFunTmpl9staticDefI31ExplicitSpec_InlineDef_ImportedEEvv()
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700822template<> __declspec(dllimport) inline void MemFunTmpl::staticDef<ExplicitSpec_InlineDef_Imported>() {}
823USE(MemFunTmpl::staticDef<ExplicitSpec_InlineDef_Imported>)
824
825
826
827struct MemVarTmpl {
828 template<typename T> static const int StaticVar = 1;
829 template<typename T> __declspec(dllimport) static const int ImportedStaticVar = 1;
830};
831
832// Import implicit instantiation of an imported member variable template.
833// MSC-DAG: @"\01??$ImportedStaticVar@UImplicitInst_Imported@@@MemVarTmpl@@2HB" = available_externally dllimport constant i32 1, align 4
834// GNU-DAG: @_ZN10MemVarTmpl17ImportedStaticVarI21ImplicitInst_ImportedEE = external dllimport constant i32
835USEMV(MemVarTmpl, ImportedStaticVar<ImplicitInst_Imported>)
836
837// Import explicit instantiation declaration of an imported member variable
838// template.
839// MSC-DAG: @"\01??$ImportedStaticVar@UExplicitDecl_Imported@@@MemVarTmpl@@2HB" = external dllimport constant i32
840// GNU-DAG: @_ZN10MemVarTmpl17ImportedStaticVarI21ExplicitDecl_ImportedEE = external dllimport constant i32
841extern template const int MemVarTmpl::ImportedStaticVar<ExplicitDecl_Imported>;
842USEMV(MemVarTmpl, ImportedStaticVar<ExplicitDecl_Imported>)
843
844// An explicit instantiation definition of an imported member variable template
845// cannot be imported because the template must be defined which is illegal. The
846// in-class initializer does not count.
847
848// Import specialization of an imported member variable template.
849// MSC-DAG: @"\01??$ImportedStaticVar@UExplicitSpec_Imported@@@MemVarTmpl@@2HB" = external dllimport constant i32
850// GNU-DAG: @_ZN10MemVarTmpl17ImportedStaticVarI21ExplicitSpec_ImportedEE = external dllimport constant i32
851template<> __declspec(dllimport) const int MemVarTmpl::ImportedStaticVar<ExplicitSpec_Imported>;
852USEMV(MemVarTmpl, ImportedStaticVar<ExplicitSpec_Imported>)
853
854// Not importing specialization of a member variable template without explicit
855// dllimport.
856// MSC-DAG: @"\01??$ImportedStaticVar@UExplicitSpec_NotImported@@@MemVarTmpl@@2HB" = external constant i32
857// GNU-DAG: @_ZN10MemVarTmpl17ImportedStaticVarI24ExplicitSpec_NotImportedEE = external constant i32
858template<> const int MemVarTmpl::ImportedStaticVar<ExplicitSpec_NotImported>;
859USEMV(MemVarTmpl, ImportedStaticVar<ExplicitSpec_NotImported>)
860
861
862// Import explicit instantiation declaration of a non-imported member variable
863// template.
864// MSC-DAG: @"\01??$StaticVar@UExplicitDecl_Imported@@@MemVarTmpl@@2HB" = external dllimport constant i32
865// GNU-DAG: @_ZN10MemVarTmpl9StaticVarI21ExplicitDecl_ImportedEE = external dllimport constant i32
866extern template __declspec(dllimport) const int MemVarTmpl::StaticVar<ExplicitDecl_Imported>;
867USEMV(MemVarTmpl, StaticVar<ExplicitDecl_Imported>)
868
869// An explicit instantiation definition of a non-imported member variable template
870// cannot be imported because the template must be defined which is illegal. The
871// in-class initializer does not count.
872
873// Import specialization of a non-imported member variable template.
874// MSC-DAG: @"\01??$StaticVar@UExplicitSpec_Imported@@@MemVarTmpl@@2HB" = external dllimport constant i32
875// GNU-DAG: @_ZN10MemVarTmpl9StaticVarI21ExplicitSpec_ImportedEE = external dllimport constant i32
876template<> __declspec(dllimport) const int MemVarTmpl::StaticVar<ExplicitSpec_Imported>;
877USEMV(MemVarTmpl, StaticVar<ExplicitSpec_Imported>)