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