blob: 662278b3034f9fd5b3bae2f397a0bf0d602febb7 [file] [log] [blame]
Stephen Hines651f13c2014-04-23 16:59:28 -07001// RUN: %clang_cc1 -fblocks -emit-llvm %s -o - -triple=i386-pc-win32 -std=c++98 | FileCheck %s
2// RUN: %clang_cc1 -fblocks -emit-llvm %s -o - -triple=x86_64-pc-win32 -std=c++98| FileCheck -check-prefix X64 %s
Charles Davise60cea82010-06-11 03:07:32 +00003
Charles Davis570d2762010-06-12 08:11:16 +00004int a;
David Majnemer167b7742013-09-13 08:59:19 +00005// CHECK-DAG: @"\01?a@@3HA"
Charles Davise60cea82010-06-11 03:07:32 +00006
Timur Iskhodzhanov79b7cc52012-11-26 08:55:48 +00007namespace N {
8 int b;
David Majnemer167b7742013-09-13 08:59:19 +00009// CHECK-DAG: @"\01?b@N@@3HA"
Timur Iskhodzhanov79b7cc52012-11-26 08:55:48 +000010
11 namespace {
12 int anonymous;
David Majnemer167b7742013-09-13 08:59:19 +000013// CHECK-DAG: @"\01?anonymous@?A@N@@3HA"
Timur Iskhodzhanov79b7cc52012-11-26 08:55:48 +000014 }
15}
Charles Davis570d2762010-06-12 08:11:16 +000016
17static int c;
David Majnemer167b7742013-09-13 08:59:19 +000018// CHECK-DAG: @c
19
Timur Iskhodzhanov79b7cc52012-11-26 08:55:48 +000020int _c(void) {return N::anonymous + c;}
David Majnemer167b7742013-09-13 08:59:19 +000021// CHECK-DAG: @"\01?_c@@YAHXZ"
22// X64-DAG: @"\01?_c@@YAHXZ"
Charles Davis570d2762010-06-12 08:11:16 +000023
Charles Davisb021f8b2010-06-14 05:29:01 +000024class foo {
25 static const short d;
David Majnemer167b7742013-09-13 08:59:19 +000026// CHECK-DAG: @"\01?d@foo@@0FB"
Charles Davisb021f8b2010-06-14 05:29:01 +000027protected:
28 static volatile long e;
David Majnemer167b7742013-09-13 08:59:19 +000029// CHECK-DAG: @"\01?e@foo@@1JC"
Charles Davisb021f8b2010-06-14 05:29:01 +000030public:
31 static const volatile char f;
David Majnemer167b7742013-09-13 08:59:19 +000032// CHECK-DAG: @"\01?f@foo@@2DD"
Charles Davis21e2a7e2010-06-17 06:47:31 +000033 int operator+(int a);
Michael J. Spencer50118da2011-12-01 09:55:00 +000034 foo(){}
David Majnemer167b7742013-09-13 08:59:19 +000035// CHECK-DAG: @"\01??0foo@@QAE@XZ"
36// X64-DAG: @"\01??0foo@@QEAA@XZ"
Michael J. Spencer50118da2011-12-01 09:55:00 +000037
38 ~foo(){}
David Majnemer167b7742013-09-13 08:59:19 +000039// CHECK-DAG: @"\01??1foo@@QAE@XZ"
40// X64-DAG: @"\01??1foo@@QEAA@XZ
Michael J. Spencer50118da2011-12-01 09:55:00 +000041
42 foo(int i){}
David Majnemer167b7742013-09-13 08:59:19 +000043// CHECK-DAG: @"\01??0foo@@QAE@H@Z"
44// X64-DAG: @"\01??0foo@@QEAA@H@Z"
Michael J. Spencer50118da2011-12-01 09:55:00 +000045
46 foo(char *q){}
David Majnemer167b7742013-09-13 08:59:19 +000047// CHECK-DAG: @"\01??0foo@@QAE@PAD@Z"
48// X64-DAG: @"\01??0foo@@QEAA@PEAD@Z"
Timur Iskhodzhanovdf438042012-06-27 01:38:25 +000049
50 static foo* static_method() { return 0; }
51
Michael J. Spencer50118da2011-12-01 09:55:00 +000052}f,s1(1),s2((char*)0);
Charles Davisb021f8b2010-06-14 05:29:01 +000053
Richard Smithc0838d22012-06-08 00:37:04 +000054typedef foo (foo2);
55
Charles Davisc62458f2010-06-18 07:51:00 +000056struct bar {
57 static int g;
58};
59
60union baz {
61 int a;
62 char b;
63 double c;
64};
65
66enum quux {
67 qone,
68 qtwo,
69 qthree
70};
71
Timur Iskhodzhanovdf438042012-06-27 01:38:25 +000072foo bar() { return foo(); }
David Majnemer167b7742013-09-13 08:59:19 +000073// CHECK-DAG: @"\01?bar@@YA?AVfoo@@XZ"
74// X64-DAG: @"\01?bar@@YA?AVfoo@@XZ"
Timur Iskhodzhanovdf438042012-06-27 01:38:25 +000075
76int foo::operator+(int a) {
David Majnemer167b7742013-09-13 08:59:19 +000077// CHECK-DAG: @"\01??Hfoo@@QAEHH@Z"
78// X64-DAG: @"\01??Hfoo@@QEAAHH@Z"
Timur Iskhodzhanovdf438042012-06-27 01:38:25 +000079
80 foo::static_method();
David Majnemer167b7742013-09-13 08:59:19 +000081// CHECK-DAG: @"\01?static_method@foo@@SAPAV1@XZ"
82// X64-DAG: @"\01?static_method@foo@@SAPEAV1@XZ"
Timur Iskhodzhanovdf438042012-06-27 01:38:25 +000083 bar();
84 return a;
85}
Charles Davis21e2a7e2010-06-17 06:47:31 +000086
Charles Davisb021f8b2010-06-14 05:29:01 +000087const short foo::d = 0;
88volatile long foo::e;
89const volatile char foo::f = 'C';
90
Charles Davisc62458f2010-06-18 07:51:00 +000091int bar::g;
David Majnemer167b7742013-09-13 08:59:19 +000092// CHECK-DAG: @"\01?g@bar@@2HA"
Charles Davisc62458f2010-06-18 07:51:00 +000093
Timur Iskhodzhanova04ca5c2012-09-03 09:08:10 +000094extern int * const h1 = &a;
David Majnemer167b7742013-09-13 08:59:19 +000095// CHECK-DAG: @"\01?h1@@3QAHA"
Timur Iskhodzhanova04ca5c2012-09-03 09:08:10 +000096extern const int * const h2 = &a;
David Majnemer167b7742013-09-13 08:59:19 +000097// CHECK-DAG: @"\01?h2@@3QBHB"
Stephen Hines651f13c2014-04-23 16:59:28 -070098extern int * const __restrict h3 = &a;
99// CHECK-DAG: @"\01?h3@@3QIAHIA"
100// X64-DAG: @"\01?h3@@3QEIAHEIA"
Charles Davis3a0d41d2010-06-26 03:50:05 +0000101
Charles Davis0b8fe8c2010-06-30 08:09:57 +0000102int i[10][20];
David Majnemer167b7742013-09-13 08:59:19 +0000103// CHECK-DAG: @"\01?i@@3PAY0BE@HA"
Charles Davis0b8fe8c2010-06-30 08:09:57 +0000104
Stephen Hines651f13c2014-04-23 16:59:28 -0700105typedef int (*FunT)(int, int);
106FunT FunArr[10][20];
107// CHECK-DAG: @"\01?FunArr@@3PAY0BE@P6AHHH@ZA"
108// X64-DAG: @"\01?FunArr@@3PAY0BE@P6AHHH@ZA"
109
Charles Davis1139da12010-07-03 05:53:41 +0000110int (__stdcall *j)(signed char, unsigned char);
David Majnemer167b7742013-09-13 08:59:19 +0000111// CHECK-DAG: @"\01?j@@3P6GHCE@ZA"
Charles Davis1139da12010-07-03 05:53:41 +0000112
Richard Smithc0838d22012-06-08 00:37:04 +0000113const volatile char foo2::*k;
David Majnemer167b7742013-09-13 08:59:19 +0000114// CHECK-DAG: @"\01?k@@3PTfoo@@DT1@"
115// X64-DAG: @"\01?k@@3PETfoo@@DET1@"
Charles Daviscd712cb2010-07-03 08:01:32 +0000116
Richard Smithc0838d22012-06-08 00:37:04 +0000117int (foo2::*l)(int);
David Majnemer167b7742013-09-13 08:59:19 +0000118// CHECK-DAG: @"\01?l@@3P8foo@@AEHH@ZQ1@"
Charles Daviscd712cb2010-07-03 08:01:32 +0000119
Stephen Hines176edba2014-12-01 14:53:08 -0800120// Ensure typedef CV qualifiers are mangled correctly
121typedef const int cInt;
122typedef volatile int vInt;
123typedef const volatile int cvInt;
124
125extern cInt g_cInt = 1;
126vInt g_vInt = 2;
127cvInt g_cvInt = 3;
128
129// CHECK-DAG: @"\01?g_cInt@@3HB"
130// CHECK-DAG: @"\01?g_vInt@@3HC"
131// CHECK-DAG: @"\01?g_cvInt@@3HD"
132
Charles Davis65161d12010-06-16 05:33:16 +0000133// Static functions are mangled, too.
134// Also make sure calling conventions, arglists, and throw specs work.
135static void __stdcall alpha(float a, double b) throw() {}
136bool __fastcall beta(long long a, wchar_t b) throw(signed char, unsigned char) {
David Majnemer167b7742013-09-13 08:59:19 +0000137// CHECK-DAG: @"\01?beta@@YI_N_J_W@Z"
138// X64-DAG: @"\01?beta@@YA_N_J_W@Z"
Charles Davis65161d12010-06-16 05:33:16 +0000139 alpha(0.f, 0.0);
140 return false;
141}
142
David Majnemer167b7742013-09-13 08:59:19 +0000143// CHECK-DAG: @"\01?alpha@@YGXMN@Z"
144// X64-DAG: @"\01?alpha@@YAXMN@Z"
Charles Davis65161d12010-06-16 05:33:16 +0000145
Charles Davisc62458f2010-06-18 07:51:00 +0000146// Make sure tag-type mangling works.
147void gamma(class foo, struct bar, union baz, enum quux) {}
David Majnemer167b7742013-09-13 08:59:19 +0000148// CHECK-DAG: @"\01?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z"
149// X64-DAG: @"\01?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z"
Charles Davisc62458f2010-06-18 07:51:00 +0000150
Charles Davis3a0d41d2010-06-26 03:50:05 +0000151// Make sure pointer/reference-type mangling works.
152void delta(int * const a, const long &) {}
David Majnemer167b7742013-09-13 08:59:19 +0000153// CHECK-DAG: @"\01?delta@@YAXQAHABJ@Z"
154// X64-DAG: @"\01?delta@@YAXQEAHAEBJ@Z"
Charles Davis0b8fe8c2010-06-30 08:09:57 +0000155
Charles Davis4d254832010-07-03 16:56:59 +0000156// Array mangling.
Charles Davis0b8fe8c2010-06-30 08:09:57 +0000157void epsilon(int a[][10][20]) {}
David Majnemer167b7742013-09-13 08:59:19 +0000158// CHECK-DAG: @"\01?epsilon@@YAXQAY19BE@H@Z"
159// X64-DAG: @"\01?epsilon@@YAXQEAY19BE@H@Z"
Charles Davis4d254832010-07-03 16:56:59 +0000160
Timur Iskhodzhanovbae11d82012-07-26 13:41:30 +0000161void zeta(int (*)(int, int)) {}
David Majnemer167b7742013-09-13 08:59:19 +0000162// CHECK-DAG: @"\01?zeta@@YAXP6AHHH@Z@Z"
163// X64-DAG: @"\01?zeta@@YAXP6AHHH@Z@Z"
Timur Iskhodzhanovbae11d82012-07-26 13:41:30 +0000164
165// Blocks mangling (Clang extension). A block should be mangled slightly
166// differently from a similar function pointer.
167void eta(int (^)(int, int)) {}
David Majnemer167b7742013-09-13 08:59:19 +0000168// CHECK-DAG: @"\01?eta@@YAXP_EAHHH@Z@Z"
Charles Davis4d254832010-07-03 16:56:59 +0000169
John McCall2612e9f2012-08-25 01:12:56 +0000170typedef int theta_arg(int,int);
171void theta(theta_arg^ block) {}
David Majnemer167b7742013-09-13 08:59:19 +0000172// CHECK-DAG: @"\01?theta@@YAXP_EAHHH@Z@Z"
John McCall2612e9f2012-08-25 01:12:56 +0000173
John McCall3a8ac072012-05-01 02:33:44 +0000174void operator_new_delete() {
175 char *ptr = new char;
David Majnemer167b7742013-09-13 08:59:19 +0000176// CHECK-DAG: @"\01??2@YAPAXI@Z"
John McCall3a8ac072012-05-01 02:33:44 +0000177
178 delete ptr;
David Majnemer167b7742013-09-13 08:59:19 +0000179// CHECK-DAG: @"\01??3@YAXPAX@Z"
John McCall3a8ac072012-05-01 02:33:44 +0000180
181 char *array = new char[42];
David Majnemer167b7742013-09-13 08:59:19 +0000182// CHECK-DAG: @"\01??_U@YAPAXI@Z"
John McCall3a8ac072012-05-01 02:33:44 +0000183
John McCalle2b45e22012-05-01 05:23:51 +0000184 delete [] array;
David Majnemer167b7742013-09-13 08:59:19 +0000185// CHECK-DAG: @"\01??_V@YAXPAX@Z"
John McCall3a8ac072012-05-01 02:33:44 +0000186}
Richard Smithbd1d18e2012-06-04 22:46:59 +0000187
188// PR13022
189void (redundant_parens)();
190void redundant_parens_use() { redundant_parens(); }
David Majnemer167b7742013-09-13 08:59:19 +0000191// CHECK-DAG: @"\01?redundant_parens@@YAXXZ"
192// X64-DAG: @"\01?redundant_parens@@YAXXZ"
Richard Smithc0838d22012-06-08 00:37:04 +0000193
Timur Iskhodzhanova04ca5c2012-09-03 09:08:10 +0000194// PR13047
Richard Smithc0838d22012-06-08 00:37:04 +0000195typedef double RGB[3];
196RGB color1;
David Majnemer167b7742013-09-13 08:59:19 +0000197// CHECK-DAG: @"\01?color1@@3PANA"
Richard Smithc0838d22012-06-08 00:37:04 +0000198extern const RGB color2 = {};
David Majnemer167b7742013-09-13 08:59:19 +0000199// CHECK-DAG: @"\01?color2@@3QBNB"
Timur Iskhodzhanova5427442012-07-23 09:32:54 +0000200extern RGB const color3[5] = {};
David Majnemer167b7742013-09-13 08:59:19 +0000201// CHECK-DAG: @"\01?color3@@3QAY02$$CBNA"
Timur Iskhodzhanova5427442012-07-23 09:32:54 +0000202extern RGB const ((color4)[5]) = {};
David Majnemer167b7742013-09-13 08:59:19 +0000203// CHECK-DAG: @"\01?color4@@3QAY02$$CBNA"
Richard Smith06e767d2012-06-21 02:52:27 +0000204
David Majnemer1c7a4092013-08-15 08:13:23 +0000205struct B;
206volatile int B::* volatile memptr1;
David Majnemer167b7742013-09-13 08:59:19 +0000207// X64-DAG: @"\01?memptr1@@3RESB@@HES1@"
David Majnemer1c7a4092013-08-15 08:13:23 +0000208volatile int B::* memptr2;
David Majnemer167b7742013-09-13 08:59:19 +0000209// X64-DAG: @"\01?memptr2@@3PESB@@HES1@"
David Majnemer1c7a4092013-08-15 08:13:23 +0000210int B::* volatile memptr3;
David Majnemer167b7742013-09-13 08:59:19 +0000211// X64-DAG: @"\01?memptr3@@3REQB@@HEQ1@"
David Majnemer1c7a4092013-08-15 08:13:23 +0000212typedef int (*fun)();
213volatile fun B::* volatile funmemptr1;
David Majnemer167b7742013-09-13 08:59:19 +0000214// X64-DAG: @"\01?funmemptr1@@3RESB@@R6AHXZES1@"
David Majnemer1c7a4092013-08-15 08:13:23 +0000215volatile fun B::* funmemptr2;
David Majnemer167b7742013-09-13 08:59:19 +0000216// X64-DAG: @"\01?funmemptr2@@3PESB@@R6AHXZES1@"
David Majnemer1c7a4092013-08-15 08:13:23 +0000217fun B::* volatile funmemptr3;
David Majnemer167b7742013-09-13 08:59:19 +0000218// X64-DAG: @"\01?funmemptr3@@3REQB@@P6AHXZEQ1@"
David Majnemer1c7a4092013-08-15 08:13:23 +0000219void (B::* volatile memptrtofun1)();
David Majnemer167b7742013-09-13 08:59:19 +0000220// X64-DAG: @"\01?memptrtofun1@@3R8B@@EAAXXZEQ1@"
David Majnemer1c7a4092013-08-15 08:13:23 +0000221const void (B::* memptrtofun2)();
David Majnemer167b7742013-09-13 08:59:19 +0000222// X64-DAG: @"\01?memptrtofun2@@3P8B@@EAAXXZEQ1@"
David Majnemer1c7a4092013-08-15 08:13:23 +0000223volatile void (B::* memptrtofun3)();
David Majnemer167b7742013-09-13 08:59:19 +0000224// X64-DAG: @"\01?memptrtofun3@@3P8B@@EAAXXZEQ1@"
David Majnemer1c7a4092013-08-15 08:13:23 +0000225int (B::* volatile memptrtofun4)();
David Majnemer167b7742013-09-13 08:59:19 +0000226// X64-DAG: @"\01?memptrtofun4@@3R8B@@EAAHXZEQ1@"
David Majnemer1c7a4092013-08-15 08:13:23 +0000227volatile int (B::* memptrtofun5)();
David Majnemer167b7742013-09-13 08:59:19 +0000228// X64-DAG: @"\01?memptrtofun5@@3P8B@@EAA?CHXZEQ1@"
David Majnemer1c7a4092013-08-15 08:13:23 +0000229const int (B::* memptrtofun6)();
David Majnemer167b7742013-09-13 08:59:19 +0000230// X64-DAG: @"\01?memptrtofun6@@3P8B@@EAA?BHXZEQ1@"
David Majnemer1c7a4092013-08-15 08:13:23 +0000231fun (B::* volatile memptrtofun7)();
David Majnemer167b7742013-09-13 08:59:19 +0000232// X64-DAG: @"\01?memptrtofun7@@3R8B@@EAAP6AHXZXZEQ1@"
David Majnemer1c7a4092013-08-15 08:13:23 +0000233volatile fun (B::* memptrtofun8)();
David Majnemer167b7742013-09-13 08:59:19 +0000234// X64-DAG: @"\01?memptrtofun8@@3P8B@@EAAR6AHXZXZEQ1@"
David Majnemer1c7a4092013-08-15 08:13:23 +0000235const fun (B::* memptrtofun9)();
David Majnemer167b7742013-09-13 08:59:19 +0000236// X64-DAG: @"\01?memptrtofun9@@3P8B@@EAAQ6AHXZXZEQ1@"
David Majnemer1c7a4092013-08-15 08:13:23 +0000237
Richard Smith06e767d2012-06-21 02:52:27 +0000238// PR12603
239enum E {};
David Majnemer167b7742013-09-13 08:59:19 +0000240// CHECK-DAG: "\01?fooE@@YA?AW4E@@XZ"
241// X64-DAG: "\01?fooE@@YA?AW4E@@XZ"
Richard Smith06e767d2012-06-21 02:52:27 +0000242E fooE() { return E(); }
243
244class X {};
David Majnemer167b7742013-09-13 08:59:19 +0000245// CHECK-DAG: "\01?fooX@@YA?AVX@@XZ"
246// X64-DAG: "\01?fooX@@YA?AVX@@XZ"
Richard Smith06e767d2012-06-21 02:52:27 +0000247X fooX() { return X(); }
Timur Iskhodzhanova04ca5c2012-09-03 09:08:10 +0000248
249namespace PR13182 {
250 extern char s0[];
David Majnemer167b7742013-09-13 08:59:19 +0000251 // CHECK-DAG: @"\01?s0@PR13182@@3PADA"
Timur Iskhodzhanova04ca5c2012-09-03 09:08:10 +0000252 extern char s1[42];
David Majnemer167b7742013-09-13 08:59:19 +0000253 // CHECK-DAG: @"\01?s1@PR13182@@3PADA"
Timur Iskhodzhanova04ca5c2012-09-03 09:08:10 +0000254 extern const char s2[];
David Majnemer167b7742013-09-13 08:59:19 +0000255 // CHECK-DAG: @"\01?s2@PR13182@@3QBDB"
Timur Iskhodzhanova04ca5c2012-09-03 09:08:10 +0000256 extern const char s3[42];
David Majnemer167b7742013-09-13 08:59:19 +0000257 // CHECK-DAG: @"\01?s3@PR13182@@3QBDB"
Timur Iskhodzhanova04ca5c2012-09-03 09:08:10 +0000258 extern volatile char s4[];
David Majnemer167b7742013-09-13 08:59:19 +0000259 // CHECK-DAG: @"\01?s4@PR13182@@3RCDC"
Timur Iskhodzhanova04ca5c2012-09-03 09:08:10 +0000260 extern const volatile char s5[];
David Majnemer167b7742013-09-13 08:59:19 +0000261 // CHECK-DAG: @"\01?s5@PR13182@@3SDDD"
Timur Iskhodzhanova04ca5c2012-09-03 09:08:10 +0000262 extern const char* const* s6;
David Majnemer167b7742013-09-13 08:59:19 +0000263 // CHECK-DAG: @"\01?s6@PR13182@@3PBQBDB"
Timur Iskhodzhanova04ca5c2012-09-03 09:08:10 +0000264
265 char foo() {
266 return s0[0] + s1[0] + s2[0] + s3[0] + s4[0] + s5[0] + s6[0][0];
267 }
268}
David Majnemercab7dad2013-09-13 09:03:14 +0000269
270extern "C" inline void extern_c_func() {
271 static int local;
272// CHECK-DAG: @"\01?local@?1??extern_c_func@@9@4HA"
273// X64-DAG: @"\01?local@?1??extern_c_func@@9@4HA"
274}
275
276void call_extern_c_func() {
277 extern_c_func();
278}
David Majnemer978c5e02013-09-13 09:40:55 +0000279
280int main() { return 0; }
281// CHECK-DAG: @main
282// X64-DAG: @main
283
284int wmain() { return 0; }
285// CHECK-DAG: @wmain
286// X64-DAG: @wmain
287
288int WinMain() { return 0; }
289// CHECK-DAG: @WinMain
290// X64-DAG: @WinMain
291
292int wWinMain() { return 0; }
293// CHECK-DAG: @wWinMain
294// X64-DAG: @wWinMain
295
296int DllMain() { return 0; }
297// CHECK-DAG: @DllMain
298// X64-DAG: @DllMain
David Majnemeraa824612013-09-17 23:57:10 +0000299
300inline int inline_function_with_local_type() {
301 static struct {
302 int a_field;
303 } static_variable_in_inline_function = { 20 }, second_static = { 40 };
304 // 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"
305
306 return static_variable_in_inline_function.a_field + second_static.a_field;
307}
308
309int call_inline_function_with_local_type() {
310 return inline_function_with_local_type();
311}
312
313template <typename T>
314inline int templated_inline_function_with_local_type() {
315 static struct {
316 int a_field;
317 } static_variable_in_templated_inline_function = { 20 },
318 second_static = { 40 };
319 // 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"
320
321 return static_variable_in_templated_inline_function.a_field +
322 second_static.a_field;
323}
324
325int call_templated_inline_function_with_local_type() {
326 return templated_inline_function_with_local_type<int>();
327}
Reid Klecknerd1a32c32013-10-08 00:58:57 +0000328
329// PR17371
330struct OverloadedNewDelete {
331 // __cdecl
332 void *operator new(__SIZE_TYPE__);
333 void *operator new[](__SIZE_TYPE__);
334 void operator delete(void *);
335 void operator delete[](void *);
336 // __thiscall
337 int operator+(int);
338};
339
340void *OverloadedNewDelete::operator new(__SIZE_TYPE__ s) { return 0; }
341void *OverloadedNewDelete::operator new[](__SIZE_TYPE__ s) { return 0; }
342void OverloadedNewDelete::operator delete(void *) { }
343void OverloadedNewDelete::operator delete[](void *) { }
344int OverloadedNewDelete::operator+(int x) { return x; };
345
346// CHECK-DAG: ??2OverloadedNewDelete@@SAPAXI@Z
347// CHECK-DAG: ??_UOverloadedNewDelete@@SAPAXI@Z
348// CHECK-DAG: ??3OverloadedNewDelete@@SAXPAX@Z
349// CHECK-DAG: ??_VOverloadedNewDelete@@SAXPAX@Z
350// CHECK-DAG: ??HOverloadedNewDelete@@QAEHH@Z
351
352// X64-DAG: ??2OverloadedNewDelete@@SAPEAX_K@Z
353// X64-DAG: ??_UOverloadedNewDelete@@SAPEAX_K@Z
354// X64-DAG: ??3OverloadedNewDelete@@SAXPEAX@Z
355// X64-DAG: ??_VOverloadedNewDelete@@SAXPEAX@Z
356// X64-DAG: ??HOverloadedNewDelete@@QEAAHH@Z
357
358// Indirecting the function type through a typedef will require a calling
359// convention adjustment before building the method decl.
360
361typedef void *__thiscall OperatorNewType(__SIZE_TYPE__);
362typedef void __thiscall OperatorDeleteType(void *);
363
364struct TypedefNewDelete {
365 OperatorNewType operator new;
366 OperatorNewType operator new[];
367 OperatorDeleteType operator delete;
368 OperatorDeleteType operator delete[];
369};
370
371void *TypedefNewDelete::operator new(__SIZE_TYPE__ s) { return 0; }
372void *TypedefNewDelete::operator new[](__SIZE_TYPE__ s) { return 0; }
373void TypedefNewDelete::operator delete(void *) { }
374void TypedefNewDelete::operator delete[](void *) { }
375
376// CHECK-DAG: ??2TypedefNewDelete@@SAPAXI@Z
377// CHECK-DAG: ??_UTypedefNewDelete@@SAPAXI@Z
378// CHECK-DAG: ??3TypedefNewDelete@@SAXPAX@Z
379// CHECK-DAG: ??_VTypedefNewDelete@@SAXPAX@Z
Bill Wendling8a5c9d72013-11-26 10:45:43 +0000380
Stephen Hines176edba2014-12-01 14:53:08 -0800381void __vectorcall vector_func() { }
382// CHECK-DAG: @"\01?vector_func@@YQXXZ"