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" 10a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov// CHECK: @"\01?h1@@3QAHA" 11a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov// CHECK: @"\01?h2@@3QBHB" 1208778269cfbf803fb216870060c60eb2adb25ef6Charles Davis// CHECK: @"\01?i@@3PAY0BE@HA" 131139da148e44193a71585f418be96ef9c5f6defaCharles Davis// CHECK: @"\01?j@@3P6GHCE@ZA" 14cd712cb5711b597bf3a2a67a4027e2238c8b9828Charles Davis// CHECK: @"\01?k@@3PTfoo@@DA" 15ee743f903858e337434ac0335f147f4de4ecae05Charles Davis// CHECK: @"\01?l@@3P8foo@@AEHH@ZA" 16c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith// CHECK: @"\01?color1@@3PANA" 17a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov// CHECK: @"\01?color2@@3QBNB" 18a5427447a3824fef36cf3c9136641b5756d20563Timur Iskhodzhanov 19a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov// FIXME: The following three tests currently fail, see http://llvm.org/PR13182 20a5427447a3824fef36cf3c9136641b5756d20563Timur Iskhodzhanov// Replace "CHECK-NOT" with "CHECK" when it is fixed. 211cc9be04bd57698d99899ca4a38a2028cb8460b1Timur Iskhodzhanov// CHECK-NOT: @"\01?color3@@3QAY02$$CBNA" 221cc9be04bd57698d99899ca4a38a2028cb8460b1Timur Iskhodzhanov// CHECK-NOT: @"\01?color4@@3QAY02$$CBNA" 23570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davis 24570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davisint a; 25e60cea829b3bc45fcfedbfdb08cffb61f5bde79fCharles Davis 26e60cea829b3bc45fcfedbfdb08cffb61f5bde79fCharles Davisnamespace N { int b; } 27570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davis 28570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davisstatic int c; 29570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davisint _c(void) {return c;} 3065161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis// CHECK: @"\01?_c@@YAHXZ" 31570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davis 32b021f8bd445959e2a5c958624a464ff621253ae4Charles Davisclass foo { 33b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis static const short d; 34b021f8bd445959e2a5c958624a464ff621253ae4Charles Davisprotected: 35b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis static volatile long e; 36b021f8bd445959e2a5c958624a464ff621253ae4Charles Davispublic: 37b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis static const volatile char f; 3821e2a7e8d38120e358bead9e1f14ed526d37bc90Charles Davis int operator+(int a); 3950118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer foo(){} 4050118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer//CHECK: @"\01??0foo@@QAE@XZ" 4150118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer 4250118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer ~foo(){} 4350118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer//CHECK: @"\01??1foo@@QAE@XZ" 4450118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer 4550118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer foo(int i){} 4650118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer//CHECK: @"\01??0foo@@QAE@H@Z" 4750118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer 4850118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer foo(char *q){} 4950118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer//CHECK: @"\01??0foo@@QAE@PAD@Z" 50df438046c0e2ae38045c01a5becea64df2b1bf73Timur Iskhodzhanov 51df438046c0e2ae38045c01a5becea64df2b1bf73Timur Iskhodzhanov static foo* static_method() { return 0; } 52df438046c0e2ae38045c01a5becea64df2b1bf73Timur Iskhodzhanov 5350118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer}f,s1(1),s2((char*)0); 54b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis 55c0838d2acb498b0491908d3693514dfec5befe6fRichard Smithtypedef foo (foo2); 56c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith 57c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davisstruct bar { 58c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis static int g; 59c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis}; 60c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis 61c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davisunion baz { 62c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis int a; 63c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis char b; 64c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis double c; 65c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis}; 66c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis 67c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davisenum quux { 68c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis qone, 69c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis qtwo, 70c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis qthree 71c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis}; 72c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis 73df438046c0e2ae38045c01a5becea64df2b1bf73Timur Iskhodzhanovfoo bar() { return foo(); } 74df438046c0e2ae38045c01a5becea64df2b1bf73Timur Iskhodzhanov//CHECK: @"\01?bar@@YA?AVfoo@@XZ" 75df438046c0e2ae38045c01a5becea64df2b1bf73Timur Iskhodzhanov 76df438046c0e2ae38045c01a5becea64df2b1bf73Timur Iskhodzhanovint foo::operator+(int a) { 77df438046c0e2ae38045c01a5becea64df2b1bf73Timur Iskhodzhanov//CHECK: @"\01??Hfoo@@QAEHH@Z" 78df438046c0e2ae38045c01a5becea64df2b1bf73Timur Iskhodzhanov 79df438046c0e2ae38045c01a5becea64df2b1bf73Timur Iskhodzhanov foo::static_method(); 80df438046c0e2ae38045c01a5becea64df2b1bf73Timur Iskhodzhanov//CHECK: @"\01?static_method@foo@@SAPAV1@XZ" 81df438046c0e2ae38045c01a5becea64df2b1bf73Timur Iskhodzhanov bar(); 82df438046c0e2ae38045c01a5becea64df2b1bf73Timur Iskhodzhanov return a; 83df438046c0e2ae38045c01a5becea64df2b1bf73Timur Iskhodzhanov} 8421e2a7e8d38120e358bead9e1f14ed526d37bc90Charles Davis 85b021f8bd445959e2a5c958624a464ff621253ae4Charles Davisconst short foo::d = 0; 86b021f8bd445959e2a5c958624a464ff621253ae4Charles Davisvolatile long foo::e; 87b021f8bd445959e2a5c958624a464ff621253ae4Charles Davisconst volatile char foo::f = 'C'; 88b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis 89c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davisint bar::g; 90c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis 91a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanovextern int * const h1 = &a; 92a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanovextern const int * const h2 = &a; 933a0d41d29192ff42870310e33800939f4e34bb55Charles Davis 940b8fe8c68eb503b9955f13c0c27b18b1f8321158Charles Davisint i[10][20]; 950b8fe8c68eb503b9955f13c0c27b18b1f8321158Charles Davis 961139da148e44193a71585f418be96ef9c5f6defaCharles Davisint (__stdcall *j)(signed char, unsigned char); 971139da148e44193a71585f418be96ef9c5f6defaCharles Davis 98c0838d2acb498b0491908d3693514dfec5befe6fRichard Smithconst volatile char foo2::*k; 99cd712cb5711b597bf3a2a67a4027e2238c8b9828Charles Davis 100c0838d2acb498b0491908d3693514dfec5befe6fRichard Smithint (foo2::*l)(int); 101cd712cb5711b597bf3a2a67a4027e2238c8b9828Charles Davis 10265161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis// Static functions are mangled, too. 10365161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis// Also make sure calling conventions, arglists, and throw specs work. 10465161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davisstatic void __stdcall alpha(float a, double b) throw() {} 10565161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davisbool __fastcall beta(long long a, wchar_t b) throw(signed char, unsigned char) { 1063a0d41d29192ff42870310e33800939f4e34bb55Charles Davis// CHECK: @"\01?beta@@YI_N_J_W@Z" 10765161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis alpha(0.f, 0.0); 10865161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis return false; 10965161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis} 11065161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis 1113a0d41d29192ff42870310e33800939f4e34bb55Charles Davis// CHECK: @"\01?alpha@@YGXMN@Z" 11265161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis 113c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis// Make sure tag-type mangling works. 114c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davisvoid gamma(class foo, struct bar, union baz, enum quux) {} 115c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis// CHECK: @"\01?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z" 116c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis 1173a0d41d29192ff42870310e33800939f4e34bb55Charles Davis// Make sure pointer/reference-type mangling works. 1183a0d41d29192ff42870310e33800939f4e34bb55Charles Davisvoid delta(int * const a, const long &) {} 1193a0d41d29192ff42870310e33800939f4e34bb55Charles Davis// CHECK: @"\01?delta@@YAXQAHABJ@Z" 1200b8fe8c68eb503b9955f13c0c27b18b1f8321158Charles Davis 1214d254836f4a6a03fb3c77d0636c3cb5475540eb0Charles Davis// Array mangling. 1220b8fe8c68eb503b9955f13c0c27b18b1f8321158Charles Davisvoid epsilon(int a[][10][20]) {} 12308778269cfbf803fb216870060c60eb2adb25ef6Charles Davis// CHECK: @"\01?epsilon@@YAXQAY19BE@H@Z" 1244d254836f4a6a03fb3c77d0636c3cb5475540eb0Charles Davis 125bae11d8f82378f3b5ffcc994d8b107c9fbec6c4eTimur Iskhodzhanovvoid zeta(int (*)(int, int)) {} 126bae11d8f82378f3b5ffcc994d8b107c9fbec6c4eTimur Iskhodzhanov// CHECK: @"\01?zeta@@YAXP6AHHH@Z@Z" 127bae11d8f82378f3b5ffcc994d8b107c9fbec6c4eTimur Iskhodzhanov 128bae11d8f82378f3b5ffcc994d8b107c9fbec6c4eTimur Iskhodzhanov// Blocks mangling (Clang extension). A block should be mangled slightly 129bae11d8f82378f3b5ffcc994d8b107c9fbec6c4eTimur Iskhodzhanov// differently from a similar function pointer. 130bae11d8f82378f3b5ffcc994d8b107c9fbec6c4eTimur Iskhodzhanovvoid eta(int (^)(int, int)) {} 131bae11d8f82378f3b5ffcc994d8b107c9fbec6c4eTimur Iskhodzhanov// CHECK: @"\01?eta@@YAXP_EAHHH@Z@Z" 1324d254836f4a6a03fb3c77d0636c3cb5475540eb0Charles Davis 1332612e9f1d0a356a303097bea9faf53fdb213c50cJohn McCalltypedef int theta_arg(int,int); 1342612e9f1d0a356a303097bea9faf53fdb213c50cJohn McCallvoid theta(theta_arg^ block) {} 1352612e9f1d0a356a303097bea9faf53fdb213c50cJohn McCall// CHECK: @"\01?theta@@YAXP_EAHHH@Z@Z" 1362612e9f1d0a356a303097bea9faf53fdb213c50cJohn McCall 1373a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCallvoid operator_new_delete() { 1383a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall char *ptr = new char; 1393a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall// CHECK: @"\01??2@YAPAXI@Z" 1403a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall 1413a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall delete ptr; 1423a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall// CHECK: @"\01??3@YAXPAX@Z" 1433a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall 1443a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall char *array = new char[42]; 1453a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall// CHECK: @"\01??_U@YAPAXI@Z" 1463a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall 147e2b45e2a43ae46bc00026b63ba7c04ef2b78c3ffJohn McCall delete [] array; 148e2b45e2a43ae46bc00026b63ba7c04ef2b78c3ffJohn McCall// CHECK: @"\01??_V@YAXPAX@Z" 1493a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall} 150bd1d18ecc420838b7ba620c0a2c5d2a86cac371dRichard Smith 151bd1d18ecc420838b7ba620c0a2c5d2a86cac371dRichard Smith// PR13022 152bd1d18ecc420838b7ba620c0a2c5d2a86cac371dRichard Smithvoid (redundant_parens)(); 153bd1d18ecc420838b7ba620c0a2c5d2a86cac371dRichard Smithvoid redundant_parens_use() { redundant_parens(); } 154bd1d18ecc420838b7ba620c0a2c5d2a86cac371dRichard Smith// CHECK: @"\01?redundant_parens@@YAXXZ" 155c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith 156a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov// PR13047 157c0838d2acb498b0491908d3693514dfec5befe6fRichard Smithtypedef double RGB[3]; 158c0838d2acb498b0491908d3693514dfec5befe6fRichard SmithRGB color1; 159c0838d2acb498b0491908d3693514dfec5befe6fRichard Smithextern const RGB color2 = {}; 160a5427447a3824fef36cf3c9136641b5756d20563Timur Iskhodzhanovextern RGB const color3[5] = {}; 161a5427447a3824fef36cf3c9136641b5756d20563Timur Iskhodzhanovextern RGB const ((color4)[5]) = {}; 16206e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith 16306e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith// PR12603 16406e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smithenum E {}; 16506e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith// CHECK: "\01?fooE@@YA?AW4E@@XZ" 16606e767d6703fdae9cda21c6c96c79a0135e2567aRichard SmithE fooE() { return E(); } 16706e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith 16806e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smithclass X {}; 16906e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith// CHECK: "\01?fooX@@YA?AVX@@XZ" 17006e767d6703fdae9cda21c6c96c79a0135e2567aRichard SmithX fooX() { return X(); } 171a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov 172a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanovnamespace PR13182 { 173a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov extern char s0[]; 174a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov // CHECK: @"\01?s0@PR13182@@3PADA" 175a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov extern char s1[42]; 176a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov // CHECK: @"\01?s1@PR13182@@3PADA" 177a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov extern const char s2[]; 178a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov // CHECK: @"\01?s2@PR13182@@3QBDB" 179a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov extern const char s3[42]; 180a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov // CHECK: @"\01?s3@PR13182@@3QBDB" 181a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov extern volatile char s4[]; 182a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov // CHECK: @"\01?s4@PR13182@@3RCDC" 183a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov extern const volatile char s5[]; 184a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov // CHECK: @"\01?s5@PR13182@@3SDDD" 185a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov extern const char* const* s6; 186a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov // CHECK: @"\01?s6@PR13182@@3PBQBDB" 187a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov 188a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov char foo() { 189a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov return s0[0] + s1[0] + s2[0] + s3[0] + s4[0] + s5[0] + s6[0][0]; 190a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov } 191a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov} 192