xref: /aosp_15_r20/external/clang/test/CodeGenCXX/dllimport-members.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // 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*67e74705SXin Li // 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*67e74705SXin Li // RUN: %clang_cc1 -triple i686-windows-gnu                       -emit-llvm -std=c++1y -O0 -o - %s         | FileCheck --check-prefix=GNU --check-prefix=G32 %s
4*67e74705SXin Li // 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*67e74705SXin Li // RUN: %clang_cc1 -triple i686-windows-msvc -fms-compatibility   -emit-llvm -std=c++1y -O1 -o - %s -DMSABI | FileCheck --check-prefix=MO1 %s
6*67e74705SXin Li // RUN: %clang_cc1 -triple i686-windows-gnu                       -emit-llvm -std=c++1y -O1 -o - %s         | FileCheck --check-prefix=GO1 %s
7*67e74705SXin Li 
8*67e74705SXin Li // Helper structs to make templates more expressive.
9*67e74705SXin Li struct ImplicitInst_Imported {};
10*67e74705SXin Li struct ExplicitDecl_Imported {};
11*67e74705SXin Li struct ExplicitInst_Imported {};
12*67e74705SXin Li struct ExplicitSpec_Imported {};
13*67e74705SXin Li struct ExplicitSpec_Def_Imported {};
14*67e74705SXin Li struct ExplicitSpec_InlineDef_Imported {};
15*67e74705SXin Li struct ExplicitSpec_NotImported {};
16*67e74705SXin Li 
17*67e74705SXin Li #define JOIN2(x, y) x##y
18*67e74705SXin Li #define JOIN(x, y) JOIN2(x, y)
19*67e74705SXin Li #define UNIQ(name) JOIN(name, __LINE__)
20*67e74705SXin Li #define USE(func) void UNIQ(use)() { func(); }
21*67e74705SXin Li #define USEMV(cls, var) int UNIQ(use)() { return ref(cls::var); }
22*67e74705SXin Li #define USEMF(cls, fun) template<> void useMemFun<__LINE__, cls>() { cls().fun(); }
23*67e74705SXin Li #define USESPECIALS(cls) void UNIQ(use)() { useSpecials<cls>(); }
24*67e74705SXin Li 
25*67e74705SXin Li template<typename T>
ref(T const & v)26*67e74705SXin Li T ref(T const& v) { return v; }
27*67e74705SXin Li 
28*67e74705SXin Li template<int Line, typename T>
29*67e74705SXin Li void useMemFun();
30*67e74705SXin Li 
31*67e74705SXin Li template<typename T>
useSpecials()32*67e74705SXin Li void useSpecials() {
33*67e74705SXin Li   T v; // Default constructor
34*67e74705SXin Li 
35*67e74705SXin Li   T c1(static_cast<const T&>(v)); // Copy constructor
36*67e74705SXin Li   T c2 = static_cast<const T&>(v); // Copy constructor
37*67e74705SXin Li   T c3;
38*67e74705SXin Li   c3 = static_cast<const T&>(v); // Copy assignment
39*67e74705SXin Li 
40*67e74705SXin Li   T m1(static_cast<T&&>(v)); // Move constructor
41*67e74705SXin Li   T m2 = static_cast<T&&>(v); // Move constructor
42*67e74705SXin Li   T m3;
43*67e74705SXin Li   m3 = static_cast<T&&>(v); // Move assignment
44*67e74705SXin Li }
45*67e74705SXin Li 
46*67e74705SXin Li // Used to force non-trivial special members.
47*67e74705SXin Li struct ForceNonTrivial {
48*67e74705SXin Li   ForceNonTrivial();
49*67e74705SXin Li   ~ForceNonTrivial();
50*67e74705SXin Li   ForceNonTrivial(const ForceNonTrivial&);
51*67e74705SXin Li   ForceNonTrivial& operator=(const ForceNonTrivial&);
52*67e74705SXin Li   ForceNonTrivial(ForceNonTrivial&&);
53*67e74705SXin Li   ForceNonTrivial& operator=(ForceNonTrivial&&);
54*67e74705SXin Li };
55*67e74705SXin Li 
56*67e74705SXin Li 
57*67e74705SXin Li 
58*67e74705SXin Li //===----------------------------------------------------------------------===//
59*67e74705SXin Li // Class members
60*67e74705SXin Li //===----------------------------------------------------------------------===//
61*67e74705SXin Li 
62*67e74705SXin Li // Import individual members of a class.
63*67e74705SXin Li struct ImportMembers {
64*67e74705SXin Li   struct Nested;
65*67e74705SXin Li 
66*67e74705SXin Li   // M32-DAG: define  dllexport   x86_thiscallcc void @"\01?normalDef@ImportMembers@@QAEXXZ"(%struct.ImportMembers* %this)
67*67e74705SXin Li   // M64-DAG: define  dllexport                  void @"\01?normalDef@ImportMembers@@QEAAXXZ"(%struct.ImportMembers* %this)
68*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?normalDecl@ImportMembers@@QAEXXZ"(%struct.ImportMembers*)
69*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?normalDecl@ImportMembers@@QEAAXXZ"(%struct.ImportMembers*)
70*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?normalInclass@ImportMembers@@QAEXXZ"(%struct.ImportMembers*)
71*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?normalInclass@ImportMembers@@QEAAXXZ"(%struct.ImportMembers*)
72*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?normalInlineDef@ImportMembers@@QAEXXZ"(%struct.ImportMembers*)
73*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?normalInlineDef@ImportMembers@@QEAAXXZ"(%struct.ImportMembers*)
74*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?normalInlineDecl@ImportMembers@@QAEXXZ"(%struct.ImportMembers*)
75*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?normalInlineDecl@ImportMembers@@QEAAXXZ"(%struct.ImportMembers*)
76*67e74705SXin Li   // G32-DAG: define              x86_thiscallcc void @_ZN13ImportMembers9normalDefEv(%struct.ImportMembers* %this)
77*67e74705SXin Li   // G64-DAG: define                             void @_ZN13ImportMembers9normalDefEv(%struct.ImportMembers* %this)
78*67e74705SXin Li   // G32-DAG: declare dllimport   x86_thiscallcc void @_ZN13ImportMembers10normalDeclEv(%struct.ImportMembers*)
79*67e74705SXin Li   // G64-DAG: declare dllimport                  void @_ZN13ImportMembers10normalDeclEv(%struct.ImportMembers*)
80*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers13normalInclassEv(%struct.ImportMembers* %this)
81*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN13ImportMembers13normalInclassEv(%struct.ImportMembers* %this)
82*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers15normalInlineDefEv(%struct.ImportMembers* %this)
83*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN13ImportMembers15normalInlineDefEv(%struct.ImportMembers* %this)
84*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers16normalInlineDeclEv(%struct.ImportMembers* %this)
85*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN13ImportMembers16normalInlineDeclEv(%struct.ImportMembers* %this)
86*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?normalInclass@ImportMembers@@QAEXXZ"(
87*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?normalInlineDef@ImportMembers@@QAEXXZ"(
88*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?normalInlineDecl@ImportMembers@@QAEXXZ"(
89*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers13normalInclassEv(
90*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers15normalInlineDefEv(
91*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers16normalInlineDeclEv(
92*67e74705SXin Li   __declspec(dllimport)                void normalDef(); // dllimport ignored
93*67e74705SXin Li   __declspec(dllimport)                void normalDecl();
normalInclassImportMembers94*67e74705SXin Li   __declspec(dllimport)                void normalInclass() {}
95*67e74705SXin Li   __declspec(dllimport)                void normalInlineDef();
96*67e74705SXin Li   __declspec(dllimport)         inline void normalInlineDecl();
97*67e74705SXin Li 
98*67e74705SXin Li   // M32-DAG: define  dllexport   x86_thiscallcc void @"\01?virtualDef@ImportMembers@@UAEXXZ"(%struct.ImportMembers* %this)
99*67e74705SXin Li   // M64-DAG: define  dllexport                  void @"\01?virtualDef@ImportMembers@@UEAAXXZ"(%struct.ImportMembers* %this)
100*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?virtualDecl@ImportMembers@@UAEXXZ"(%struct.ImportMembers*)
101*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?virtualDecl@ImportMembers@@UEAAXXZ"(%struct.ImportMembers*)
102*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?virtualInclass@ImportMembers@@UAEXXZ"(%struct.ImportMembers*)
103*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?virtualInclass@ImportMembers@@UEAAXXZ"(%struct.ImportMembers*)
104*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?virtualInlineDef@ImportMembers@@UAEXXZ"(%struct.ImportMembers*)
105*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?virtualInlineDef@ImportMembers@@UEAAXXZ"(%struct.ImportMembers*)
106*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?virtualInlineDecl@ImportMembers@@UAEXXZ"(%struct.ImportMembers*)
107*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?virtualInlineDecl@ImportMembers@@UEAAXXZ"(%struct.ImportMembers*)
108*67e74705SXin Li   // G32-DAG: define              x86_thiscallcc void @_ZN13ImportMembers10virtualDefEv(%struct.ImportMembers* %this)
109*67e74705SXin Li   // G64-DAG: define                             void @_ZN13ImportMembers10virtualDefEv(%struct.ImportMembers* %this)
110*67e74705SXin Li   // G32-DAG: declare dllimport   x86_thiscallcc void @_ZN13ImportMembers11virtualDeclEv(%struct.ImportMembers*)
111*67e74705SXin Li   // G64-DAG: declare dllimport                  void @_ZN13ImportMembers11virtualDeclEv(%struct.ImportMembers*)
112*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers14virtualInclassEv(%struct.ImportMembers* %this)
113*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN13ImportMembers14virtualInclassEv(%struct.ImportMembers* %this)
114*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers16virtualInlineDefEv(%struct.ImportMembers* %this)
115*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN13ImportMembers16virtualInlineDefEv(%struct.ImportMembers* %this)
116*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers17virtualInlineDeclEv(%struct.ImportMembers* %this)
117*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN13ImportMembers17virtualInlineDeclEv(%struct.ImportMembers* %this)
118*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?virtualInclass@ImportMembers@@UAEXXZ"(
119*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?virtualInlineDef@ImportMembers@@UAEXXZ"(
120*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?virtualInlineDecl@ImportMembers@@UAEXXZ"(
121*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers14virtualInclassEv(
122*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers16virtualInlineDefEv(
123*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers17virtualInlineDeclEv(
124*67e74705SXin Li   __declspec(dllimport) virtual        void virtualDef(); // dllimport ignored
125*67e74705SXin Li   __declspec(dllimport) virtual        void virtualDecl();
virtualInclassImportMembers126*67e74705SXin Li   __declspec(dllimport) virtual        void virtualInclass() {}
127*67e74705SXin Li   __declspec(dllimport) virtual        void virtualInlineDef();
128*67e74705SXin Li   __declspec(dllimport) virtual inline void virtualInlineDecl();
129*67e74705SXin Li 
130*67e74705SXin Li   // MSC-DAG: define  dllexport                void @"\01?staticDef@ImportMembers@@SAXXZ"()
131*67e74705SXin Li   // MSC-DAG: declare dllimport                void @"\01?staticDecl@ImportMembers@@SAXXZ"()
132*67e74705SXin Li   // MSC-DAG: declare dllimport                void @"\01?staticInclass@ImportMembers@@SAXXZ"()
133*67e74705SXin Li   // MSC-DAG: declare dllimport                void @"\01?staticInlineDef@ImportMembers@@SAXXZ"()
134*67e74705SXin Li   // MSC-DAG: declare dllimport                void @"\01?staticInlineDecl@ImportMembers@@SAXXZ"()
135*67e74705SXin Li   // GNU-DAG: define                           void @_ZN13ImportMembers9staticDefEv()
136*67e74705SXin Li   // GNU-DAG: declare dllimport                void @_ZN13ImportMembers10staticDeclEv()
137*67e74705SXin Li   // GNU-DAG: define linkonce_odr              void @_ZN13ImportMembers13staticInclassEv()
138*67e74705SXin Li   // GNU-DAG: define linkonce_odr              void @_ZN13ImportMembers15staticInlineDefEv()
139*67e74705SXin Li   // GNU-DAG: define linkonce_odr              void @_ZN13ImportMembers16staticInlineDeclEv()
140*67e74705SXin Li   // MO1-DAG: define available_externally dllimport void @"\01?staticInclass@ImportMembers@@SAXXZ"()
141*67e74705SXin Li   // MO1-DAG: define available_externally dllimport void @"\01?staticInlineDef@ImportMembers@@SAXXZ"()
142*67e74705SXin Li   // MO1-DAG: define available_externally dllimport void @"\01?staticInlineDecl@ImportMembers@@SAXXZ"()
143*67e74705SXin Li   // GO1-DAG: define linkonce_odr              void @_ZN13ImportMembers13staticInclassEv()
144*67e74705SXin Li   // GO1-DAG: define linkonce_odr              void @_ZN13ImportMembers15staticInlineDefEv()
145*67e74705SXin Li   // GO1-DAG: define linkonce_odr              void @_ZN13ImportMembers16staticInlineDeclEv()
146*67e74705SXin Li   __declspec(dllimport) static         void staticDef(); // dllimport ignored
147*67e74705SXin Li   __declspec(dllimport) static         void staticDecl();
staticInclassImportMembers148*67e74705SXin Li   __declspec(dllimport) static         void staticInclass() {}
149*67e74705SXin Li   __declspec(dllimport) static         void staticInlineDef();
150*67e74705SXin Li   __declspec(dllimport) static  inline void staticInlineDecl();
151*67e74705SXin Li 
152*67e74705SXin Li   // M32-DAG: declare dllimport x86_thiscallcc void @"\01?protectedNormalDecl@ImportMembers@@IAEXXZ"(%struct.ImportMembers*)
153*67e74705SXin Li   // M64-DAG: declare dllimport                void @"\01?protectedNormalDecl@ImportMembers@@IEAAXXZ"(%struct.ImportMembers*)
154*67e74705SXin Li   // G32-DAG: declare dllimport x86_thiscallcc void @_ZN13ImportMembers19protectedNormalDeclEv(%struct.ImportMembers*)
155*67e74705SXin Li   // G64-DAG: declare dllimport                void @_ZN13ImportMembers19protectedNormalDeclEv(%struct.ImportMembers*)
156*67e74705SXin Li   // MSC-DAG: declare dllimport                void @"\01?protectedStaticDecl@ImportMembers@@KAXXZ"()
157*67e74705SXin Li   // GNU-DAG: declare dllimport                void @_ZN13ImportMembers19protectedStaticDeclEv()
158*67e74705SXin Li protected:
159*67e74705SXin Li   __declspec(dllimport)                void protectedNormalDecl();
160*67e74705SXin Li   __declspec(dllimport) static         void protectedStaticDecl();
161*67e74705SXin Li 
162*67e74705SXin Li   // M32-DAG: declare dllimport x86_thiscallcc void @"\01?privateNormalDecl@ImportMembers@@AAEXXZ"(%struct.ImportMembers*)
163*67e74705SXin Li   // M64-DAG: declare dllimport                void @"\01?privateNormalDecl@ImportMembers@@AEAAXXZ"(%struct.ImportMembers*)
164*67e74705SXin Li   // G32-DAG: declare dllimport x86_thiscallcc void @_ZN13ImportMembers17privateNormalDeclEv(%struct.ImportMembers*)
165*67e74705SXin Li   // G64-DAG: declare dllimport                void @_ZN13ImportMembers17privateNormalDeclEv(%struct.ImportMembers*)
166*67e74705SXin Li   // MSC-DAG: declare dllimport                void @"\01?privateStaticDecl@ImportMembers@@CAXXZ"()
167*67e74705SXin Li   // GNU-DAG: declare dllimport                void @_ZN13ImportMembers17privateStaticDeclEv()
168*67e74705SXin Li private:
169*67e74705SXin Li   __declspec(dllimport)                void privateNormalDecl();
170*67e74705SXin Li   __declspec(dllimport) static         void privateStaticDecl();
171*67e74705SXin Li 
172*67e74705SXin Li   // M32-DAG: declare           x86_thiscallcc void @"\01?ignored@ImportMembers@@QAEXXZ"(%struct.ImportMembers*)
173*67e74705SXin Li   // M64-DAG: declare                          void @"\01?ignored@ImportMembers@@QEAAXXZ"(%struct.ImportMembers*)
174*67e74705SXin Li   // G32-DAG: declare           x86_thiscallcc void @_ZN13ImportMembers7ignoredEv(%struct.ImportMembers*)
175*67e74705SXin Li   // G64-DAG: declare                          void @_ZN13ImportMembers7ignoredEv(%struct.ImportMembers*)
176*67e74705SXin Li public:
177*67e74705SXin Li   void ignored();
178*67e74705SXin Li 
179*67e74705SXin Li   // MSC-DAG: @"\01?StaticField@ImportMembers@@2HA"               = external dllimport global i32
180*67e74705SXin Li   // MSC-DAG: @"\01?StaticConstField@ImportMembers@@2HB"          = external dllimport constant i32
181*67e74705SXin Li   // MSC-DAG: @"\01?StaticConstFieldEqualInit@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4
182*67e74705SXin Li   // MSC-DAG: @"\01?StaticConstFieldBraceInit@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4
183*67e74705SXin Li   // MSC-DAG: @"\01?ConstexprField@ImportMembers@@2HB"            = available_externally dllimport constant i32 1, align 4
184*67e74705SXin Li   // GNU-DAG: @_ZN13ImportMembers11StaticFieldE                   = external dllimport global i32
185*67e74705SXin Li   // GNU-DAG: @_ZN13ImportMembers16StaticConstFieldE              = external dllimport constant i32
186*67e74705SXin Li   // GNU-DAG: @_ZN13ImportMembers25StaticConstFieldEqualInitE     = external dllimport constant i32
187*67e74705SXin Li   // GNU-DAG: @_ZN13ImportMembers25StaticConstFieldBraceInitE     = external dllimport constant i32
188*67e74705SXin Li   // GNU-DAG: @_ZN13ImportMembers14ConstexprFieldE                = external dllimport constant i32
189*67e74705SXin Li   __declspec(dllimport) static         int  StaticField;
190*67e74705SXin Li   __declspec(dllimport) static  const  int  StaticConstField;
191*67e74705SXin Li   __declspec(dllimport) static  const  int  StaticConstFieldEqualInit = 1;
192*67e74705SXin Li   __declspec(dllimport) static  const  int  StaticConstFieldBraceInit{1};
193*67e74705SXin Li   __declspec(dllimport) constexpr static int ConstexprField = 1;
194*67e74705SXin Li 
195*67e74705SXin Li   template<int Line, typename T> friend void useMemFun();
196*67e74705SXin Li };
197*67e74705SXin Li 
normalDef()198*67e74705SXin Li        void ImportMembers::normalDef() {} // dllimport ignored
normalInlineDef()199*67e74705SXin Li inline void ImportMembers::normalInlineDef() {}
normalInlineDecl()200*67e74705SXin Li        void ImportMembers::normalInlineDecl() {}
virtualDef()201*67e74705SXin Li        void ImportMembers::virtualDef() {} // dllimport ignored
virtualInlineDef()202*67e74705SXin Li inline void ImportMembers::virtualInlineDef() {}
virtualInlineDecl()203*67e74705SXin Li        void ImportMembers::virtualInlineDecl() {}
staticDef()204*67e74705SXin Li        void ImportMembers::staticDef() {} // dllimport ignored
staticInlineDef()205*67e74705SXin Li inline void ImportMembers::staticInlineDef() {}
staticInlineDecl()206*67e74705SXin Li        void ImportMembers::staticInlineDecl() {}
207*67e74705SXin Li 
208*67e74705SXin Li USEMF(ImportMembers, normalDef)
209*67e74705SXin Li USEMF(ImportMembers, normalDecl)
210*67e74705SXin Li USEMF(ImportMembers, normalInclass)
211*67e74705SXin Li USEMF(ImportMembers, normalInlineDef)
212*67e74705SXin Li USEMF(ImportMembers, normalInlineDecl)
213*67e74705SXin Li USEMF(ImportMembers, virtualDef)
214*67e74705SXin Li USEMF(ImportMembers, virtualDecl)
215*67e74705SXin Li USEMF(ImportMembers, virtualInclass)
216*67e74705SXin Li USEMF(ImportMembers, virtualInlineDef)
217*67e74705SXin Li USEMF(ImportMembers, virtualInlineDecl)
218*67e74705SXin Li USEMF(ImportMembers, staticDef)
219*67e74705SXin Li USEMF(ImportMembers, staticDecl)
220*67e74705SXin Li USEMF(ImportMembers, staticInclass)
221*67e74705SXin Li USEMF(ImportMembers, staticInlineDef)
222*67e74705SXin Li USEMF(ImportMembers, staticInlineDecl)
223*67e74705SXin Li USEMF(ImportMembers, protectedNormalDecl)
224*67e74705SXin Li USEMF(ImportMembers, protectedStaticDecl)
225*67e74705SXin Li USEMF(ImportMembers, privateNormalDecl)
226*67e74705SXin Li USEMF(ImportMembers, privateStaticDecl)
227*67e74705SXin Li USEMF(ImportMembers, ignored)
228*67e74705SXin Li 
229*67e74705SXin Li USEMV(ImportMembers, StaticField)
230*67e74705SXin Li USEMV(ImportMembers, StaticConstField)
231*67e74705SXin Li USEMV(ImportMembers, StaticConstFieldEqualInit)
232*67e74705SXin Li USEMV(ImportMembers, StaticConstFieldBraceInit)
233*67e74705SXin Li USEMV(ImportMembers, ConstexprField)
234*67e74705SXin Li 
235*67e74705SXin Li 
236*67e74705SXin Li // Import individual members of a nested class.
237*67e74705SXin Li struct ImportMembers::Nested {
238*67e74705SXin Li   // M32-DAG: define  dllexport   x86_thiscallcc void @"\01?normalDef@Nested@ImportMembers@@QAEXXZ"(%"struct.ImportMembers::Nested"* %this)
239*67e74705SXin Li   // M64-DAG: define  dllexport                  void @"\01?normalDef@Nested@ImportMembers@@QEAAXXZ"(%"struct.ImportMembers::Nested"* %this)
240*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?normalDecl@Nested@ImportMembers@@QAEXXZ"(%"struct.ImportMembers::Nested"*)
241*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?normalDecl@Nested@ImportMembers@@QEAAXXZ"(%"struct.ImportMembers::Nested"*)
242*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?normalInclass@Nested@ImportMembers@@QAEXXZ"(%"struct.ImportMembers::Nested"*)
243*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?normalInclass@Nested@ImportMembers@@QEAAXXZ"(%"struct.ImportMembers::Nested"*)
244*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?normalInlineDef@Nested@ImportMembers@@QAEXXZ"(%"struct.ImportMembers::Nested"*)
245*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?normalInlineDef@Nested@ImportMembers@@QEAAXXZ"(%"struct.ImportMembers::Nested"*)
246*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?normalInlineDecl@Nested@ImportMembers@@QAEXXZ"(%"struct.ImportMembers::Nested"*)
247*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?normalInlineDecl@Nested@ImportMembers@@QEAAXXZ"(%"struct.ImportMembers::Nested"*)
248*67e74705SXin Li   // G32-DAG: define              x86_thiscallcc void @_ZN13ImportMembers6Nested9normalDefEv(%"struct.ImportMembers::Nested"* %this)
249*67e74705SXin Li   // G64-DAG: define                             void @_ZN13ImportMembers6Nested9normalDefEv(%"struct.ImportMembers::Nested"* %this)
250*67e74705SXin Li   // G32-DAG: declare dllimport   x86_thiscallcc void @_ZN13ImportMembers6Nested10normalDeclEv(%"struct.ImportMembers::Nested"*)
251*67e74705SXin Li   // G64-DAG: declare dllimport                  void @_ZN13ImportMembers6Nested10normalDeclEv(%"struct.ImportMembers::Nested"*)
252*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested13normalInclassEv(%"struct.ImportMembers::Nested"* %this)
253*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN13ImportMembers6Nested13normalInclassEv(%"struct.ImportMembers::Nested"* %this)
254*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested15normalInlineDefEv(%"struct.ImportMembers::Nested"* %this)
255*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN13ImportMembers6Nested15normalInlineDefEv(%"struct.ImportMembers::Nested"* %this)
256*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested16normalInlineDeclEv(%"struct.ImportMembers::Nested"* %this)
257*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN13ImportMembers6Nested16normalInlineDeclEv(%"struct.ImportMembers::Nested"* %this)
258*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?normalInclass@Nested@ImportMembers@@QAEXXZ"(
259*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?normalInlineDef@Nested@ImportMembers@@QAEXXZ"(
260*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?normalInlineDecl@Nested@ImportMembers@@QAEXXZ"(
261*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested13normalInclassEv(
262*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested15normalInlineDefEv(
263*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested16normalInlineDeclEv(
264*67e74705SXin Li   __declspec(dllimport)                void normalDef(); // dllimport ignored
265*67e74705SXin Li   __declspec(dllimport)                void normalDecl();
normalInclassImportMembers::Nested266*67e74705SXin Li   __declspec(dllimport)                void normalInclass() {}
267*67e74705SXin Li   __declspec(dllimport)                void normalInlineDef();
268*67e74705SXin Li   __declspec(dllimport)         inline void normalInlineDecl();
269*67e74705SXin Li 
270*67e74705SXin Li   // M32-DAG: define  dllexport   x86_thiscallcc void @"\01?virtualDef@Nested@ImportMembers@@UAEXXZ"(%"struct.ImportMembers::Nested"* %this)
271*67e74705SXin Li   // M64-DAG: define  dllexport                  void @"\01?virtualDef@Nested@ImportMembers@@UEAAXXZ"(%"struct.ImportMembers::Nested"* %this)
272*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?virtualDecl@Nested@ImportMembers@@UAEXXZ"(%"struct.ImportMembers::Nested"*)
273*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?virtualDecl@Nested@ImportMembers@@UEAAXXZ"(%"struct.ImportMembers::Nested"*)
274*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?virtualInclass@Nested@ImportMembers@@UAEXXZ"(%"struct.ImportMembers::Nested"*)
275*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?virtualInclass@Nested@ImportMembers@@UEAAXXZ"(%"struct.ImportMembers::Nested"*)
276*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?virtualInlineDef@Nested@ImportMembers@@UAEXXZ"(%"struct.ImportMembers::Nested"*)
277*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?virtualInlineDef@Nested@ImportMembers@@UEAAXXZ"(%"struct.ImportMembers::Nested"*)
278*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01?virtualInlineDecl@Nested@ImportMembers@@UAEXXZ"(%"struct.ImportMembers::Nested"*)
279*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01?virtualInlineDecl@Nested@ImportMembers@@UEAAXXZ"(%"struct.ImportMembers::Nested"*)
280*67e74705SXin Li   // G32-DAG: define              x86_thiscallcc void @_ZN13ImportMembers6Nested10virtualDefEv(%"struct.ImportMembers::Nested"* %this)
281*67e74705SXin Li   // G64-DAG: define                             void @_ZN13ImportMembers6Nested10virtualDefEv(%"struct.ImportMembers::Nested"* %this)
282*67e74705SXin Li   // G32-DAG: declare dllimport   x86_thiscallcc void @_ZN13ImportMembers6Nested11virtualDeclEv(%"struct.ImportMembers::Nested"*)
283*67e74705SXin Li   // G64-DAG: declare dllimport                  void @_ZN13ImportMembers6Nested11virtualDeclEv(%"struct.ImportMembers::Nested"*)
284*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested14virtualInclassEv(%"struct.ImportMembers::Nested"* %this)
285*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN13ImportMembers6Nested14virtualInclassEv(%"struct.ImportMembers::Nested"* %this)
286*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested16virtualInlineDefEv(%"struct.ImportMembers::Nested"* %this)
287*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN13ImportMembers6Nested16virtualInlineDefEv(%"struct.ImportMembers::Nested"* %this)
288*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ImportMembers6Nested17virtualInlineDeclEv(%"struct.ImportMembers::Nested"* %this)
289*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN13ImportMembers6Nested17virtualInlineDeclEv(%"struct.ImportMembers::Nested"* %this)
290*67e74705SXin Li 
291*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?virtualInclass@Nested@ImportMembers@@UAEXXZ"(
292*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?virtualInlineDef@Nested@ImportMembers@@UAEXXZ"(
293*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?virtualInlineDecl@Nested@ImportMembers@@UAEXXZ"(
294*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc                   void @_ZN13ImportMembers6Nested14virtualInclassEv(
295*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc                   void @_ZN13ImportMembers6Nested16virtualInlineDefEv(
296*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc                   void @_ZN13ImportMembers6Nested17virtualInlineDeclEv(
297*67e74705SXin Li   __declspec(dllimport) virtual        void virtualDef(); // dllimport ignored
298*67e74705SXin Li   __declspec(dllimport) virtual        void virtualDecl();
virtualInclassImportMembers::Nested299*67e74705SXin Li   __declspec(dllimport) virtual        void virtualInclass() {}
300*67e74705SXin Li   __declspec(dllimport) virtual        void virtualInlineDef();
301*67e74705SXin Li   __declspec(dllimport) virtual inline void virtualInlineDecl();
302*67e74705SXin Li 
303*67e74705SXin Li   // MSC-DAG: define  dllexport                void @"\01?staticDef@Nested@ImportMembers@@SAXXZ"()
304*67e74705SXin Li   // MSC-DAG: declare dllimport                void @"\01?staticDecl@Nested@ImportMembers@@SAXXZ"()
305*67e74705SXin Li   // MSC-DAG: declare dllimport                void @"\01?staticInclass@Nested@ImportMembers@@SAXXZ"()
306*67e74705SXin Li   // MSC-DAG: declare dllimport                void @"\01?staticInlineDef@Nested@ImportMembers@@SAXXZ"()
307*67e74705SXin Li   // MSC-DAG: declare dllimport                void @"\01?staticInlineDecl@Nested@ImportMembers@@SAXXZ"()
308*67e74705SXin Li   // GNU-DAG: define                           void @_ZN13ImportMembers6Nested9staticDefEv()
309*67e74705SXin Li   // GNU-DAG: declare dllimport                void @_ZN13ImportMembers6Nested10staticDeclEv()
310*67e74705SXin Li   // GNU-DAG: define linkonce_odr              void @_ZN13ImportMembers6Nested13staticInclassEv()
311*67e74705SXin Li   // GNU-DAG: define linkonce_odr              void @_ZN13ImportMembers6Nested15staticInlineDefEv()
312*67e74705SXin Li   // GNU-DAG: define linkonce_odr              void @_ZN13ImportMembers6Nested16staticInlineDeclEv()
313*67e74705SXin Li   // MO1-DAG: define available_externally dllimport void @"\01?staticInclass@Nested@ImportMembers@@SAXXZ"()
314*67e74705SXin Li   // MO1-DAG: define available_externally dllimport void @"\01?staticInlineDef@Nested@ImportMembers@@SAXXZ"()
315*67e74705SXin Li   // MO1-DAG: define available_externally dllimport void @"\01?staticInlineDecl@Nested@ImportMembers@@SAXXZ"()
316*67e74705SXin Li   // GO1-DAG: define linkonce_odr              void @_ZN13ImportMembers6Nested13staticInclassEv()
317*67e74705SXin Li   // GO1-DAG: define linkonce_odr              void @_ZN13ImportMembers6Nested15staticInlineDefEv()
318*67e74705SXin Li   // GO1-DAG: define linkonce_odr              void @_ZN13ImportMembers6Nested16staticInlineDeclEv()
319*67e74705SXin Li   __declspec(dllimport) static         void staticDef(); // dllimport ignored
320*67e74705SXin Li   __declspec(dllimport) static         void staticDecl();
staticInclassImportMembers::Nested321*67e74705SXin Li   __declspec(dllimport) static         void staticInclass() {}
322*67e74705SXin Li   __declspec(dllimport) static         void staticInlineDef();
323*67e74705SXin Li   __declspec(dllimport) static  inline void staticInlineDecl();
324*67e74705SXin Li 
325*67e74705SXin Li   // M32-DAG: declare dllimport x86_thiscallcc void @"\01?protectedNormalDecl@Nested@ImportMembers@@IAEXXZ"(%"struct.ImportMembers::Nested"*)
326*67e74705SXin Li   // M64-DAG: declare dllimport                void @"\01?protectedNormalDecl@Nested@ImportMembers@@IEAAXXZ"(%"struct.ImportMembers::Nested"*)
327*67e74705SXin Li   // G32-DAG: declare dllimport x86_thiscallcc void @_ZN13ImportMembers6Nested19protectedNormalDeclEv(%"struct.ImportMembers::Nested"*)
328*67e74705SXin Li   // G64-DAG: declare dllimport                void @_ZN13ImportMembers6Nested19protectedNormalDeclEv(%"struct.ImportMembers::Nested"*)
329*67e74705SXin Li   // MSC-DAG: declare dllimport                void @"\01?protectedStaticDecl@Nested@ImportMembers@@KAXXZ"()
330*67e74705SXin Li   // GNU-DAG: declare dllimport                void @_ZN13ImportMembers6Nested19protectedStaticDeclEv()
331*67e74705SXin Li protected:
332*67e74705SXin Li   __declspec(dllimport)                void protectedNormalDecl();
333*67e74705SXin Li   __declspec(dllimport) static         void protectedStaticDecl();
334*67e74705SXin Li 
335*67e74705SXin Li   // M32-DAG: declare dllimport x86_thiscallcc void @"\01?privateNormalDecl@Nested@ImportMembers@@AAEXXZ"(%"struct.ImportMembers::Nested"*)
336*67e74705SXin Li   // M64-DAG: declare dllimport                void @"\01?privateNormalDecl@Nested@ImportMembers@@AEAAXXZ"(%"struct.ImportMembers::Nested"*)
337*67e74705SXin Li   // G32-DAG: declare dllimport x86_thiscallcc void @_ZN13ImportMembers6Nested17privateNormalDeclEv(%"struct.ImportMembers::Nested"*)
338*67e74705SXin Li   // G64-DAG: declare dllimport                void @_ZN13ImportMembers6Nested17privateNormalDeclEv(%"struct.ImportMembers::Nested"*)
339*67e74705SXin Li   // MSC-DAG: declare dllimport                void @"\01?privateStaticDecl@Nested@ImportMembers@@CAXXZ"()
340*67e74705SXin Li   // GNU-DAG: declare dllimport                void @_ZN13ImportMembers6Nested17privateStaticDeclEv()
341*67e74705SXin Li private:
342*67e74705SXin Li   __declspec(dllimport)                void privateNormalDecl();
343*67e74705SXin Li   __declspec(dllimport) static         void privateStaticDecl();
344*67e74705SXin Li 
345*67e74705SXin Li   // M32-DAG: declare           x86_thiscallcc void @"\01?ignored@Nested@ImportMembers@@QAEXXZ"(%"struct.ImportMembers::Nested"*)
346*67e74705SXin Li   // M64-DAG: declare                          void @"\01?ignored@Nested@ImportMembers@@QEAAXXZ"(%"struct.ImportMembers::Nested"*)
347*67e74705SXin Li   // G32-DAG: declare           x86_thiscallcc void @_ZN13ImportMembers6Nested7ignoredEv(%"struct.ImportMembers::Nested"*)
348*67e74705SXin Li   // G64-DAG: declare                          void @_ZN13ImportMembers6Nested7ignoredEv(%"struct.ImportMembers::Nested"*)
349*67e74705SXin Li public:
350*67e74705SXin Li   void ignored();
351*67e74705SXin Li 
352*67e74705SXin Li   // MSC-DAG: @"\01?StaticField@Nested@ImportMembers@@2HA"               = external dllimport global i32
353*67e74705SXin Li   // MSC-DAG: @"\01?StaticConstField@Nested@ImportMembers@@2HB"          = external dllimport constant i32
354*67e74705SXin Li   // MSC-DAG: @"\01?StaticConstFieldEqualInit@Nested@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4
355*67e74705SXin Li   // MSC-DAG: @"\01?StaticConstFieldBraceInit@Nested@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4
356*67e74705SXin Li   // MSC-DAG: @"\01?ConstexprField@Nested@ImportMembers@@2HB"            = available_externally dllimport constant i32 1, align 4
357*67e74705SXin Li   // GNU-DAG: @_ZN13ImportMembers6Nested11StaticFieldE                   = external dllimport global i32
358*67e74705SXin Li   // GNU-DAG: @_ZN13ImportMembers6Nested16StaticConstFieldE              = external dllimport constant i32
359*67e74705SXin Li   // GNU-DAG: @_ZN13ImportMembers6Nested25StaticConstFieldEqualInitE     = external dllimport constant i32
360*67e74705SXin Li   // GNU-DAG: @_ZN13ImportMembers6Nested25StaticConstFieldBraceInitE     = external dllimport constant i32
361*67e74705SXin Li   // GNU-DAG: @_ZN13ImportMembers6Nested14ConstexprFieldE                = external dllimport constant i32
362*67e74705SXin Li   __declspec(dllimport) static         int  StaticField;
363*67e74705SXin Li   __declspec(dllimport) static  const  int  StaticConstField;
364*67e74705SXin Li   __declspec(dllimport) static  const  int  StaticConstFieldEqualInit = 1;
365*67e74705SXin Li   __declspec(dllimport) static  const  int  StaticConstFieldBraceInit{1};
366*67e74705SXin Li   __declspec(dllimport) constexpr static int ConstexprField = 1;
367*67e74705SXin Li 
368*67e74705SXin Li   template<int Line, typename T> friend void useMemFun();
369*67e74705SXin Li };
370*67e74705SXin Li 
normalDef()371*67e74705SXin Li        void ImportMembers::Nested::normalDef() {} // dllimport ignored
normalInlineDef()372*67e74705SXin Li inline void ImportMembers::Nested::normalInlineDef() {}
normalInlineDecl()373*67e74705SXin Li        void ImportMembers::Nested::normalInlineDecl() {}
virtualDef()374*67e74705SXin Li        void ImportMembers::Nested::virtualDef() {} // dllimport ignored
virtualInlineDef()375*67e74705SXin Li inline void ImportMembers::Nested::virtualInlineDef() {}
virtualInlineDecl()376*67e74705SXin Li        void ImportMembers::Nested::virtualInlineDecl() {}
staticDef()377*67e74705SXin Li        void ImportMembers::Nested::staticDef() {} // dllimport ignored
staticInlineDef()378*67e74705SXin Li inline void ImportMembers::Nested::staticInlineDef() {}
staticInlineDecl()379*67e74705SXin Li        void ImportMembers::Nested::staticInlineDecl() {}
380*67e74705SXin Li 
381*67e74705SXin Li USEMF(ImportMembers::Nested, normalDef)
382*67e74705SXin Li USEMF(ImportMembers::Nested, normalDecl)
383*67e74705SXin Li USEMF(ImportMembers::Nested, normalInclass)
384*67e74705SXin Li USEMF(ImportMembers::Nested, normalInlineDef)
385*67e74705SXin Li USEMF(ImportMembers::Nested, normalInlineDecl)
386*67e74705SXin Li USEMF(ImportMembers::Nested, virtualDef)
387*67e74705SXin Li USEMF(ImportMembers::Nested, virtualDecl)
388*67e74705SXin Li USEMF(ImportMembers::Nested, virtualInclass)
389*67e74705SXin Li USEMF(ImportMembers::Nested, virtualInlineDef)
390*67e74705SXin Li USEMF(ImportMembers::Nested, virtualInlineDecl)
391*67e74705SXin Li USEMF(ImportMembers::Nested, staticDef)
392*67e74705SXin Li USEMF(ImportMembers::Nested, staticDecl)
393*67e74705SXin Li USEMF(ImportMembers::Nested, staticInclass)
394*67e74705SXin Li USEMF(ImportMembers::Nested, staticInlineDef)
395*67e74705SXin Li USEMF(ImportMembers::Nested, staticInlineDecl)
396*67e74705SXin Li USEMF(ImportMembers::Nested, protectedNormalDecl)
397*67e74705SXin Li USEMF(ImportMembers::Nested, protectedStaticDecl)
398*67e74705SXin Li USEMF(ImportMembers::Nested, privateNormalDecl)
399*67e74705SXin Li USEMF(ImportMembers::Nested, privateStaticDecl)
400*67e74705SXin Li USEMF(ImportMembers::Nested, ignored)
401*67e74705SXin Li 
402*67e74705SXin Li USEMV(ImportMembers::Nested, StaticField)
403*67e74705SXin Li USEMV(ImportMembers::Nested, StaticConstField)
404*67e74705SXin Li USEMV(ImportMembers::Nested, StaticConstFieldEqualInit)
405*67e74705SXin Li USEMV(ImportMembers::Nested, StaticConstFieldBraceInit)
406*67e74705SXin Li USEMV(ImportMembers::Nested, ConstexprField)
407*67e74705SXin Li 
408*67e74705SXin Li 
409*67e74705SXin Li // Import special member functions.
410*67e74705SXin Li struct ImportSpecials {
411*67e74705SXin Li   // M32-DAG: declare dllimport x86_thiscallcc %struct.ImportSpecials* @"\01??0ImportSpecials@@QAE@XZ"(%struct.ImportSpecials* returned)
412*67e74705SXin Li   // M64-DAG: declare dllimport                %struct.ImportSpecials* @"\01??0ImportSpecials@@QEAA@XZ"(%struct.ImportSpecials* returned)
413*67e74705SXin Li   // G32-DAG: declare dllimport x86_thiscallcc void                    @_ZN14ImportSpecialsC1Ev(%struct.ImportSpecials*)
414*67e74705SXin Li   // G64-DAG: declare dllimport                void                    @_ZN14ImportSpecialsC1Ev(%struct.ImportSpecials*)
415*67e74705SXin Li   __declspec(dllimport) ImportSpecials();
416*67e74705SXin Li 
417*67e74705SXin Li   // M32-DAG: declare dllimport x86_thiscallcc void @"\01??1ImportSpecials@@QAE@XZ"(%struct.ImportSpecials*)
418*67e74705SXin Li   // M64-DAG: declare dllimport                void @"\01??1ImportSpecials@@QEAA@XZ"(%struct.ImportSpecials*)
419*67e74705SXin Li   // G32-DAG: declare dllimport x86_thiscallcc void                    @_ZN14ImportSpecialsD1Ev(%struct.ImportSpecials*)
420*67e74705SXin Li   // G64-DAG: declare dllimport                void                    @_ZN14ImportSpecialsD1Ev(%struct.ImportSpecials*)
421*67e74705SXin Li   __declspec(dllimport) ~ImportSpecials();
422*67e74705SXin Li 
423*67e74705SXin Li   // M32-DAG: declare dllimport x86_thiscallcc %struct.ImportSpecials* @"\01??0ImportSpecials@@QAE@ABU0@@Z"(%struct.ImportSpecials* returned, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
424*67e74705SXin Li   // M64-DAG: declare dllimport                %struct.ImportSpecials* @"\01??0ImportSpecials@@QEAA@AEBU0@@Z"(%struct.ImportSpecials* returned, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
425*67e74705SXin Li   // G32-DAG: declare dllimport x86_thiscallcc void                    @_ZN14ImportSpecialsC1ERKS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
426*67e74705SXin Li   // G64-DAG: declare dllimport                void                    @_ZN14ImportSpecialsC1ERKS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
427*67e74705SXin Li   __declspec(dllimport) ImportSpecials(const ImportSpecials&);
428*67e74705SXin Li 
429*67e74705SXin Li   // M32-DAG: declare dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @"\01??4ImportSpecials@@QAEAAU0@ABU0@@Z"(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
430*67e74705SXin Li   // M64-DAG: declare dllimport                dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @"\01??4ImportSpecials@@QEAAAEAU0@AEBU0@@Z"(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
431*67e74705SXin Li   // G32-DAG: declare dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @_ZN14ImportSpecialsaSERKS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
432*67e74705SXin Li   // G64-DAG: declare dllimport                dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @_ZN14ImportSpecialsaSERKS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
433*67e74705SXin Li   __declspec(dllimport) ImportSpecials& operator=(const ImportSpecials&);
434*67e74705SXin Li 
435*67e74705SXin Li   // M32-DAG: declare dllimport x86_thiscallcc %struct.ImportSpecials* @"\01??0ImportSpecials@@QAE@$$QAU0@@Z"(%struct.ImportSpecials* returned, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
436*67e74705SXin Li   // M64-DAG: declare dllimport                %struct.ImportSpecials* @"\01??0ImportSpecials@@QEAA@$$QEAU0@@Z"(%struct.ImportSpecials* returned, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
437*67e74705SXin Li   // G32-DAG: declare dllimport x86_thiscallcc void                    @_ZN14ImportSpecialsC1EOS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
438*67e74705SXin Li   // G64-DAG: declare dllimport                void                    @_ZN14ImportSpecialsC1EOS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
439*67e74705SXin Li   __declspec(dllimport) ImportSpecials(ImportSpecials&&);
440*67e74705SXin Li 
441*67e74705SXin Li   // M32-DAG: declare dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @"\01??4ImportSpecials@@QAEAAU0@$$QAU0@@Z"(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
442*67e74705SXin Li   // M64-DAG: declare dllimport                dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @"\01??4ImportSpecials@@QEAAAEAU0@$$QEAU0@@Z"(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
443*67e74705SXin Li   // G32-DAG: declare dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @_ZN14ImportSpecialsaSEOS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
444*67e74705SXin Li   // G64-DAG: declare dllimport                dereferenceable({{[0-9]+}}) %struct.ImportSpecials* @_ZN14ImportSpecialsaSEOS_(%struct.ImportSpecials*, %struct.ImportSpecials* dereferenceable({{[0-9]+}}))
445*67e74705SXin Li   __declspec(dllimport) ImportSpecials& operator=(ImportSpecials&&);
446*67e74705SXin Li };
447*67e74705SXin Li USESPECIALS(ImportSpecials)
448*67e74705SXin Li 
449*67e74705SXin Li 
450*67e74705SXin Li // Export inline special member functions.
451*67e74705SXin Li struct ImportInlineSpecials {
452*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QAE@XZ"(%struct.ImportInlineSpecials* returned)
453*67e74705SXin Li   // M64-DAG: declare dllimport                  %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QEAA@XZ"(%struct.ImportInlineSpecials* returned)
454*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsC1Ev(%struct.ImportInlineSpecials* %this)
455*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN20ImportInlineSpecialsC1Ev(%struct.ImportInlineSpecials* %this)
456*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QAE@XZ"(
457*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsC1Ev(
ImportInlineSpecialsImportInlineSpecials458*67e74705SXin Li   __declspec(dllimport) ImportInlineSpecials() {}
459*67e74705SXin Li 
460*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01??1ImportInlineSpecials@@QAE@XZ"(%struct.ImportInlineSpecials*)
461*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01??1ImportInlineSpecials@@QEAA@XZ"(%struct.ImportInlineSpecials*)
462*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsD1Ev(%struct.ImportInlineSpecials* %this)
463*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN20ImportInlineSpecialsD1Ev(%struct.ImportInlineSpecials* %this)
464*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01??1ImportInlineSpecials@@QAE@XZ"(
465*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsD1Ev(
~ImportInlineSpecialsImportInlineSpecials466*67e74705SXin Li   __declspec(dllimport) ~ImportInlineSpecials() {}
467*67e74705SXin Li 
468*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QAE@ABU0@@Z"(%struct.ImportInlineSpecials* returned, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
469*67e74705SXin Li   // M64-DAG: declare dllimport                  %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QEAA@AEBU0@@Z"(%struct.ImportInlineSpecials* returned, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
470*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsC1ERKS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
471*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN20ImportInlineSpecialsC1ERKS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
472*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QAE@ABU0@@Z"(
473*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsC1ERKS_(
474*67e74705SXin Li   __declspec(dllimport) inline ImportInlineSpecials(const ImportInlineSpecials&);
475*67e74705SXin Li 
476*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @"\01??4ImportInlineSpecials@@QAEAAU0@ABU0@@Z"(%struct.ImportInlineSpecials*, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
477*67e74705SXin Li   // M64-DAG: declare dllimport                  dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @"\01??4ImportInlineSpecials@@QEAAAEAU0@AEBU0@@Z"(%struct.ImportInlineSpecials*, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
478*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @_ZN20ImportInlineSpecialsaSERKS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
479*67e74705SXin Li   // G64-DAG: define linkonce_odr                dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @_ZN20ImportInlineSpecialsaSERKS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
480*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @"\01??4ImportInlineSpecials@@QAEAAU0@ABU0@@Z"(
481*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @_ZN20ImportInlineSpecialsaSERKS_(
482*67e74705SXin Li   __declspec(dllimport) ImportInlineSpecials& operator=(const ImportInlineSpecials&);
483*67e74705SXin Li 
484*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QAE@$$QAU0@@Z"(%struct.ImportInlineSpecials* returned, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
485*67e74705SXin Li   // M64-DAG: declare dllimport                  %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QEAA@$$QEAU0@@Z"(%struct.ImportInlineSpecials* returned, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
486*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsC1EOS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
487*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN20ImportInlineSpecialsC1EOS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
488*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc %struct.ImportInlineSpecials* @"\01??0ImportInlineSpecials@@QAE@$$QAU0@@Z"(
489*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN20ImportInlineSpecialsC1EOS_(
ImportInlineSpecialsImportInlineSpecials490*67e74705SXin Li   __declspec(dllimport) ImportInlineSpecials(ImportInlineSpecials&&) {}
491*67e74705SXin Li 
492*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @"\01??4ImportInlineSpecials@@QAEAAU0@$$QAU0@@Z"(%struct.ImportInlineSpecials*, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
493*67e74705SXin Li   // M64-DAG: declare dllimport                  dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @"\01??4ImportInlineSpecials@@QEAAAEAU0@$$QEAU0@@Z"(%struct.ImportInlineSpecials*, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
494*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @_ZN20ImportInlineSpecialsaSEOS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
495*67e74705SXin Li   // G64-DAG: define linkonce_odr                dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @_ZN20ImportInlineSpecialsaSEOS_(%struct.ImportInlineSpecials* %this, %struct.ImportInlineSpecials* dereferenceable({{[0-9]+}}))
496*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @"\01??4ImportInlineSpecials@@QAEAAU0@$$QAU0@@Z"(
497*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportInlineSpecials* @_ZN20ImportInlineSpecialsaSEOS_(
operator =ImportInlineSpecials498*67e74705SXin Li   __declspec(dllimport) ImportInlineSpecials& operator=(ImportInlineSpecials&&) { return *this; }
499*67e74705SXin Li };
ImportInlineSpecials(const ImportInlineSpecials &)500*67e74705SXin Li ImportInlineSpecials::ImportInlineSpecials(const ImportInlineSpecials&) {}
operator =(const ImportInlineSpecials &)501*67e74705SXin Li inline ImportInlineSpecials& ImportInlineSpecials::operator=(const ImportInlineSpecials&) { return *this; }
502*67e74705SXin Li USESPECIALS(ImportInlineSpecials)
503*67e74705SXin Li 
504*67e74705SXin Li 
505*67e74705SXin Li // Import defaulted member functions.
506*67e74705SXin Li struct ImportDefaulted {
507*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QAE@XZ"(%struct.ImportDefaulted* returned)
508*67e74705SXin Li   // M64-DAG: declare dllimport                  %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QEAA@XZ"(%struct.ImportDefaulted* returned)
509*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void                     @_ZN15ImportDefaultedC1Ev(%struct.ImportDefaulted* %this)
510*67e74705SXin Li   // G64-DAG: define linkonce_odr                void                     @_ZN15ImportDefaultedC1Ev(%struct.ImportDefaulted* %this)
511*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QAE@XZ"(%struct.ImportDefaulted* returned %this)
512*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN15ImportDefaultedC1Ev(%struct.ImportDefaulted* %this)
513*67e74705SXin Li   __declspec(dllimport) ImportDefaulted() = default;
514*67e74705SXin Li 
515*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc void @"\01??1ImportDefaulted@@QAE@XZ"(%struct.ImportDefaulted*)
516*67e74705SXin Li   // M64-DAG: declare dllimport                  void @"\01??1ImportDefaulted@@QEAA@XZ"(%struct.ImportDefaulted*)
517*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN15ImportDefaultedD1Ev(%struct.ImportDefaulted* %this)
518*67e74705SXin Li   // G64-DAG: define linkonce_odr                void @_ZN15ImportDefaultedD1Ev(%struct.ImportDefaulted* %this)
519*67e74705SXin Li   // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01??1ImportDefaulted@@QAE@XZ"(%struct.ImportDefaulted* %this)
520*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN15ImportDefaultedD1Ev(%struct.ImportDefaulted* %this)
521*67e74705SXin Li   __declspec(dllimport) ~ImportDefaulted() = default;
522*67e74705SXin Li 
523*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QAE@ABU0@@Z"(%struct.ImportDefaulted* returned, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
524*67e74705SXin Li   // M64-DAG: declare dllimport                  %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QEAA@AEBU0@@Z"(%struct.ImportDefaulted* returned, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
525*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void                     @_ZN15ImportDefaultedC1ERKS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
526*67e74705SXin Li   // G64-DAG: define linkonce_odr                void                     @_ZN15ImportDefaultedC1ERKS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
527*67e74705SXin Li   // 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*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN15ImportDefaultedC1ERKS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
529*67e74705SXin Li   __declspec(dllimport) ImportDefaulted(const ImportDefaulted&) = default;
530*67e74705SXin Li 
531*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @"\01??4ImportDefaulted@@QAEAAU0@ABU0@@Z"(%struct.ImportDefaulted*, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
532*67e74705SXin Li   // M64-DAG: declare dllimport                  dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @"\01??4ImportDefaulted@@QEAAAEAU0@AEBU0@@Z"(%struct.ImportDefaulted*, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
533*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @_ZN15ImportDefaultedaSERKS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
534*67e74705SXin Li   // G64-DAG: define linkonce_odr                dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @_ZN15ImportDefaultedaSERKS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
535*67e74705SXin Li   // 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*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @_ZN15ImportDefaultedaSERKS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
537*67e74705SXin Li   __declspec(dllimport) ImportDefaulted& operator=(const ImportDefaulted&) = default;
538*67e74705SXin Li 
539*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QAE@$$QAU0@@Z"(%struct.ImportDefaulted* returned, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
540*67e74705SXin Li   // M64-DAG: declare dllimport                  %struct.ImportDefaulted* @"\01??0ImportDefaulted@@QEAA@$$QEAU0@@Z"(%struct.ImportDefaulted* returned, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
541*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc void                     @_ZN15ImportDefaultedC1EOS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
542*67e74705SXin Li   // G64-DAG: define linkonce_odr                void                     @_ZN15ImportDefaultedC1EOS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
543*67e74705SXin Li   // 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*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc void @_ZN15ImportDefaultedC1EOS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
545*67e74705SXin Li   __declspec(dllimport) ImportDefaulted(ImportDefaulted&&) = default;
546*67e74705SXin Li 
547*67e74705SXin Li   // M32-DAG: declare dllimport   x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @"\01??4ImportDefaulted@@QAEAAU0@$$QAU0@@Z"(%struct.ImportDefaulted*, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
548*67e74705SXin Li   // M64-DAG: declare dllimport                  dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @"\01??4ImportDefaulted@@QEAAAEAU0@$$QEAU0@@Z"(%struct.ImportDefaulted*, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
549*67e74705SXin Li   // G32-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @_ZN15ImportDefaultedaSEOS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
550*67e74705SXin Li   // G64-DAG: define linkonce_odr                dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @_ZN15ImportDefaultedaSEOS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
551*67e74705SXin Li   // 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*67e74705SXin Li   // GO1-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaulted* @_ZN15ImportDefaultedaSEOS_(%struct.ImportDefaulted* %this, %struct.ImportDefaulted* dereferenceable({{[0-9]+}}))
553*67e74705SXin Li   __declspec(dllimport) ImportDefaulted& operator=(ImportDefaulted&&) = default;
554*67e74705SXin Li 
555*67e74705SXin Li   ForceNonTrivial v; // ensure special members are non-trivial
556*67e74705SXin Li };
557*67e74705SXin Li USESPECIALS(ImportDefaulted)
558*67e74705SXin Li 
559*67e74705SXin Li 
560*67e74705SXin Li // Import defaulted member function definitions.
561*67e74705SXin Li struct ImportDefaultedDefs {
562*67e74705SXin Li   __declspec(dllimport) inline ImportDefaultedDefs();
563*67e74705SXin Li   __declspec(dllimport) inline ~ImportDefaultedDefs();
564*67e74705SXin Li 
565*67e74705SXin Li   __declspec(dllimport) ImportDefaultedDefs(const ImportDefaultedDefs&);
566*67e74705SXin Li   __declspec(dllimport) ImportDefaultedDefs& operator=(const ImportDefaultedDefs&);
567*67e74705SXin Li 
568*67e74705SXin Li   __declspec(dllimport) ImportDefaultedDefs(ImportDefaultedDefs&&);
569*67e74705SXin Li   __declspec(dllimport) ImportDefaultedDefs& operator=(ImportDefaultedDefs&&);
570*67e74705SXin Li };
571*67e74705SXin Li 
572*67e74705SXin Li #ifdef MSABI
573*67e74705SXin Li // For MinGW, the function will not be dllimport, and we cannot add the attribute now.
574*67e74705SXin Li // M32-DAG: declare dllimport x86_thiscallcc %struct.ImportDefaultedDefs* @"\01??0ImportDefaultedDefs@@QAE@XZ"(%struct.ImportDefaultedDefs* returned)
575*67e74705SXin Li // M64-DAG: declare dllimport                %struct.ImportDefaultedDefs* @"\01??0ImportDefaultedDefs@@QEAA@XZ"(%struct.ImportDefaultedDefs* returned)
576*67e74705SXin Li __declspec(dllimport) ImportDefaultedDefs::ImportDefaultedDefs() = default;
577*67e74705SXin Li #endif
578*67e74705SXin Li 
579*67e74705SXin Li #ifdef MSABI
580*67e74705SXin Li // For MinGW, the function will not be dllimport, and we cannot add the attribute now.
581*67e74705SXin Li // M32-DAG: declare dllimport x86_thiscallcc void @"\01??1ImportDefaultedDefs@@QAE@XZ"(%struct.ImportDefaultedDefs*)
582*67e74705SXin Li // M64-DAG: declare dllimport                void @"\01??1ImportDefaultedDefs@@QEAA@XZ"(%struct.ImportDefaultedDefs*)
583*67e74705SXin Li __declspec(dllimport) ImportDefaultedDefs::~ImportDefaultedDefs() = default;
584*67e74705SXin Li #endif
585*67e74705SXin Li 
586*67e74705SXin Li // M32-DAG: declare dllimport   x86_thiscallcc %struct.ImportDefaultedDefs* @"\01??0ImportDefaultedDefs@@QAE@ABU0@@Z"(%struct.ImportDefaultedDefs* returned, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
587*67e74705SXin Li // M64-DAG: declare dllimport                  %struct.ImportDefaultedDefs* @"\01??0ImportDefaultedDefs@@QEAA@AEBU0@@Z"(%struct.ImportDefaultedDefs* returned, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
588*67e74705SXin Li // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN19ImportDefaultedDefsC1ERKS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
589*67e74705SXin Li // G64-DAG: define linkonce_odr                void @_ZN19ImportDefaultedDefsC1ERKS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
590*67e74705SXin Li inline ImportDefaultedDefs::ImportDefaultedDefs(const ImportDefaultedDefs&) = default;
591*67e74705SXin Li 
592*67e74705SXin Li // M32-DAG: declare dllimport   x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @"\01??4ImportDefaultedDefs@@QAEAAU0@ABU0@@Z"(%struct.ImportDefaultedDefs*, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
593*67e74705SXin Li // M64-DAG: declare dllimport                  dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @"\01??4ImportDefaultedDefs@@QEAAAEAU0@AEBU0@@Z"(%struct.ImportDefaultedDefs*, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
594*67e74705SXin Li // G32-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @_ZN19ImportDefaultedDefsaSERKS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
595*67e74705SXin Li // G64-DAG: define linkonce_odr                dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @_ZN19ImportDefaultedDefsaSERKS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
596*67e74705SXin Li inline ImportDefaultedDefs& ImportDefaultedDefs::operator=(const ImportDefaultedDefs&) = default;
597*67e74705SXin Li 
598*67e74705SXin Li // M32-DAG: define dllexport x86_thiscallcc %struct.ImportDefaultedDefs* @"\01??0ImportDefaultedDefs@@QAE@$$QAU0@@Z"(%struct.ImportDefaultedDefs* returned %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
599*67e74705SXin Li // M64-DAG: define dllexport                %struct.ImportDefaultedDefs* @"\01??0ImportDefaultedDefs@@QEAA@$$QEAU0@@Z"(%struct.ImportDefaultedDefs* returned %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
600*67e74705SXin Li // G32-DAG: define x86_thiscallcc void @_ZN19ImportDefaultedDefsC1EOS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
601*67e74705SXin Li // G64-DAG: define                void @_ZN19ImportDefaultedDefsC1EOS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
602*67e74705SXin Li // G32-DAG: define x86_thiscallcc void @_ZN19ImportDefaultedDefsC2EOS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
603*67e74705SXin Li // G64-DAG: define                void @_ZN19ImportDefaultedDefsC2EOS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
604*67e74705SXin Li ImportDefaultedDefs::ImportDefaultedDefs(ImportDefaultedDefs&&) = default; // dllimport ignored
605*67e74705SXin Li 
606*67e74705SXin Li // M32-DAG: define dllexport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @"\01??4ImportDefaultedDefs@@QAEAAU0@$$QAU0@@Z"(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
607*67e74705SXin Li // M64-DAG: define dllexport                dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @"\01??4ImportDefaultedDefs@@QEAAAEAU0@$$QEAU0@@Z"(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
608*67e74705SXin Li // G32-DAG: define x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @_ZN19ImportDefaultedDefsaSEOS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
609*67e74705SXin Li // G64-DAG: define                dereferenceable({{[0-9]+}}) %struct.ImportDefaultedDefs* @_ZN19ImportDefaultedDefsaSEOS_(%struct.ImportDefaultedDefs* %this, %struct.ImportDefaultedDefs* dereferenceable({{[0-9]+}}))
610*67e74705SXin Li ImportDefaultedDefs& ImportDefaultedDefs::operator=(ImportDefaultedDefs&&) = default; // dllimport ignored
611*67e74705SXin Li 
612*67e74705SXin Li USESPECIALS(ImportDefaultedDefs)
613*67e74705SXin Li 
614*67e74705SXin Li 
615*67e74705SXin Li // Import allocation functions.
616*67e74705SXin Li struct ImportAlloc {
617*67e74705SXin Li   __declspec(dllimport) void* operator new(__SIZE_TYPE__);
618*67e74705SXin Li   __declspec(dllimport) void* operator new[](__SIZE_TYPE__);
619*67e74705SXin Li   __declspec(dllimport) void operator delete(void*);
620*67e74705SXin Li   __declspec(dllimport) void operator delete[](void*);
621*67e74705SXin Li };
622*67e74705SXin Li 
623*67e74705SXin Li // M32-DAG: declare dllimport i8* @"\01??2ImportAlloc@@SAPAXI@Z"(i32)
624*67e74705SXin Li // M64-DAG: declare dllimport i8* @"\01??2ImportAlloc@@SAPEAX_K@Z"(i64)
625*67e74705SXin Li // G32-DAG: declare dllimport i8* @_ZN11ImportAllocnwEj(i32)
626*67e74705SXin Li // G64-DAG: declare dllimport i8* @_ZN11ImportAllocnwEy(i64)
UNIQ(use)627*67e74705SXin Li void UNIQ(use)() { new ImportAlloc(); }
628*67e74705SXin Li 
629*67e74705SXin Li // M32-DAG: declare dllimport i8* @"\01??_UImportAlloc@@SAPAXI@Z"(i32)
630*67e74705SXin Li // M64-DAG: declare dllimport i8* @"\01??_UImportAlloc@@SAPEAX_K@Z"(i64)
631*67e74705SXin Li // G32-DAG: declare dllimport i8* @_ZN11ImportAllocnaEj(i32)
632*67e74705SXin Li // G64-DAG: declare dllimport i8* @_ZN11ImportAllocnaEy(i64)
UNIQ(use)633*67e74705SXin Li void UNIQ(use)() { new ImportAlloc[1]; }
634*67e74705SXin Li 
635*67e74705SXin Li // M32-DAG: declare dllimport void @"\01??3ImportAlloc@@SAXPAX@Z"(i8*)
636*67e74705SXin Li // M64-DAG: declare dllimport void @"\01??3ImportAlloc@@SAXPEAX@Z"(i8*)
637*67e74705SXin Li // G32-DAG: declare dllimport void @_ZN11ImportAllocdlEPv(i8*)
638*67e74705SXin Li // G64-DAG: declare dllimport void @_ZN11ImportAllocdlEPv(i8*)
UNIQ(use)639*67e74705SXin Li void UNIQ(use)(ImportAlloc* ptr) { delete ptr; }
640*67e74705SXin Li 
641*67e74705SXin Li // M32-DAG: declare dllimport void @"\01??_VImportAlloc@@SAXPAX@Z"(i8*)
642*67e74705SXin Li // M64-DAG: declare dllimport void @"\01??_VImportAlloc@@SAXPEAX@Z"(i8*)
643*67e74705SXin Li // G32-DAG: declare dllimport void @_ZN11ImportAllocdaEPv(i8*)
644*67e74705SXin Li // G64-DAG: declare dllimport void @_ZN11ImportAllocdaEPv(i8*)
UNIQ(use)645*67e74705SXin Li void UNIQ(use)(ImportAlloc* ptr) { delete[] ptr; }
646*67e74705SXin Li 
647*67e74705SXin Li 
648*67e74705SXin Li //===----------------------------------------------------------------------===//
649*67e74705SXin Li // Class member templates
650*67e74705SXin Li //===----------------------------------------------------------------------===//
651*67e74705SXin Li 
652*67e74705SXin Li struct MemFunTmpl {
normalDefMemFunTmpl653*67e74705SXin Li   template<typename T>                              void normalDef() {}
importedNormalMemFunTmpl654*67e74705SXin Li   template<typename T> __declspec(dllimport)        void importedNormal() {}
staticDefMemFunTmpl655*67e74705SXin Li   template<typename T>                       static void staticDef() {}
importedStaticMemFunTmpl656*67e74705SXin Li   template<typename T> __declspec(dllimport) static void importedStatic() {}
657*67e74705SXin Li };
658*67e74705SXin Li 
659*67e74705SXin Li // Import implicit instantiation of an imported member function template.
660*67e74705SXin Li // M32-DAG: declare dllimport   x86_thiscallcc void @"\01??$importedNormal@UImplicitInst_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
661*67e74705SXin Li // M64-DAG: declare dllimport                  void @"\01??$importedNormal@UImplicitInst_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
662*67e74705SXin Li // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN10MemFunTmpl14importedNormalI21ImplicitInst_ImportedEEvv(%struct.MemFunTmpl* %this)
663*67e74705SXin Li // G64-DAG: define linkonce_odr                void @_ZN10MemFunTmpl14importedNormalI21ImplicitInst_ImportedEEvv(%struct.MemFunTmpl* %this)
664*67e74705SXin Li USEMF(MemFunTmpl, importedNormal<ImplicitInst_Imported>)
665*67e74705SXin Li 
666*67e74705SXin Li // MSC-DAG: declare dllimport                void @"\01??$importedStatic@UImplicitInst_Imported@@@MemFunTmpl@@SAXXZ"()
667*67e74705SXin Li // GNU-DAG: define linkonce_odr              void @_ZN10MemFunTmpl14importedStaticI21ImplicitInst_ImportedEEvv()
668*67e74705SXin Li USE(MemFunTmpl::importedStatic<ImplicitInst_Imported>)
669*67e74705SXin Li 
670*67e74705SXin Li 
671*67e74705SXin Li // Import explicit instantiation declaration of an imported member function
672*67e74705SXin Li // template.
673*67e74705SXin Li // M32-DAG: declare dllimport x86_thiscallcc void @"\01??$importedNormal@UExplicitDecl_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
674*67e74705SXin Li // M64-DAG: declare dllimport                void @"\01??$importedNormal@UExplicitDecl_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
675*67e74705SXin Li // G32-DAG: declare x86_thiscallcc           void @_ZN10MemFunTmpl14importedNormalI21ExplicitDecl_ImportedEEvv(%struct.MemFunTmpl*)
676*67e74705SXin Li // G64-DAG: declare                          void @_ZN10MemFunTmpl14importedNormalI21ExplicitDecl_ImportedEEvv(%struct.MemFunTmpl*)
677*67e74705SXin Li extern template void MemFunTmpl::importedNormal<ExplicitDecl_Imported>();
678*67e74705SXin Li USEMF(MemFunTmpl, importedNormal<ExplicitDecl_Imported>)
679*67e74705SXin Li 
680*67e74705SXin Li // MSC-DAG: declare dllimport                void @"\01??$importedStatic@UExplicitDecl_Imported@@@MemFunTmpl@@SAXXZ"()
681*67e74705SXin Li // GNU-DAG: declare                          void @_ZN10MemFunTmpl14importedStaticI21ExplicitDecl_ImportedEEvv()
682*67e74705SXin Li extern template void MemFunTmpl::importedStatic<ExplicitDecl_Imported>();
683*67e74705SXin Li USE(MemFunTmpl::importedStatic<ExplicitDecl_Imported>)
684*67e74705SXin Li 
685*67e74705SXin Li 
686*67e74705SXin Li // Import explicit instantiation definition of an imported member function
687*67e74705SXin Li // template.
688*67e74705SXin Li // M32-DAG: declare dllimport x86_thiscallcc void @"\01??$importedNormal@UExplicitInst_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
689*67e74705SXin Li // M64-DAG: declare dllimport                void @"\01??$importedNormal@UExplicitInst_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
690*67e74705SXin Li // G32-DAG: define weak_odr x86_thiscallcc   void @_ZN10MemFunTmpl14importedNormalI21ExplicitInst_ImportedEEvv(%struct.MemFunTmpl* %this)
691*67e74705SXin Li // G64-DAG: define weak_odr                  void @_ZN10MemFunTmpl14importedNormalI21ExplicitInst_ImportedEEvv(%struct.MemFunTmpl* %this)
692*67e74705SXin Li template void MemFunTmpl::importedNormal<ExplicitInst_Imported>();
693*67e74705SXin Li USEMF(MemFunTmpl, importedNormal<ExplicitInst_Imported>)
694*67e74705SXin Li 
695*67e74705SXin Li // MSC-DAG: declare dllimport                void @"\01??$importedStatic@UExplicitInst_Imported@@@MemFunTmpl@@SAXXZ"()
696*67e74705SXin Li // GNU-DAG: define weak_odr                  void @_ZN10MemFunTmpl14importedStaticI21ExplicitInst_ImportedEEvv()
697*67e74705SXin Li template void MemFunTmpl::importedStatic<ExplicitInst_Imported>();
698*67e74705SXin Li USE(MemFunTmpl::importedStatic<ExplicitInst_Imported>)
699*67e74705SXin Li 
700*67e74705SXin Li 
701*67e74705SXin Li // Import specialization of an imported member function template.
702*67e74705SXin Li // M32-DAG: declare dllimport x86_thiscallcc void @"\01??$importedNormal@UExplicitSpec_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
703*67e74705SXin Li // M64-DAG: declare dllimport                void @"\01??$importedNormal@UExplicitSpec_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
704*67e74705SXin Li // G32-DAG: declare dllimport x86_thiscallcc void @_ZN10MemFunTmpl14importedNormalI21ExplicitSpec_ImportedEEvv(%struct.MemFunTmpl*)
705*67e74705SXin Li // G64-DAG: declare dllimport                void @_ZN10MemFunTmpl14importedNormalI21ExplicitSpec_ImportedEEvv(%struct.MemFunTmpl*)
706*67e74705SXin Li template<> __declspec(dllimport) void MemFunTmpl::importedNormal<ExplicitSpec_Imported>();
USEMF(MemFunTmpl,importedNormal<ExplicitSpec_Imported>)707*67e74705SXin Li USEMF(MemFunTmpl, importedNormal<ExplicitSpec_Imported>)
708*67e74705SXin Li 
709*67e74705SXin Li // M32-DAG-FIXME: declare dllimport x86_thiscallcc void @"\01??$importedNormal@UExplicitSpec_Def_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
710*67e74705SXin Li // M64-DAG-FIXME: declare dllimport                void @"\01??$importedNormal@UExplicitSpec_Def_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
711*67e74705SXin Li #ifdef MSABI
712*67e74705SXin Li //template<> __declspec(dllimport) void MemFunTmpl::importedNormal<ExplicitSpec_Def_Imported>() {}
713*67e74705SXin Li //USEMF(MemFunTmpl, importedNormal<ExplicitSpec_Def_Imported>)
714*67e74705SXin Li #endif
715*67e74705SXin Li 
716*67e74705SXin Li // M32-DAG: declare dllimport   x86_thiscallcc void @"\01??$importedNormal@UExplicitSpec_InlineDef_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
717*67e74705SXin Li // M64-DAG: declare dllimport                  void @"\01??$importedNormal@UExplicitSpec_InlineDef_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
718*67e74705SXin Li // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN10MemFunTmpl14importedNormalI31ExplicitSpec_InlineDef_ImportedEEvv(%struct.MemFunTmpl* %this)
719*67e74705SXin Li // G64-DAG: define linkonce_odr                void @_ZN10MemFunTmpl14importedNormalI31ExplicitSpec_InlineDef_ImportedEEvv(%struct.MemFunTmpl* %this)
720*67e74705SXin Li template<> __declspec(dllimport) inline void MemFunTmpl::importedNormal<ExplicitSpec_InlineDef_Imported>() {}
721*67e74705SXin Li USEMF(MemFunTmpl, importedNormal<ExplicitSpec_InlineDef_Imported>)
722*67e74705SXin Li 
723*67e74705SXin Li 
724*67e74705SXin Li // MSC-DAG: declare dllimport                void @"\01??$importedStatic@UExplicitSpec_Imported@@@MemFunTmpl@@SAXXZ"()
725*67e74705SXin Li // GNU-DAG: declare dllimport                void @_ZN10MemFunTmpl14importedStaticI21ExplicitSpec_ImportedEEvv()
726*67e74705SXin Li template<> __declspec(dllimport) void MemFunTmpl::importedStatic<ExplicitSpec_Imported>();
USE(MemFunTmpl::importedStatic<ExplicitSpec_Imported>)727*67e74705SXin Li USE(MemFunTmpl::importedStatic<ExplicitSpec_Imported>)
728*67e74705SXin Li 
729*67e74705SXin Li // MSC-DAG-FIXME: declare dllimport                void @"\01??$importedStatic@UExplicitSpec_Def_Imported@@@MemFunTmpl@@SAXXZ"()
730*67e74705SXin Li #ifdef MSABI
731*67e74705SXin Li //template<> __declspec(dllimport) void MemFunTmpl::importedStatic<ExplicitSpec_Def_Imported>() {}
732*67e74705SXin Li //USE(MemFunTmpl::importedStatic<ExplicitSpec_Def_Imported>)
733*67e74705SXin Li #endif
734*67e74705SXin Li 
735*67e74705SXin Li // MSC-DAG: declare dllimport                void @"\01??$importedStatic@UExplicitSpec_InlineDef_Imported@@@MemFunTmpl@@SAXXZ"()
736*67e74705SXin Li // GNU-DAG: define linkonce_odr              void @_ZN10MemFunTmpl14importedStaticI31ExplicitSpec_InlineDef_ImportedEEvv()
737*67e74705SXin Li template<> __declspec(dllimport) inline void MemFunTmpl::importedStatic<ExplicitSpec_InlineDef_Imported>() {}
USE(MemFunTmpl::importedStatic<ExplicitSpec_InlineDef_Imported>)738*67e74705SXin Li USE(MemFunTmpl::importedStatic<ExplicitSpec_InlineDef_Imported>)
739*67e74705SXin Li 
740*67e74705SXin Li 
741*67e74705SXin Li // Not importing specialization of an imported member function template without
742*67e74705SXin Li // explicit dllimport.
743*67e74705SXin Li // M32-DAG: define x86_thiscallcc void @"\01??$importedNormal@UExplicitSpec_NotImported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl* %this)
744*67e74705SXin Li // M64-DAG: define                void @"\01??$importedNormal@UExplicitSpec_NotImported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl* %this)
745*67e74705SXin Li // G32-DAG: define x86_thiscallcc void @_ZN10MemFunTmpl14importedNormalI24ExplicitSpec_NotImportedEEvv(%struct.MemFunTmpl* %this)
746*67e74705SXin Li // G64-DAG: define                void @_ZN10MemFunTmpl14importedNormalI24ExplicitSpec_NotImportedEEvv(%struct.MemFunTmpl* %this)
747*67e74705SXin Li template<> void MemFunTmpl::importedNormal<ExplicitSpec_NotImported>() {}
USEMF(MemFunTmpl,importedNormal<ExplicitSpec_NotImported>)748*67e74705SXin Li USEMF(MemFunTmpl, importedNormal<ExplicitSpec_NotImported>)
749*67e74705SXin Li 
750*67e74705SXin Li // MSC-DAG: define                void @"\01??$importedStatic@UExplicitSpec_NotImported@@@MemFunTmpl@@SAXXZ"()
751*67e74705SXin Li // GNU-DAG: define                void @_ZN10MemFunTmpl14importedStaticI24ExplicitSpec_NotImportedEEvv()
752*67e74705SXin Li template<> void MemFunTmpl::importedStatic<ExplicitSpec_NotImported>() {}
753*67e74705SXin Li USE(MemFunTmpl::importedStatic<ExplicitSpec_NotImported>)
754*67e74705SXin Li 
755*67e74705SXin Li 
756*67e74705SXin Li // Import explicit instantiation declaration of a non-imported member function
757*67e74705SXin Li // template.
758*67e74705SXin Li // M32-DAG: declare dllimport x86_thiscallcc void @"\01??$normalDef@UExplicitDecl_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
759*67e74705SXin Li // M64-DAG: declare dllimport                void @"\01??$normalDef@UExplicitDecl_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
760*67e74705SXin Li // G32-DAG: declare x86_thiscallcc           void @_ZN10MemFunTmpl9normalDefI21ExplicitDecl_ImportedEEvv(%struct.MemFunTmpl*)
761*67e74705SXin Li // G64-DAG: declare                          void @_ZN10MemFunTmpl9normalDefI21ExplicitDecl_ImportedEEvv(%struct.MemFunTmpl*)
762*67e74705SXin Li extern template __declspec(dllimport) void MemFunTmpl::normalDef<ExplicitDecl_Imported>();
763*67e74705SXin Li USEMF(MemFunTmpl, normalDef<ExplicitDecl_Imported>)
764*67e74705SXin Li 
765*67e74705SXin Li // MSC-DAG: declare dllimport                void @"\01??$staticDef@UExplicitDecl_Imported@@@MemFunTmpl@@SAXXZ"()
766*67e74705SXin Li // GNU-DAG: declare                          void @_ZN10MemFunTmpl9staticDefI21ExplicitDecl_ImportedEEvv()
767*67e74705SXin Li extern template __declspec(dllimport) void MemFunTmpl::staticDef<ExplicitDecl_Imported>();
768*67e74705SXin Li USE(MemFunTmpl::staticDef<ExplicitDecl_Imported>)
769*67e74705SXin Li 
770*67e74705SXin Li 
771*67e74705SXin Li // Import explicit instantiation definition of a non-imported member function
772*67e74705SXin Li // template.
773*67e74705SXin Li // M32-DAG: declare dllimport x86_thiscallcc void @"\01??$normalDef@UExplicitInst_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
774*67e74705SXin Li // M64-DAG: declare dllimport                void @"\01??$normalDef@UExplicitInst_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
775*67e74705SXin Li // G32-DAG: define weak_odr x86_thiscallcc   void @_ZN10MemFunTmpl9normalDefI21ExplicitInst_ImportedEEvv(%struct.MemFunTmpl* %this)
776*67e74705SXin Li // G64-DAG: define weak_odr                  void @_ZN10MemFunTmpl9normalDefI21ExplicitInst_ImportedEEvv(%struct.MemFunTmpl* %this)
777*67e74705SXin Li template __declspec(dllimport) void MemFunTmpl::normalDef<ExplicitInst_Imported>();
778*67e74705SXin Li USEMF(MemFunTmpl, normalDef<ExplicitInst_Imported>)
779*67e74705SXin Li 
780*67e74705SXin Li // MSC-DAG: declare dllimport                void @"\01??$staticDef@UExplicitInst_Imported@@@MemFunTmpl@@SAXXZ"()
781*67e74705SXin Li // GNU-DAG: define weak_odr                  void @_ZN10MemFunTmpl9staticDefI21ExplicitInst_ImportedEEvv()
782*67e74705SXin Li template __declspec(dllimport) void MemFunTmpl::staticDef<ExplicitInst_Imported>();
783*67e74705SXin Li USE(MemFunTmpl::staticDef<ExplicitInst_Imported>)
784*67e74705SXin Li 
785*67e74705SXin Li 
786*67e74705SXin Li // Import specialization of a non-imported member function template.
787*67e74705SXin Li // M32-DAG: declare dllimport x86_thiscallcc void @"\01??$normalDef@UExplicitSpec_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
788*67e74705SXin Li // M64-DAG: declare dllimport                void @"\01??$normalDef@UExplicitSpec_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
789*67e74705SXin Li // G32-DAG: declare dllimport x86_thiscallcc void @_ZN10MemFunTmpl9normalDefI21ExplicitSpec_ImportedEEvv(%struct.MemFunTmpl*)
790*67e74705SXin Li // G64-DAG: declare dllimport                void @_ZN10MemFunTmpl9normalDefI21ExplicitSpec_ImportedEEvv(%struct.MemFunTmpl*)
791*67e74705SXin Li template<> __declspec(dllimport) void MemFunTmpl::normalDef<ExplicitSpec_Imported>();
USEMF(MemFunTmpl,normalDef<ExplicitSpec_Imported>)792*67e74705SXin Li USEMF(MemFunTmpl, normalDef<ExplicitSpec_Imported>)
793*67e74705SXin Li 
794*67e74705SXin Li // M32-DAG-FIXME: declare dllimport x86_thiscallcc void @"\01??$normalDef@UExplicitSpec_Def_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
795*67e74705SXin Li // M64-DAG-FIXME: declare dllimport                void @"\01??$normalDef@UExplicitSpec_Def_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
796*67e74705SXin Li #ifdef MSABI
797*67e74705SXin Li //template<> __declspec(dllimport) void MemFunTmpl::normalDef<ExplicitSpec_Def_Imported>() {}
798*67e74705SXin Li //USEMF(MemFunTmpl, normalDef<ExplicitSpec_Def_Imported>)
799*67e74705SXin Li #endif
800*67e74705SXin Li 
801*67e74705SXin Li // M32-DAG: declare dllimport   x86_thiscallcc void @"\01??$normalDef@UExplicitSpec_InlineDef_Imported@@@MemFunTmpl@@QAEXXZ"(%struct.MemFunTmpl*)
802*67e74705SXin Li // M64-DAG: declare dllimport                  void @"\01??$normalDef@UExplicitSpec_InlineDef_Imported@@@MemFunTmpl@@QEAAXXZ"(%struct.MemFunTmpl*)
803*67e74705SXin Li // G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN10MemFunTmpl9normalDefI31ExplicitSpec_InlineDef_ImportedEEvv(%struct.MemFunTmpl* %this)
804*67e74705SXin Li // G64-DAG: define linkonce_odr                void @_ZN10MemFunTmpl9normalDefI31ExplicitSpec_InlineDef_ImportedEEvv(%struct.MemFunTmpl* %this)
805*67e74705SXin Li template<> __declspec(dllimport) inline void MemFunTmpl::normalDef<ExplicitSpec_InlineDef_Imported>() {}
806*67e74705SXin Li USEMF(MemFunTmpl, normalDef<ExplicitSpec_InlineDef_Imported>)
807*67e74705SXin Li 
808*67e74705SXin Li 
809*67e74705SXin Li // MSC-DAG: declare dllimport void @"\01??$staticDef@UExplicitSpec_Imported@@@MemFunTmpl@@SAXXZ"()
810*67e74705SXin Li // GNU-DAG: declare dllimport void @_ZN10MemFunTmpl9staticDefI21ExplicitSpec_ImportedEEvv()
811*67e74705SXin Li template<> __declspec(dllimport) void MemFunTmpl::staticDef<ExplicitSpec_Imported>();
USE(MemFunTmpl::staticDef<ExplicitSpec_Imported>)812*67e74705SXin Li USE(MemFunTmpl::staticDef<ExplicitSpec_Imported>)
813*67e74705SXin Li 
814*67e74705SXin Li // MSC-DAG-FIXME: declare dllimport void @"\01??$staticDef@UExplicitSpec_Def_Imported@@@MemFunTmpl@@SAXXZ"()
815*67e74705SXin Li #ifdef MSABI
816*67e74705SXin Li //template<> __declspec(dllimport) void MemFunTmpl::staticDef<ExplicitSpec_Def_Imported>() {}
817*67e74705SXin Li //USE(MemFunTmpl::staticDef<ExplicitSpec_Def_Imported>)
818*67e74705SXin Li #endif
819*67e74705SXin Li 
820*67e74705SXin Li // MSC-DAG: declare dllimport void @"\01??$staticDef@UExplicitSpec_InlineDef_Imported@@@MemFunTmpl@@SAXXZ"()
821*67e74705SXin Li // GNU-DAG: define linkonce_odr void @_ZN10MemFunTmpl9staticDefI31ExplicitSpec_InlineDef_ImportedEEvv()
822*67e74705SXin Li template<> __declspec(dllimport) inline void MemFunTmpl::staticDef<ExplicitSpec_InlineDef_Imported>() {}
823*67e74705SXin Li USE(MemFunTmpl::staticDef<ExplicitSpec_InlineDef_Imported>)
824*67e74705SXin Li 
825*67e74705SXin Li 
826*67e74705SXin Li 
827*67e74705SXin Li struct MemVarTmpl {
828*67e74705SXin Li   template<typename T>                       static const int StaticVar = 1;
829*67e74705SXin Li   template<typename T> __declspec(dllimport) static const int ImportedStaticVar = 1;
830*67e74705SXin Li };
831*67e74705SXin Li 
832*67e74705SXin Li // Import implicit instantiation of an imported member variable template.
833*67e74705SXin Li // MSC-DAG: @"\01??$ImportedStaticVar@UImplicitInst_Imported@@@MemVarTmpl@@2HB" = available_externally dllimport constant i32 1, align 4
834*67e74705SXin Li // GNU-DAG: @_ZN10MemVarTmpl17ImportedStaticVarI21ImplicitInst_ImportedEE       = external dllimport constant i32
835*67e74705SXin Li USEMV(MemVarTmpl, ImportedStaticVar<ImplicitInst_Imported>)
836*67e74705SXin Li 
837*67e74705SXin Li // Import explicit instantiation declaration of an imported member variable
838*67e74705SXin Li // template.
839*67e74705SXin Li // MSC-DAG: @"\01??$ImportedStaticVar@UExplicitDecl_Imported@@@MemVarTmpl@@2HB" = external dllimport constant i32
840*67e74705SXin Li // GNU-DAG: @_ZN10MemVarTmpl17ImportedStaticVarI21ExplicitDecl_ImportedEE       = external dllimport constant i32
841*67e74705SXin Li extern template const int MemVarTmpl::ImportedStaticVar<ExplicitDecl_Imported>;
842*67e74705SXin Li USEMV(MemVarTmpl, ImportedStaticVar<ExplicitDecl_Imported>)
843*67e74705SXin Li 
844*67e74705SXin Li // An explicit instantiation definition of an imported member variable template
845*67e74705SXin Li // cannot be imported because the template must be defined which is illegal. The
846*67e74705SXin Li // in-class initializer does not count.
847*67e74705SXin Li 
848*67e74705SXin Li // Import specialization of an imported member variable template.
849*67e74705SXin Li // MSC-DAG: @"\01??$ImportedStaticVar@UExplicitSpec_Imported@@@MemVarTmpl@@2HB" = external dllimport constant i32
850*67e74705SXin Li // GNU-DAG: @_ZN10MemVarTmpl17ImportedStaticVarI21ExplicitSpec_ImportedEE       = external dllimport constant i32
851*67e74705SXin Li template<> __declspec(dllimport) const int MemVarTmpl::ImportedStaticVar<ExplicitSpec_Imported>;
852*67e74705SXin Li USEMV(MemVarTmpl, ImportedStaticVar<ExplicitSpec_Imported>)
853*67e74705SXin Li 
854*67e74705SXin Li // Not importing specialization of a member variable template without explicit
855*67e74705SXin Li // dllimport.
856*67e74705SXin Li // MSC-DAG: @"\01??$ImportedStaticVar@UExplicitSpec_NotImported@@@MemVarTmpl@@2HB" = external constant i32
857*67e74705SXin Li // GNU-DAG: @_ZN10MemVarTmpl17ImportedStaticVarI24ExplicitSpec_NotImportedEE       = external constant i32
858*67e74705SXin Li template<> const int MemVarTmpl::ImportedStaticVar<ExplicitSpec_NotImported>;
859*67e74705SXin Li USEMV(MemVarTmpl, ImportedStaticVar<ExplicitSpec_NotImported>)
860*67e74705SXin Li 
861*67e74705SXin Li 
862*67e74705SXin Li // Import explicit instantiation declaration of a non-imported member variable
863*67e74705SXin Li // template.
864*67e74705SXin Li // MSC-DAG: @"\01??$StaticVar@UExplicitDecl_Imported@@@MemVarTmpl@@2HB" = external dllimport constant i32
865*67e74705SXin Li // GNU-DAG: @_ZN10MemVarTmpl9StaticVarI21ExplicitDecl_ImportedEE        = external dllimport constant i32
866*67e74705SXin Li extern template __declspec(dllimport) const int MemVarTmpl::StaticVar<ExplicitDecl_Imported>;
867*67e74705SXin Li USEMV(MemVarTmpl, StaticVar<ExplicitDecl_Imported>)
868*67e74705SXin Li 
869*67e74705SXin Li // An explicit instantiation definition of a non-imported member variable template
870*67e74705SXin Li // cannot be imported because the template must be defined which is illegal. The
871*67e74705SXin Li // in-class initializer does not count.
872*67e74705SXin Li 
873*67e74705SXin Li // Import specialization of a non-imported member variable template.
874*67e74705SXin Li // MSC-DAG: @"\01??$StaticVar@UExplicitSpec_Imported@@@MemVarTmpl@@2HB" = external dllimport constant i32
875*67e74705SXin Li // GNU-DAG: @_ZN10MemVarTmpl9StaticVarI21ExplicitSpec_ImportedEE        = external dllimport constant i32
876*67e74705SXin Li template<> __declspec(dllimport) const int MemVarTmpl::StaticVar<ExplicitSpec_Imported>;
877*67e74705SXin Li USEMV(MemVarTmpl, StaticVar<ExplicitSpec_Imported>)
878