blob: d0bd4a967dea641b31b08c2fda5bf2dbb4f01a69 [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 Davis570d2762010-06-12 08:11:16 +000011
12int a;
Charles Davise60cea82010-06-11 03:07:32 +000013
14namespace N { int b; }
Charles Davis570d2762010-06-12 08:11:16 +000015
16static int c;
17int _c(void) {return c;}
Charles Davis65161d12010-06-16 05:33:16 +000018// CHECK: @"\01?_c@@YAHXZ"
Charles Davis570d2762010-06-12 08:11:16 +000019
Charles Davisb021f8b2010-06-14 05:29:01 +000020class foo {
21 static const short d;
22protected:
23 static volatile long e;
24public:
25 static const volatile char f;
Charles Davis21e2a7e2010-06-17 06:47:31 +000026 int operator+(int a);
Charles Davisb021f8b2010-06-14 05:29:01 +000027};
28
Charles Davisc62458f2010-06-18 07:51:00 +000029struct bar {
30 static int g;
31};
32
33union baz {
34 int a;
35 char b;
36 double c;
37};
38
39enum quux {
40 qone,
41 qtwo,
42 qthree
43};
44
Charles Davis21e2a7e2010-06-17 06:47:31 +000045int foo::operator+(int a) {return a;}
46// CHECK: @"\01??Hfoo@@QAAHH@Z"
47
Charles Davisb021f8b2010-06-14 05:29:01 +000048const short foo::d = 0;
49volatile long foo::e;
50const volatile char foo::f = 'C';
51
Charles Davisc62458f2010-06-18 07:51:00 +000052int bar::g;
53
Charles Davis3a0d41d2010-06-26 03:50:05 +000054extern int * const h = &a;
55
Charles Davis65161d12010-06-16 05:33:16 +000056// Static functions are mangled, too.
57// Also make sure calling conventions, arglists, and throw specs work.
58static void __stdcall alpha(float a, double b) throw() {}
59bool __fastcall beta(long long a, wchar_t b) throw(signed char, unsigned char) {
Charles Davis3a0d41d2010-06-26 03:50:05 +000060// CHECK: @"\01?beta@@YI_N_J_W@Z"
Charles Davis65161d12010-06-16 05:33:16 +000061 alpha(0.f, 0.0);
62 return false;
63}
64
Charles Davis3a0d41d2010-06-26 03:50:05 +000065// CHECK: @"\01?alpha@@YGXMN@Z"
Charles Davis65161d12010-06-16 05:33:16 +000066
Charles Davisc62458f2010-06-18 07:51:00 +000067// Make sure tag-type mangling works.
68void gamma(class foo, struct bar, union baz, enum quux) {}
69// CHECK: @"\01?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z"
70
Charles Davis3a0d41d2010-06-26 03:50:05 +000071// Make sure pointer/reference-type mangling works.
72void delta(int * const a, const long &) {}
73// CHECK: @"\01?delta@@YAXQAHABJ@Z"