1 // RUN: %clang_cc1 -fblocks -emit-llvm %s -o - -triple=i386-pc-win32 -std=c++11 | FileCheck %s
2 // RUN: %clang_cc1 -fblocks -emit-llvm %s -o - -triple=x86_64-pc-win32 -std=c++11| FileCheck -check-prefix X64 %s
3 
4 int a;
5 // CHECK-DAG: @"\01?a@@3HA"
6 
7 namespace N {
8   int b;
9 // CHECK-DAG: @"\01?b@N@@3HA"
10 
11   namespace {
12     int anonymous;
13 // CHECK-DAG: @"\01?anonymous@?A@N@@3HA"
14   }
15 }
16 
17 static int c;
18 // CHECK-DAG: @c
19 
20 int _c(void) {return N::anonymous + c;}
21 // CHECK-DAG: @"\01?_c@@YAHXZ"
22 // X64-DAG:   @"\01?_c@@YAHXZ"
23 
24 class foo {
25   static const short d;
26 // CHECK-DAG: @"\01?d@foo@@0FB"
27 protected:
28   static volatile long e;
29 // CHECK-DAG: @"\01?e@foo@@1JC"
30 public:
31   static const volatile char f;
32 // CHECK-DAG: @"\01?f@foo@@2DD"
33   int operator+(int a);
34   foo(){}
35 // CHECK-DAG: @"\01??0foo@@QAE@XZ"
36 // X64-DAG:   @"\01??0foo@@QEAA@XZ"
37 
38   ~foo(){}
39 // CHECK-DAG: @"\01??1foo@@QAE@XZ"
40 // X64-DAG:   @"\01??1foo@@QEAA@XZ
41 
42   foo(int i){}
43 // CHECK-DAG: @"\01??0foo@@QAE@H@Z"
44 // X64-DAG:   @"\01??0foo@@QEAA@H@Z"
45 
46   foo(char *q){}
47 // CHECK-DAG: @"\01??0foo@@QAE@PAD@Z"
48 // X64-DAG:   @"\01??0foo@@QEAA@PEAD@Z"
49 
50   static foo* static_method() { return 0; }
51 
52 }f,s1(1),s2((char*)0);
53 
54 typedef foo (foo2);
55 
56 struct bar {
57   static int g;
58 };
59 
60 union baz {
61   int a;
62   char b;
63   double c;
64 };
65 
66 enum quux {
67   qone,
68   qtwo,
69   qthree
70 };
71 
72 foo bar() { return foo(); }
73 // CHECK-DAG: @"\01?bar@@YA?AVfoo@@XZ"
74 // X64-DAG:   @"\01?bar@@YA?AVfoo@@XZ"
75 
76 int foo::operator+(int a) {
77 // CHECK-DAG: @"\01??Hfoo@@QAEHH@Z"
78 // X64-DAG:   @"\01??Hfoo@@QEAAHH@Z"
79 
80   foo::static_method();
81 // CHECK-DAG: @"\01?static_method@foo@@SAPAV1@XZ"
82 // X64-DAG:   @"\01?static_method@foo@@SAPEAV1@XZ"
83   bar();
84   return a;
85 }
86 
87 const short foo::d = 0;
88 volatile long foo::e;
89 const volatile char foo::f = 'C';
90 
91 int bar::g;
92 // CHECK-DAG: @"\01?g@bar@@2HA"
93 
94 extern int * const h1 = &a;
95 // CHECK-DAG: @"\01?h1@@3QAHA"
96 extern const int * const h2 = &a;
97 // CHECK-DAG: @"\01?h2@@3QBHB"
98 
99 int i[10][20];
100 // CHECK-DAG: @"\01?i@@3PAY0BE@HA"
101 
102 int (__stdcall *j)(signed char, unsigned char);
103 // CHECK-DAG: @"\01?j@@3P6GHCE@ZA"
104 
105 const volatile char foo2::*k;
106 // CHECK-DAG: @"\01?k@@3PTfoo@@DT1@"
107 // X64-DAG:   @"\01?k@@3PETfoo@@DET1@"
108 
109 int (foo2::*l)(int);
110 // CHECK-DAG: @"\01?l@@3P8foo@@AEHH@ZQ1@"
111 
112 // Static functions are mangled, too.
113 // Also make sure calling conventions, arglists, and throw specs work.
114 static void __stdcall alpha(float a, double b) throw() {}
115 bool __fastcall beta(long long a, wchar_t b) throw(signed char, unsigned char) {
116 // CHECK-DAG: @"\01?beta@@YI_N_J_W@Z"
117 // X64-DAG:   @"\01?beta@@YA_N_J_W@Z"
118   alpha(0.f, 0.0);
119   return false;
120 }
121 
122 // CHECK-DAG: @"\01?alpha@@YGXMN@Z"
123 // X64-DAG:   @"\01?alpha@@YAXMN@Z"
124 
125 // Make sure tag-type mangling works.
126 void gamma(class foo, struct bar, union baz, enum quux) {}
127 // CHECK-DAG: @"\01?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z"
128 // X64-DAG:   @"\01?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z"
129 
130 // Make sure pointer/reference-type mangling works.
131 void delta(int * const a, const long &) {}
132 // CHECK-DAG: @"\01?delta@@YAXQAHABJ@Z"
133 // X64-DAG:   @"\01?delta@@YAXQEAHAEBJ@Z"
134 
135 // Array mangling.
136 void epsilon(int a[][10][20]) {}
137 // CHECK-DAG: @"\01?epsilon@@YAXQAY19BE@H@Z"
138 // X64-DAG:   @"\01?epsilon@@YAXQEAY19BE@H@Z"
139 
140 void zeta(int (*)(int, int)) {}
141 // CHECK-DAG: @"\01?zeta@@YAXP6AHHH@Z@Z"
142 // X64-DAG:   @"\01?zeta@@YAXP6AHHH@Z@Z"
143 
144 // Blocks mangling (Clang extension). A block should be mangled slightly
145 // differently from a similar function pointer.
146 void eta(int (^)(int, int)) {}
147 // CHECK-DAG: @"\01?eta@@YAXP_EAHHH@Z@Z"
148 
149 typedef int theta_arg(int,int);
150 void theta(theta_arg^ block) {}
151 // CHECK-DAG: @"\01?theta@@YAXP_EAHHH@Z@Z"
152 
153 void operator_new_delete() {
154   char *ptr = new char;
155 // CHECK-DAG: @"\01??2@YAPAXI@Z"
156 
157   delete ptr;
158 // CHECK-DAG: @"\01??3@YAXPAX@Z"
159 
160   char *array = new char[42];
161 // CHECK-DAG: @"\01??_U@YAPAXI@Z"
162 
163   delete [] array;
164 // CHECK-DAG: @"\01??_V@YAXPAX@Z"
165 }
166 
167 // PR13022
168 void (redundant_parens)();
169 void redundant_parens_use() { redundant_parens(); }
170 // CHECK-DAG: @"\01?redundant_parens@@YAXXZ"
171 // X64-DAG:   @"\01?redundant_parens@@YAXXZ"
172 
173 // PR13047
174 typedef double RGB[3];
175 RGB color1;
176 // CHECK-DAG: @"\01?color1@@3PANA"
177 extern const RGB color2 = {};
178 // CHECK-DAG: @"\01?color2@@3QBNB"
179 extern RGB const color3[5] = {};
180 // CHECK-DAG: @"\01?color3@@3QAY02$$CBNA"
181 extern RGB const ((color4)[5]) = {};
182 // CHECK-DAG: @"\01?color4@@3QAY02$$CBNA"
183 
184 struct B;
185 volatile int B::* volatile memptr1;
186 // X64-DAG: @"\01?memptr1@@3RESB@@HES1@"
187 volatile int B::* memptr2;
188 // X64-DAG: @"\01?memptr2@@3PESB@@HES1@"
189 int B::* volatile memptr3;
190 // X64-DAG: @"\01?memptr3@@3REQB@@HEQ1@"
191 typedef int (*fun)();
192 volatile fun B::* volatile funmemptr1;
193 // X64-DAG: @"\01?funmemptr1@@3RESB@@R6AHXZES1@"
194 volatile fun B::* funmemptr2;
195 // X64-DAG: @"\01?funmemptr2@@3PESB@@R6AHXZES1@"
196 fun B::* volatile funmemptr3;
197 // X64-DAG: @"\01?funmemptr3@@3REQB@@P6AHXZEQ1@"
198 void (B::* volatile memptrtofun1)();
199 // X64-DAG: @"\01?memptrtofun1@@3R8B@@EAAXXZEQ1@"
200 const void (B::* memptrtofun2)();
201 // X64-DAG: @"\01?memptrtofun2@@3P8B@@EAAXXZEQ1@"
202 volatile void (B::* memptrtofun3)();
203 // X64-DAG: @"\01?memptrtofun3@@3P8B@@EAAXXZEQ1@"
204 int (B::* volatile memptrtofun4)();
205 // X64-DAG: @"\01?memptrtofun4@@3R8B@@EAAHXZEQ1@"
206 volatile int (B::* memptrtofun5)();
207 // X64-DAG: @"\01?memptrtofun5@@3P8B@@EAA?CHXZEQ1@"
208 const int (B::* memptrtofun6)();
209 // X64-DAG: @"\01?memptrtofun6@@3P8B@@EAA?BHXZEQ1@"
210 fun (B::* volatile memptrtofun7)();
211 // X64-DAG: @"\01?memptrtofun7@@3R8B@@EAAP6AHXZXZEQ1@"
212 volatile fun (B::* memptrtofun8)();
213 // X64-DAG: @"\01?memptrtofun8@@3P8B@@EAAR6AHXZXZEQ1@"
214 const fun (B::* memptrtofun9)();
215 // X64-DAG: @"\01?memptrtofun9@@3P8B@@EAAQ6AHXZXZEQ1@"
216 
217 // PR12603
218 enum E {};
219 // CHECK-DAG: "\01?fooE@@YA?AW4E@@XZ"
220 // X64-DAG:   "\01?fooE@@YA?AW4E@@XZ"
221 E fooE() { return E(); }
222 
223 class X {};
224 // CHECK-DAG: "\01?fooX@@YA?AVX@@XZ"
225 // X64-DAG:   "\01?fooX@@YA?AVX@@XZ"
226 X fooX() { return X(); }
227 
228 namespace PR13182 {
229   extern char s0[];
230   // CHECK-DAG: @"\01?s0@PR13182@@3PADA"
231   extern char s1[42];
232   // CHECK-DAG: @"\01?s1@PR13182@@3PADA"
233   extern const char s2[];
234   // CHECK-DAG: @"\01?s2@PR13182@@3QBDB"
235   extern const char s3[42];
236   // CHECK-DAG: @"\01?s3@PR13182@@3QBDB"
237   extern volatile char s4[];
238   // CHECK-DAG: @"\01?s4@PR13182@@3RCDC"
239   extern const volatile char s5[];
240   // CHECK-DAG: @"\01?s5@PR13182@@3SDDD"
241   extern const char* const* s6;
242   // CHECK-DAG: @"\01?s6@PR13182@@3PBQBDB"
243 
244   char foo() {
245     return s0[0] + s1[0] + s2[0] + s3[0] + s4[0] + s5[0] + s6[0][0];
246   }
247 }
248 
249 namespace EnumMangling {
250   extern enum Enum01 { } Enum;
251   extern enum Enum02 : bool { } BoolEnum;
252   extern enum Enum03 : char { } CharEnum;
253   extern enum Enum04 : signed char { } SCharEnum;
254   extern enum Enum05 : unsigned char { } UCharEnum;
255   extern enum Enum06 : short { } SShortEnum;
256   extern enum Enum07 : unsigned short { } UShortEnum;
257   extern enum Enum08 : int { } SIntEnum;
258   extern enum Enum09 : unsigned int { } UIntEnum;
259   extern enum Enum10 : long { } SLongEnum;
260   extern enum Enum11 : unsigned long { } ULongEnum;
261   extern enum Enum12 : long long { } SLongLongEnum;
262   extern enum Enum13 : unsigned long long { } ULongLongEnum;
263 // CHECK-DAG: @"\01?Enum@EnumMangling@@3W4Enum01@1@A"
264 // CHECK-DAG: @"\01?BoolEnum@EnumMangling@@3W4Enum02@1@A
265 // CHECK-DAG: @"\01?CharEnum@EnumMangling@@3W4Enum03@1@A
266 // CHECK-DAG: @"\01?SCharEnum@EnumMangling@@3W4Enum04@1@A
267 // CHECK-DAG: @"\01?UCharEnum@EnumMangling@@3W4Enum05@1@A
268 // CHECK-DAG: @"\01?SShortEnum@EnumMangling@@3W4Enum06@1@A"
269 // CHECK-DAG: @"\01?UShortEnum@EnumMangling@@3W4Enum07@1@A"
270 // CHECK-DAG: @"\01?SIntEnum@EnumMangling@@3W4Enum08@1@A"
271 // CHECK-DAG: @"\01?UIntEnum@EnumMangling@@3W4Enum09@1@A"
272 // CHECK-DAG: @"\01?SLongEnum@EnumMangling@@3W4Enum10@1@A"
273 // CHECK-DAG: @"\01?ULongEnum@EnumMangling@@3W4Enum11@1@A"
274 // CHECK-DAG: @"\01?SLongLongEnum@EnumMangling@@3W4Enum12@1@A"
275 // CHECK-DAG: @"\01?ULongLongEnum@EnumMangling@@3W4Enum13@1@A"
276   decltype(Enum) *UseEnum() { return &Enum; }
277   decltype(BoolEnum) *UseBoolEnum() { return &BoolEnum; }
278   decltype(CharEnum) *UseCharEnum() { return &CharEnum; }
279   decltype(SCharEnum) *UseSCharEnum() { return &SCharEnum; }
280   decltype(UCharEnum) *UseUCharEnum() { return &UCharEnum; }
281   decltype(SShortEnum) *UseSShortEnum() { return &SShortEnum; }
282   decltype(UShortEnum) *UseUShortEnum() { return &UShortEnum; }
283   decltype(SIntEnum) *UseSIntEnum() { return &SIntEnum; }
284   decltype(UIntEnum) *UseUIntEnum() { return &UIntEnum; }
285   decltype(SLongEnum) *UseSLongEnum() { return &SLongEnum; }
286   decltype(ULongEnum) *UseULongEnum() { return &ULongEnum; }
287   decltype(SLongLongEnum) *UseSLongLongEnum() { return &SLongLongEnum; }
288   decltype(ULongLongEnum) *UseULongLongEnum() { return &ULongLongEnum; }
289   extern enum class EnumClass01 { } EnumClass;
290   extern enum class EnumClass02 : bool { } BoolEnumClass;
291   extern enum class EnumClass03 : char { } CharEnumClass;
292   extern enum class EnumClass04 : signed char { } SCharEnumClass;
293   extern enum class EnumClass05 : unsigned char { } UCharEnumClass;
294   extern enum class EnumClass06 : short { } SShortEnumClass;
295   extern enum class EnumClass07 : unsigned short { } UShortEnumClass;
296   extern enum class EnumClass08 : int { } SIntEnumClass;
297   extern enum class EnumClass09 : unsigned int { } UIntEnumClass;
298   extern enum class EnumClass10 : long { } SLongEnumClass;
299   extern enum class EnumClass11 : unsigned long { } ULongEnumClass;
300   extern enum class EnumClass12 : long long { } SLongLongEnumClass;
301   extern enum class EnumClass13 : unsigned long long { } ULongLongEnumClass;
302 // CHECK-DAG: @"\01?EnumClass@EnumMangling@@3W4EnumClass01@1@A"
303 // CHECK-DAG: @"\01?BoolEnumClass@EnumMangling@@3W4EnumClass02@1@A
304 // CHECK-DAG: @"\01?CharEnumClass@EnumMangling@@3W4EnumClass03@1@A
305 // CHECK-DAG: @"\01?SCharEnumClass@EnumMangling@@3W4EnumClass04@1@A
306 // CHECK-DAG: @"\01?UCharEnumClass@EnumMangling@@3W4EnumClass05@1@A
307 // CHECK-DAG: @"\01?SShortEnumClass@EnumMangling@@3W4EnumClass06@1@A"
308 // CHECK-DAG: @"\01?UShortEnumClass@EnumMangling@@3W4EnumClass07@1@A"
309 // CHECK-DAG: @"\01?SIntEnumClass@EnumMangling@@3W4EnumClass08@1@A"
310 // CHECK-DAG: @"\01?UIntEnumClass@EnumMangling@@3W4EnumClass09@1@A"
311 // CHECK-DAG: @"\01?SLongEnumClass@EnumMangling@@3W4EnumClass10@1@A"
312 // CHECK-DAG: @"\01?ULongEnumClass@EnumMangling@@3W4EnumClass11@1@A"
313 // CHECK-DAG: @"\01?SLongLongEnumClass@EnumMangling@@3W4EnumClass12@1@A"
314 // CHECK-DAG: @"\01?ULongLongEnumClass@EnumMangling@@3W4EnumClass13@1@A"
315   decltype(EnumClass) *UseEnumClass() { return &EnumClass; }
316   decltype(BoolEnumClass) *UseBoolEnumClass() { return &BoolEnumClass; }
317   decltype(CharEnumClass) *UseCharEnumClass() { return &CharEnumClass; }
318   decltype(SCharEnumClass) *UseSCharEnumClass() { return &SCharEnumClass; }
319   decltype(UCharEnumClass) *UseUCharEnumClass() { return &UCharEnumClass; }
320   decltype(SShortEnumClass) *UseSShortEnumClass() { return &SShortEnumClass; }
321   decltype(UShortEnumClass) *UseUShortEnumClass() { return &UShortEnumClass; }
322   decltype(SIntEnumClass) *UseSIntEnumClass() { return &SIntEnumClass; }
323   decltype(UIntEnumClass) *UseUIntEnumClass() { return &UIntEnumClass; }
324   decltype(SLongEnumClass) *UseSLongEnumClass() { return &SLongEnumClass; }
325   decltype(ULongEnumClass) *UseULongEnumClass() { return &ULongEnumClass; }
326   decltype(SLongLongEnumClass) *UseSLongLongEnumClass() { return &SLongLongEnumClass; }
327   decltype(ULongLongEnumClass) *UseULongLongEnumClass() { return &ULongLongEnumClass; }
328 }
329 
330 extern "C" inline void extern_c_func() {
331   static int local;
332 // CHECK-DAG: @"\01?local@?1??extern_c_func@@9@4HA"
333 // X64-DAG:   @"\01?local@?1??extern_c_func@@9@4HA"
334 }
335 
336 void call_extern_c_func() {
337   extern_c_func();
338 }
339 
340 int main() { return 0; }
341 // CHECK-DAG: @main
342 // X64-DAG:   @main
343 
344 int wmain() { return 0; }
345 // CHECK-DAG: @wmain
346 // X64-DAG:   @wmain
347 
348 int WinMain() { return 0; }
349 // CHECK-DAG: @WinMain
350 // X64-DAG:   @WinMain
351 
352 int wWinMain() { return 0; }
353 // CHECK-DAG: @wWinMain
354 // X64-DAG:   @wWinMain
355 
356 int DllMain() { return 0; }
357 // CHECK-DAG: @DllMain
358 // X64-DAG:   @DllMain
359 
360 inline int inline_function_with_local_type() {
361   static struct {
362     int a_field;
363   } static_variable_in_inline_function = { 20 }, second_static = { 40 };
364   // CHECK: @"\01?static_variable_in_inline_function@?1??inline_function_with_local_type@@YAHXZ@4U<unnamed-type-static_variable_in_inline_function>@?1??1@YAHXZ@A"
365 
366   return static_variable_in_inline_function.a_field + second_static.a_field;
367 }
368 
369 int call_inline_function_with_local_type() {
370   return inline_function_with_local_type();
371 }
372 
373 template <typename T>
374 inline int templated_inline_function_with_local_type() {
375   static struct {
376     int a_field;
377   } static_variable_in_templated_inline_function = { 20 },
378     second_static = { 40 };
379   // CHECK: @"\01?static_variable_in_templated_inline_function@?1???$templated_inline_function_with_local_type@H@@YAHXZ@4U<unnamed-type-static_variable_in_templated_inline_function>@?1???$templated_inline_function_with_local_type@H@@YAHXZ@A"
380 
381   return static_variable_in_templated_inline_function.a_field +
382          second_static.a_field;
383 }
384 
385 int call_templated_inline_function_with_local_type() {
386   return templated_inline_function_with_local_type<int>();
387 }
388 
389 // PR17371
390 struct OverloadedNewDelete {
391   // __cdecl
392   void *operator new(__SIZE_TYPE__);
393   void *operator new[](__SIZE_TYPE__);
394   void operator delete(void *);
395   void operator delete[](void *);
396   // __thiscall
397   int operator+(int);
398 };
399 
400 void *OverloadedNewDelete::operator new(__SIZE_TYPE__ s) { return 0; }
401 void *OverloadedNewDelete::operator new[](__SIZE_TYPE__ s) { return 0; }
402 void OverloadedNewDelete::operator delete(void *) { }
403 void OverloadedNewDelete::operator delete[](void *) { }
404 int OverloadedNewDelete::operator+(int x) { return x; };
405 
406 // CHECK-DAG: ??2OverloadedNewDelete@@SAPAXI@Z
407 // CHECK-DAG: ??_UOverloadedNewDelete@@SAPAXI@Z
408 // CHECK-DAG: ??3OverloadedNewDelete@@SAXPAX@Z
409 // CHECK-DAG: ??_VOverloadedNewDelete@@SAXPAX@Z
410 // CHECK-DAG: ??HOverloadedNewDelete@@QAEHH@Z
411 
412 // X64-DAG:   ??2OverloadedNewDelete@@SAPEAX_K@Z
413 // X64-DAG:   ??_UOverloadedNewDelete@@SAPEAX_K@Z
414 // X64-DAG:   ??3OverloadedNewDelete@@SAXPEAX@Z
415 // X64-DAG:   ??_VOverloadedNewDelete@@SAXPEAX@Z
416 // X64-DAG:   ??HOverloadedNewDelete@@QEAAHH@Z
417 
418 // Indirecting the function type through a typedef will require a calling
419 // convention adjustment before building the method decl.
420 
421 typedef void *__thiscall OperatorNewType(__SIZE_TYPE__);
422 typedef void __thiscall OperatorDeleteType(void *);
423 
424 struct TypedefNewDelete {
425   OperatorNewType operator new;
426   OperatorNewType operator new[];
427   OperatorDeleteType operator delete;
428   OperatorDeleteType operator delete[];
429 };
430 
431 void *TypedefNewDelete::operator new(__SIZE_TYPE__ s) { return 0; }
432 void *TypedefNewDelete::operator new[](__SIZE_TYPE__ s) { return 0; }
433 void TypedefNewDelete::operator delete(void *) { }
434 void TypedefNewDelete::operator delete[](void *) { }
435 
436 // CHECK-DAG: ??2TypedefNewDelete@@SAPAXI@Z
437 // CHECK-DAG: ??_UTypedefNewDelete@@SAPAXI@Z
438 // CHECK-DAG: ??3TypedefNewDelete@@SAXPAX@Z
439 // CHECK-DAG: ??_VTypedefNewDelete@@SAXPAX@Z
440 
441 namespace PR18022 {
442 
443 struct { } a;
444 decltype(a) fun(decltype(a) x, decltype(a)) { return x; }
445 // CHECK-DAG: ?fun@PR18022@@YA?AU<unnamed-type-a>@1@U21@0@Z
446 
447 }
448