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 63 64 void ovl_bar(char *) __attribute__((overloadable)); 65 void ovl_bar(int) __attribute__((overloadable)); 66 67 // CHECK-LABEL: define void @bar 68 void bar() { 69 char charbuf[1]; 70 unsigned char ucharbuf[1]; 71 72 // CHECK: call void @_Z7ovl_barPc 73 ovl_bar(charbuf); 74 // CHECK: call void @_Z7ovl_barPc 75 ovl_bar(ucharbuf); 76 } 77 78 void ovl_baz(int *, int) __attribute__((overloadable)); 79 void ovl_baz(unsigned int *, unsigned int) __attribute__((overloadable)); 80 void ovl_baz2(int, int *) __attribute__((overloadable)); 81 void ovl_baz2(unsigned int, unsigned int *) __attribute__((overloadable)); 82 // CHECK-LABEL: define void @baz 83 void baz() { 84 unsigned int j; 85 // Initial rules for incompatible pointer conversions made this overload 86 // ambiguous. 87 // CHECK: call void @_Z7ovl_bazPjj 88 ovl_baz(&j, 0); 89 // CHECK: call void @_Z7ovl_bazPjj 90 ovl_baz(&j, 0u); 91 92 // CHECK: call void @_Z8ovl_baz2jPj 93 ovl_baz2(0, &j); 94 // CHECK: call void @_Z8ovl_baz2jPj 95 ovl_baz2(0u, &j); 96 } 97