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