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?h1@@3QAHA"
     11 // CHECK: @"\01?h2@@3QBHB"
     12 // CHECK: @"\01?i@@3PAY0BE@HA"
     13 // CHECK: @"\01?j@@3P6GHCE@ZA"
     14 // CHECK: @"\01?k@@3PTfoo@@DA"
     15 // CHECK: @"\01?l@@3P8foo@@AEHH@ZA"
     16 // CHECK: @"\01?color1@@3PANA"
     17 // CHECK: @"\01?color2@@3QBNB"
     18 
     19 // FIXME: The following three tests currently fail, see http://llvm.org/PR13182
     20 // Replace "CHECK-NOT" with "CHECK" when it is fixed.
     21 // CHECK-NOT: @"\01?color3@@3QAY02$$CBNA"
     22 // CHECK-NOT: @"\01?color4@@3QAY02$$CBNA"
     23 
     24 int a;
     25 
     26 namespace N { int b; }
     27 
     28 static int c;
     29 int _c(void) {return c;}
     30 // CHECK: @"\01?_c@@YAHXZ"
     31 
     32 class foo {
     33   static const short d;
     34 protected:
     35   static volatile long e;
     36 public:
     37   static const volatile char f;
     38   int operator+(int a);
     39   foo(){}
     40 //CHECK: @"\01??0foo@@QAE@XZ"
     41 
     42   ~foo(){}
     43 //CHECK: @"\01??1foo@@QAE@XZ"
     44 
     45   foo(int i){}
     46 //CHECK: @"\01??0foo@@QAE@H@Z"
     47 
     48   foo(char *q){}
     49 //CHECK: @"\01??0foo@@QAE@PAD@Z"
     50 
     51   static foo* static_method() { return 0; }
     52 
     53 }f,s1(1),s2((char*)0);
     54 
     55 typedef foo (foo2);
     56 
     57 struct bar {
     58   static int g;
     59 };
     60 
     61 union baz {
     62   int a;
     63   char b;
     64   double c;
     65 };
     66 
     67 enum quux {
     68   qone,
     69   qtwo,
     70   qthree
     71 };
     72 
     73 foo bar() { return foo(); }
     74 //CHECK: @"\01?bar@@YA?AVfoo@@XZ"
     75 
     76 int foo::operator+(int a) {
     77 //CHECK: @"\01??Hfoo@@QAEHH@Z"
     78 
     79   foo::static_method();
     80 //CHECK: @"\01?static_method@foo@@SAPAV1@XZ"
     81   bar();
     82   return a;
     83 }
     84 
     85 const short foo::d = 0;
     86 volatile long foo::e;
     87 const volatile char foo::f = 'C';
     88 
     89 int bar::g;
     90 
     91 extern int * const h1 = &a;
     92 extern const int * const h2 = &a;
     93 
     94 int i[10][20];
     95 
     96 int (__stdcall *j)(signed char, unsigned char);
     97 
     98 const volatile char foo2::*k;
     99 
    100 int (foo2::*l)(int);
    101 
    102 // Static functions are mangled, too.
    103 // Also make sure calling conventions, arglists, and throw specs work.
    104 static void __stdcall alpha(float a, double b) throw() {}
    105 bool __fastcall beta(long long a, wchar_t b) throw(signed char, unsigned char) {
    106 // CHECK: @"\01?beta@@YI_N_J_W@Z"
    107   alpha(0.f, 0.0);
    108   return false;
    109 }
    110 
    111 // CHECK: @"\01?alpha@@YGXMN@Z"
    112 
    113 // Make sure tag-type mangling works.
    114 void gamma(class foo, struct bar, union baz, enum quux) {}
    115 // CHECK: @"\01?gamma@@YAXVfoo@@Ubar@@Tbaz@@W4quux@@@Z"
    116 
    117 // Make sure pointer/reference-type mangling works.
    118 void delta(int * const a, const long &) {}
    119 // CHECK: @"\01?delta@@YAXQAHABJ@Z"
    120 
    121 // Array mangling.
    122 void epsilon(int a[][10][20]) {}
    123 // CHECK: @"\01?epsilon@@YAXQAY19BE@H@Z"
    124 
    125 void zeta(int (*)(int, int)) {}
    126 // CHECK: @"\01?zeta@@YAXP6AHHH@Z@Z"
    127 
    128 // Blocks mangling (Clang extension). A block should be mangled slightly
    129 // differently from a similar function pointer.
    130 void eta(int (^)(int, int)) {}
    131 // CHECK: @"\01?eta@@YAXP_EAHHH@Z@Z"
    132 
    133 typedef int theta_arg(int,int);
    134 void theta(theta_arg^ block) {}
    135 // CHECK: @"\01?theta@@YAXP_EAHHH@Z@Z"
    136 
    137 void operator_new_delete() {
    138   char *ptr = new char;
    139 // CHECK: @"\01??2@YAPAXI@Z"
    140 
    141   delete ptr;
    142 // CHECK: @"\01??3@YAXPAX@Z"
    143 
    144   char *array = new char[42];
    145 // CHECK: @"\01??_U@YAPAXI@Z"
    146 
    147   delete [] array;
    148 // CHECK: @"\01??_V@YAXPAX@Z"
    149 }
    150 
    151 // PR13022
    152 void (redundant_parens)();
    153 void redundant_parens_use() { redundant_parens(); }
    154 // CHECK: @"\01?redundant_parens@@YAXXZ"
    155 
    156 // PR13047
    157 typedef double RGB[3];
    158 RGB color1;
    159 extern const RGB color2 = {};
    160 extern RGB const color3[5] = {};
    161 extern RGB const ((color4)[5]) = {};
    162 
    163 // PR12603
    164 enum E {};
    165 // CHECK: "\01?fooE@@YA?AW4E@@XZ"
    166 E fooE() { return E(); }
    167 
    168 class X {};
    169 // CHECK: "\01?fooX@@YA?AVX@@XZ"
    170 X fooX() { return X(); }
    171 
    172 namespace PR13182 {
    173   extern char s0[];
    174   // CHECK: @"\01?s0@PR13182@@3PADA"
    175   extern char s1[42];
    176   // CHECK: @"\01?s1@PR13182@@3PADA"
    177   extern const char s2[];
    178   // CHECK: @"\01?s2@PR13182@@3QBDB"
    179   extern const char s3[42];
    180   // CHECK: @"\01?s3@PR13182@@3QBDB"
    181   extern volatile char s4[];
    182   // CHECK: @"\01?s4@PR13182@@3RCDC"
    183   extern const volatile char s5[];
    184   // CHECK: @"\01?s5@PR13182@@3SDDD"
    185   extern const char* const* s6;
    186   // CHECK: @"\01?s6@PR13182@@3PBQBDB"
    187 
    188   char foo() {
    189     return s0[0] + s1[0] + s2[0] + s3[0] + s4[0] + s5[0] + s6[0][0];
    190   }
    191 }
    192