blob: 47dedfe27a40db5cdc0b5532e5616d2ee7f6b88f [file] [log] [blame]
Charles Davis65161d12010-06-16 05:33:16 +00001// RUN: %clang_cc1 -fms-extensions -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-apple-darwin10 | FileCheck %s
Charles Davise60cea82010-06-11 03:07:32 +00002
Charles Davisb021f8b2010-06-14 05:29:01 +00003// CHECK: @"\01?a@@3HA"
4// CHECK: @"\01?b@N@@3HA"
Charles Davis570d2762010-06-12 08:11:16 +00005// CHECK: @c
Charles Davisb021f8b2010-06-14 05:29:01 +00006// CHECK: @"\01?d@foo@@0FB"
7// CHECK: @"\01?e@foo@@1JC"
8// CHECK: @"\01?f@foo@@2DD"
Charles Davisc62458f2010-06-18 07:51:00 +00009// CHECK: @"\01?g@bar@@2HA"
Charles Davis3a0d41d2010-06-26 03:50:05 +000010// CHECK: @"\01?h@@3QAHA"
Charles Davis0b8fe8c2010-06-30 08:09:57 +000011// CHECK: @"\01?i@@3PAY0BD@HA"
Charles Davis570d2762010-06-12 08:11:16 +000012
13int a;
Charles Davise60cea82010-06-11 03:07:32 +000014
15namespace N { int b; }
Charles Davis570d2762010-06-12 08:11:16 +000016
17static int c;
18int _c(void) {return c;}
Charles Davis65161d12010-06-16 05:33:16 +000019// CHECK: @"\01?_c@@YAHXZ"
Charles Davis570d2762010-06-12 08:11:16 +000020
Charles Davisb021f8b2010-06-14 05:29:01 +000021class foo {
22 static const short d;
23protected:
24 static volatile long e;
25public:
26 static const volatile char f;
Charles Davis21e2a7e2010-06-17 06:47:31 +000027 int operator+(int a);
Charles Davisb021f8b2010-06-14 05:29:01 +000028};
29
Charles Davisc62458f2010-06-18 07:51:00 +000030struct bar {
31 static int g;
32};
33
34union baz {
35 int a;
36 char b;
37 double c;
38};
39
40enum quux {
41 qone,
42 qtwo,
43 qthree
44};
45
Charles Davis0b8fe8c2010-06-30 08:09:57 +000046// NOTE: The calling convention is supposed to be __thiscall by default,
47// but that needs to be fixed in Sema/AST.
Charles Davis21e2a7e2010-06-17 06:47:31 +000048int foo::operator+(int a) {return a;}
49// CHECK: @"\01??Hfoo@@QAAHH@Z"
50
Charles Davisb021f8b2010-06-14 05:29:01 +000051const short foo::d = 0;
52volatile long foo::e;
53const volatile char foo::f = 'C';
54
Charles Davisc62458f2010-06-18 07:51:00 +000055int bar::g;
56
Charles Davis3a0d41d2010-06-26 03:50:05 +000057extern int * const h = &a;
58
Charles Davis0b8fe8c2010-06-30 08:09:57 +000059int i[10][20];
60
Charles Davis65161d12010-06-16 05:33:16 +000061// Static functions are mangled, too.
62// Also make sure calling conventions, arglists, and throw specs work.
63static void __stdcall alpha(float a, double b) throw() {}
64bool __fastcall beta(long long a, wchar_t b) throw(signed char, unsigned char) {
Charles Davis3a0d41d2010-06-26 03:50:05 +000065// CHECK: @"\01?beta@@YI_N_J_W@Z"
Charles Davis65161d12010-06-16 05:33:16 +000066 alpha(0.f, 0.0);
67 return false;
68}
69
Charles Davis3a0d41d2010-06-26 03:50:05 +000070// CHECK: @"\01?alpha@@YGXMN@Z"
Charles Davis65161d12010-06-16 05:33:16 +000071
Charles Davisc62458f2010-06-18 07:51:00 +000072// Make sure tag-type mangling works.
73void gamma(class foo, struct bar, union baz, enum quux) {}
74// CHECK: @"\01?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z"
75
Charles Davis3a0d41d2010-06-26 03:50:05 +000076// Make sure pointer/reference-type mangling works.
77void delta(int * const a, const long &) {}
78// CHECK: @"\01?delta@@YAXQAHABJ@Z"
Charles Davis0b8fe8c2010-06-30 08:09:57 +000079
80// Array mangling. (It should be mangled as a const pointer, but that needs
81// to be fixed in Sema.)
82void epsilon(int a[][10][20]) {}
Charles Davis4f0a3372010-07-03 02:41:45 +000083// CHECK: @"\01?epsilon@@YAXQAY19BD@H@Z"