mangle-ms.cpp revision c62458f6aead5e4c0d0f4534d52142e7864ba02b
165161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis// RUN: %clang_cc1 -fms-extensions -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-apple-darwin10 | 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"
10570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davis
11570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davisint a;
12e60cea829b3bc45fcfedbfdb08cffb61f5bde79fCharles Davis
13e60cea829b3bc45fcfedbfdb08cffb61f5bde79fCharles Davisnamespace N { int b; }
14570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davis
15570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davisstatic int c;
16570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davisint _c(void) {return c;}
1765161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis// CHECK: @"\01?_c@@YAHXZ"
18570d2763bc9ee6c26b12c0b6316dd87261520bfeCharles Davis
19b021f8bd445959e2a5c958624a464ff621253ae4Charles Davisclass foo {
20b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis  static const short d;
21b021f8bd445959e2a5c958624a464ff621253ae4Charles Davisprotected:
22b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis  static volatile long e;
23b021f8bd445959e2a5c958624a464ff621253ae4Charles Davispublic:
24b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis  static const volatile char f;
2521e2a7e8d38120e358bead9e1f14ed526d37bc90Charles Davis  int operator+(int a);
26b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis};
27b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis
28c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davisstruct bar {
29c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis  static int g;
30c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis};
31c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis
32c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davisunion baz {
33c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis  int a;
34c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis  char b;
35c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis  double c;
36c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis};
37c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis
38c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davisenum quux {
39c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis  qone,
40c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis  qtwo,
41c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis  qthree
42c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis};
43c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis
4421e2a7e8d38120e358bead9e1f14ed526d37bc90Charles Davisint foo::operator+(int a) {return a;}
4521e2a7e8d38120e358bead9e1f14ed526d37bc90Charles Davis// CHECK: @"\01??Hfoo@@QAAHH@Z"
4621e2a7e8d38120e358bead9e1f14ed526d37bc90Charles Davis
47b021f8bd445959e2a5c958624a464ff621253ae4Charles Davisconst short foo::d = 0;
48b021f8bd445959e2a5c958624a464ff621253ae4Charles Davisvolatile long foo::e;
49b021f8bd445959e2a5c958624a464ff621253ae4Charles Davisconst volatile char foo::f = 'C';
50b021f8bd445959e2a5c958624a464ff621253ae4Charles Davis
51c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davisint bar::g;
52c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis
5365161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis// Static functions are mangled, too.
5465161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis// Also make sure calling conventions, arglists, and throw specs work.
5565161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davisstatic void __stdcall alpha(float a, double b) throw() {}
5665161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davisbool __fastcall beta(long long a, wchar_t b) throw(signed char, unsigned char) {
5765161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis// CHECK: @"\01?beta@@YI_N_J_W@CE@"
5865161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis  alpha(0.f, 0.0);
5965161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis  return false;
6065161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis}
6165161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis
6265161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis// CHECK: @"\01?alpha@@YGXMN@@"
6365161d17cbf8980e24643c65b74a5127dcb7ac22Charles Davis
64c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis// Make sure tag-type mangling works.
65c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davisvoid gamma(class foo, struct bar, union baz, enum quux) {}
66c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis// CHECK: @"\01?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z"
67c62458f6aead5e4c0d0f4534d52142e7864ba02bCharles Davis
68