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