| 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 {{(dso_local )?}}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 {{(dso_local )?}}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 {{(dso_local )?}}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 | |