mangle-ms.cpp revision 50118da99d3c04eb14747cfdc44a9e1d56432aea
1ee743f903858e337434ac0335f147f4de4ecae05Charles Davis// RUN: %clang_cc1 -fms-extensions -fblocks -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s
2e60cea829b3bc45fcfedbfdb08cffb61f5bde79fCharles Davis
3b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis// CHECK: @"\01?a@@3HA"
4b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis// CHECK: @"\01?b@N@@3HA"
5570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davis// CHECK: @c
6b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis// CHECK: @"\01?d@foo@@0FB"
7b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis// CHECK: @"\01?e@foo@@1JC"
8b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis// CHECK: @"\01?f@foo@@2DD"
9c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis// CHECK: @"\01?g@bar@@2HA"
103a0d41d29192ff42870310e33800939f4e34bb55Charles Davis// CHECK: @"\01?h@@3QAHA"
1108778269cfbf803fb216870060c60eb2adb25ef6Charles Davis// CHECK: @"\01?i@@3PAY0BE@HA"
121139da148e44193a71585f418be96ef9c5f6defaCharles Davis// CHECK: @"\01?j@@3P6GHCE@ZA"
13cd712cb5711b597bf3a2a67a4027e2238c8b9828Charles Davis// CHECK: @"\01?k@@3PTfoo@@DA"
14ee743f903858e337434ac0335f147f4de4ecae05Charles Davis// CHECK: @"\01?l@@3P8foo@@AEHH@ZA"
15570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davis
16570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davisint a;
17e60cea829b3bc45fcfedbfdb08cffb61f5bde79fCharles Davis
18e60cea829b3bc45fcfedbfdb08cffb61f5bde79fCharles Davisnamespace N { int b; }
19570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davis
20570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davisstatic int c;
21570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davisint _c(void) {return c;}
2265161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis// CHECK: @"\01?_c@@YAHXZ"
23570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davis
24b021f8bd445959e2a5c958624a464ff621253ae4Charles Davisclass foo {
25b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis  static const short d;
26b021f8bd445959e2a5c958624a464ff621253ae4Charles Davisprotected:
27b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis  static volatile long e;
28b021f8bd445959e2a5c958624a464ff621253ae4Charles Davispublic:
29b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis  static const volatile char f;
3021e2a7e8d38120e358bead9e1f14ed526d37bc90Charles Davis  int operator+(int a);
3150118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  foo(){}
3250118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer//CHECK: @"\01??0foo@@QAE@XZ"
3350118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer
3450118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  ~foo(){}
3550118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer//CHECK: @"\01??1foo@@QAE@XZ"
3650118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer
3750118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  foo(int i){}
3850118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer//CHECK: @"\01??0foo@@QAE@H@Z"
3950118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer
4050118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  foo(char *q){}
4150118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer//CHECK: @"\01??0foo@@QAE@PAD@Z"
4250118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer}f,s1(1),s2((char*)0);
43b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis
44c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davisstruct bar {
45c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis  static int g;
46c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis};
47c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis
48c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davisunion baz {
49c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis  int a;
50c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis  char b;
51c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis  double c;
52c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis};
53c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis
54c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davisenum quux {
55c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis  qone,
56c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis  qtwo,
57c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis  qthree
58c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis};
59c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis
6021e2a7e8d38120e358bead9e1f14ed526d37bc90Charles Davisint foo::operator+(int a) {return a;}
61ee743f903858e337434ac0335f147f4de4ecae05Charles Davis// CHECK: @"\01??Hfoo@@QAEHH@Z"
6221e2a7e8d38120e358bead9e1f14ed526d37bc90Charles Davis
63b021f8bd445959e2a5c958624a464ff621253ae4Charles Davisconst short foo::d = 0;
64b021f8bd445959e2a5c958624a464ff621253ae4Charles Davisvolatile long foo::e;
65b021f8bd445959e2a5c958624a464ff621253ae4Charles Davisconst volatile char foo::f = 'C';
66b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis
67c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davisint bar::g;
68c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis
693a0d41d29192ff42870310e33800939f4e34bb55Charles Davisextern int * const h = &a;
703a0d41d29192ff42870310e33800939f4e34bb55Charles Davis
710b8fe8c68eb503b9955f13c0c27b18b1f8321158Charles Davisint i[10][20];
720b8fe8c68eb503b9955f13c0c27b18b1f8321158Charles Davis
731139da148e44193a71585f418be96ef9c5f6defaCharles Davisint (__stdcall *j)(signed char, unsigned char);
741139da148e44193a71585f418be96ef9c5f6defaCharles Davis
75cd712cb5711b597bf3a2a67a4027e2238c8b9828Charles Davisconst volatile char foo::*k;
76cd712cb5711b597bf3a2a67a4027e2238c8b9828Charles Davis
77cd712cb5711b597bf3a2a67a4027e2238c8b9828Charles Davisint (foo::*l)(int);
78cd712cb5711b597bf3a2a67a4027e2238c8b9828Charles Davis
7965161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis// Static functions are mangled, too.
8065161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis// Also make sure calling conventions, arglists, and throw specs work.
8165161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davisstatic void __stdcall alpha(float a, double b) throw() {}
8265161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davisbool __fastcall beta(long long a, wchar_t b) throw(signed char, unsigned char) {
833a0d41d29192ff42870310e33800939f4e34bb55Charles Davis// CHECK: @"\01?beta@@YI_N_J_W@Z"
8465161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis  alpha(0.f, 0.0);
8565161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis  return false;
8665161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis}
8765161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis
883a0d41d29192ff42870310e33800939f4e34bb55Charles Davis// CHECK: @"\01?alpha@@YGXMN@Z"
8965161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis
90c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis// Make sure tag-type mangling works.
91c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davisvoid gamma(class foo, struct bar, union baz, enum quux) {}
92c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis// CHECK: @"\01?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z"
93c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis
943a0d41d29192ff42870310e33800939f4e34bb55Charles Davis// Make sure pointer/reference-type mangling works.
953a0d41d29192ff42870310e33800939f4e34bb55Charles Davisvoid delta(int * const a, const long &) {}
963a0d41d29192ff42870310e33800939f4e34bb55Charles Davis// CHECK: @"\01?delta@@YAXQAHABJ@Z"
970b8fe8c68eb503b9955f13c0c27b18b1f8321158Charles Davis
984d254836f4a6a03fb3c77d0636c3cb5475540eb0Charles Davis// Array mangling.
990b8fe8c68eb503b9955f13c0c27b18b1f8321158Charles Davisvoid epsilon(int a[][10][20]) {}
10008778269cfbf803fb216870060c60eb2adb25ef6Charles Davis// CHECK: @"\01?epsilon@@YAXQAY19BE@H@Z"
1014d254836f4a6a03fb3c77d0636c3cb5475540eb0Charles Davis
1024d254836f4a6a03fb3c77d0636c3cb5475540eb0Charles Davis// Blocks mangling (Clang extension).
1034d254836f4a6a03fb3c77d0636c3cb5475540eb0Charles Davisvoid zeta(int (^)(int, int)) {}
1044d254836f4a6a03fb3c77d0636c3cb5475540eb0Charles Davis// CHECK: @"\01?zeta@@YAXP_EAHHH@Z@Z"
1054d254836f4a6a03fb3c77d0636c3cb5475540eb0Charles Davis
106