• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s
2 // CHECK: _Z1fPA10_1X
3 // CHECK: _Z1fPFvE
4 
f(int x)5 int __attribute__((overloadable)) f(int x) { return x; }
f(float x)6 float __attribute__((overloadable)) f(float x) { return x; }
f(double x)7 double __attribute__((overloadable)) f(double x) { return x; }
f(double _Complex x)8 double _Complex __attribute__((overloadable)) f(double _Complex x) { return x; }
9 typedef short v4hi __attribute__ ((__vector_size__ (8)));
f(v4hi x)10 v4hi __attribute__((overloadable)) f(v4hi x) { return x; }
11 
12 struct X { };
f(struct X (* ptr)[10])13 void  __attribute__((overloadable)) f(struct X (*ptr)[10]) { }
14 
f(int x,int y,...)15 void __attribute__((overloadable)) f(int x, int y, ...) { }
16 
f(void (* x)())17 void __attribute__((overloadable)) f(void (*x)()) {}
18 
main()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
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
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
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