Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 -fms-extensions -fblocks -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s
      2 
      3 // CHECK: @"\01?a@@3HA"
      4 // CHECK: @"\01?b@N@@3HA"
      5 // CHECK: @c
      6 // CHECK: @"\01?d@foo@@0FB"
      7 // CHECK: @"\01?e@foo@@1JC"
      8 // CHECK: @"\01?f@foo@@2DD"
      9 // CHECK: @"\01?g@bar@@2HA"
     10 // CHECK: @"\01?h@@3QAHA"
     11 // CHECK: @"\01?i@@3PAY0BE@HA"
     12 // CHECK: @"\01?j@@3P6GHCE@ZA"
     13 // CHECK: @"\01?k@@3PTfoo@@DA"
     14 // CHECK: @"\01?l@@3P8foo@@AEHH@ZA"
     15 
     16 int a;
     17 
     18 namespace N { int b; }
     19 
     20 static int c;
     21 int _c(void) {return c;}
     22 // CHECK: @"\01?_c@@YAHXZ"
     23 
     24 class foo {
     25   static const short d;
     26 protected:
     27   static volatile long e;
     28 public:
     29   static const volatile char f;
     30   int operator+(int a);
     31 };
     32 
     33 struct bar {
     34   static int g;
     35 };
     36 
     37 union baz {
     38   int a;
     39   char b;
     40   double c;
     41 };
     42 
     43 enum quux {
     44   qone,
     45   qtwo,
     46   qthree
     47 };
     48 
     49 int foo::operator+(int a) {return a;}
     50 // CHECK: @"\01??Hfoo@@QAEHH@Z"
     51 
     52 const short foo::d = 0;
     53 volatile long foo::e;
     54 const volatile char foo::f = 'C';
     55 
     56 int bar::g;
     57 
     58 extern int * const h = &a;
     59 
     60 int i[10][20];
     61 
     62 int (__stdcall *j)(signed char, unsigned char);
     63 
     64 const volatile char foo::*k;
     65 
     66 int (foo::*l)(int);
     67 
     68 // Static functions are mangled, too.
     69 // Also make sure calling conventions, arglists, and throw specs work.
     70 static void __stdcall alpha(float a, double b) throw() {}
     71 bool __fastcall beta(long long a, wchar_t b) throw(signed char, unsigned char) {
     72 // CHECK: @"\01?beta@@YI_N_J_W@Z"
     73   alpha(0.f, 0.0);
     74   return false;
     75 }
     76 
     77 // CHECK: @"\01?alpha@@YGXMN@Z"
     78 
     79 // Make sure tag-type mangling works.
     80 void gamma(class foo, struct bar, union baz, enum quux) {}
     81 // CHECK: @"\01?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z"
     82 
     83 // Make sure pointer/reference-type mangling works.
     84 void delta(int * const a, const long &) {}
     85 // CHECK: @"\01?delta@@YAXQAHABJ@Z"
     86 
     87 // Array mangling.
     88 void epsilon(int a[][10][20]) {}
     89 // CHECK: @"\01?epsilon@@YAXQAY19BE@H@Z"
     90 
     91 // Blocks mangling (Clang extension).
     92 void zeta(int (^)(int, int)) {}
     93 // CHECK: @"\01?zeta@@YAXP_EAHHH@Z@Z"
     94 
     95