Home | History | Annotate | Download | only in CodeGen
      1 // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s
      2 // CHECK: _Z1fPA10_1X
      3 // CHECK: _Z1fPFvE
      4 
      5 int __attribute__((overloadable)) f(int x) { return x; }
      6 float __attribute__((overloadable)) f(float x) { return x; }
      7 double __attribute__((overloadable)) f(double x) { return x; }
      8 double _Complex __attribute__((overloadable)) f(double _Complex x) { return x; }
      9 typedef short v4hi __attribute__ ((__vector_size__ (8)));
     10 v4hi __attribute__((overloadable)) f(v4hi x) { return x; }
     11 
     12 struct X { };
     13 void  __attribute__((overloadable)) f(struct X (*ptr)[10]) { }
     14 
     15 void __attribute__((overloadable)) f(int x, int y, ...) { }
     16 
     17 void __attribute__((overloadable)) f(void (*x)()) {}
     18 
     19 int main() {
     20   int iv = 17;
     21   float fv = 3.0f;
     22   double dv = 4.0;
     23   double _Complex cdv;
     24   v4hi vv;
     25 
     26   iv = f(iv);
     27   fv = f(fv);
     28   dv = f(dv);
     29   cdv = f(cdv);
     30   vv = f(vv);
     31 }
     32 
     33 // Ensuring that we pick the correct function for taking the address of an
     34 // overload when conversions are involved.
     35 
     36 void addrof_many(int *a) __attribute__((overloadable, enable_if(0, "")));
     37 void addrof_many(void *a) __attribute__((overloadable));
     38 void addrof_many(char *a) __attribute__((overloadable));
     39 
     40 void addrof_single(int *a) __attribute__((overloadable, enable_if(0, "")));
     41 void addrof_single(char *a) __attribute__((overloadable, enable_if(0, "")));
     42 void addrof_single(char *a) __attribute__((overloadable));
     43 
     44 // CHECK-LABEL: define void @foo
     45 void foo() {
     46   // CHECK: store void (i8*)* @_Z11addrof_manyPc
     47   void (*p1)(char *) = &addrof_many;
     48   // CHECK: store void (i8*)* @_Z11addrof_manyPv
     49   void (*p2)(void *) = &addrof_many;
     50   // CHECK: void (i8*)* @_Z11addrof_manyPc
     51   void *vp1 = (void (*)(char *)) & addrof_many;
     52   // CHECK: void (i8*)* @_Z11addrof_manyPv
     53   void *vp2 = (void (*)(void *)) & addrof_many;
     54 
     55   // CHECK: store void (i8*)* @_Z13addrof_singlePc
     56   void (*p3)(char *) = &addrof_single;
     57   // CHECK: @_Z13addrof_singlePc
     58   void (*p4)(int *) = &addrof_single;
     59   // CHECK: @_Z13addrof_singlePc
     60   void *vp3 = &addrof_single;
     61 }
     62