xref: /aosp_15_r20/external/clang/test/SemaObjCXX/overload.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
2*67e74705SXin Li@interface Foo
3*67e74705SXin Li@end
4*67e74705SXin Li
5*67e74705SXin Li@implementation Foo
6*67e74705SXin Li
7*67e74705SXin Livoid func(id);
8*67e74705SXin Li
9*67e74705SXin Li+ zone {
10*67e74705SXin Li func(self);
11*67e74705SXin Li return self;
12*67e74705SXin Li}
13*67e74705SXin Li@end
14*67e74705SXin Li
15*67e74705SXin Li@protocol P0
16*67e74705SXin Li@end
17*67e74705SXin Li
18*67e74705SXin Li@protocol P1
19*67e74705SXin Li@end
20*67e74705SXin Li
21*67e74705SXin Li@interface A <P0>
22*67e74705SXin Li@end
23*67e74705SXin Li
24*67e74705SXin Li@interface B : A
25*67e74705SXin Li@end
26*67e74705SXin Li
27*67e74705SXin Li@interface C <P1>
28*67e74705SXin Li@end
29*67e74705SXin Li
30*67e74705SXin Liint& f(A*); // expected-note {{candidate}}
31*67e74705SXin Lifloat& f(B*); // expected-note {{candidate}}
32*67e74705SXin Livoid g(A*);
33*67e74705SXin Li
34*67e74705SXin Liint& h(A*);
35*67e74705SXin Lifloat& h(id);
36*67e74705SXin Li
37*67e74705SXin Livoid test0(A* a, B* b, id val) {
38*67e74705SXin Li  int& i1 = f(a);
39*67e74705SXin Li  float& f1 = f(b);
40*67e74705SXin Li
41*67e74705SXin Li  // GCC succeeds here, which is clearly ridiculous.
42*67e74705SXin Li  float& f2 = f(val); // expected-error {{ambiguous}}
43*67e74705SXin Li
44*67e74705SXin Li  g(a);
45*67e74705SXin Li  g(b);
46*67e74705SXin Li  g(val);
47*67e74705SXin Li  int& i2 = h(a);
48*67e74705SXin Li  float& f3 = h(val);
49*67e74705SXin Li
50*67e74705SXin Li  int& i3 = h(b);
51*67e74705SXin Li}
52*67e74705SXin Li
53*67e74705SXin Livoid test1(A* a) {
54*67e74705SXin Li  B* b = a; // expected-warning{{incompatible pointer types initializing 'B *' with an expression of type 'A *'}}
55*67e74705SXin Li  B *c; c = a; // expected-warning{{incompatible pointer types assigning to 'B *' from 'A *'}}
56*67e74705SXin Li}
57*67e74705SXin Li
58*67e74705SXin Livoid test2(A** ap) {
59*67e74705SXin Li  B** bp = ap; // expected-warning{{incompatible pointer types initializing 'B **' with an expression of type 'A **'}}
60*67e74705SXin Li  bp = ap; // expected-warning{{incompatible pointer types assigning to 'B **' from 'A **'}}
61*67e74705SXin Li}
62*67e74705SXin Li
63*67e74705SXin Liint& cv(A*);
64*67e74705SXin Lifloat& cv(const A*);
65*67e74705SXin Li
66*67e74705SXin Liint& cv2(void*);
67*67e74705SXin Lifloat& cv2(const void*);
68*67e74705SXin Li
69*67e74705SXin Livoid cv_test(A* a, B* b, const A* ac, const B* bc) {
70*67e74705SXin Li  int &i1 = cv(a);
71*67e74705SXin Li  int &i2 = cv(b);
72*67e74705SXin Li  float &f1 = cv(ac);
73*67e74705SXin Li  float &f2 = cv(bc);
74*67e74705SXin Li  int& i3 = cv2(a);
75*67e74705SXin Li  float& f3 = cv2(ac);
76*67e74705SXin Li}
77*67e74705SXin Li
78*67e74705SXin Liint& qualid(id<P0>);
79*67e74705SXin Lifloat& qualid(id<P1>);
80*67e74705SXin Li
81*67e74705SXin Livoid qualid_test(A *a, B *b, C *c) {
82*67e74705SXin Li  int& i1 = qualid(a);
83*67e74705SXin Li  int& i2 = qualid(b);
84*67e74705SXin Li
85*67e74705SXin Li  float& f1 = qualid(c);
86*67e74705SXin Li
87*67e74705SXin Li  id<P0> p1 = 0;
88*67e74705SXin Li  p1 = 0;
89*67e74705SXin Li}
90*67e74705SXin Li
91*67e74705SXin Li
92*67e74705SXin Li@class NSException;
93*67e74705SXin Litypedef struct {
94*67e74705SXin Li    void (*throw_exc)(id);
95*67e74705SXin Li}
96*67e74705SXin Liobjc_exception_functions_t;
97*67e74705SXin Li
98*67e74705SXin Livoid (*_NSExceptionRaiser(void))(NSException *) {
99*67e74705SXin Li    objc_exception_functions_t exc_funcs;
100*67e74705SXin Li    return exc_funcs.throw_exc; // expected-warning{{incompatible pointer types returning 'void (*)(id)' from a function with result type 'void (*)(NSException *)'}}
101*67e74705SXin Li}
102*67e74705SXin Li
103*67e74705SXin Linamespace test5 {
104*67e74705SXin Li  void foo(bool);
105*67e74705SXin Li  void foo(void *);
106*67e74705SXin Li
107*67e74705SXin Li  void test(id p) {
108*67e74705SXin Li    foo(p);
109*67e74705SXin Li  }
110*67e74705SXin Li}
111*67e74705SXin Li
112*67e74705SXin Li// rdar://problem/8592139
113*67e74705SXin Linamespace test6 {
114*67e74705SXin Li  void foo(id); // expected-note{{candidate function}}
115*67e74705SXin Li  void foo(A*) __attribute__((unavailable)); // expected-note {{explicitly made unavailable}}
116*67e74705SXin Li
117*67e74705SXin Li  void test(B *b) {
118*67e74705SXin Li    foo(b); // expected-error {{call to unavailable function 'foo'}}
119*67e74705SXin Li  }
120*67e74705SXin Li}
121*67e74705SXin Li
122*67e74705SXin Linamespace rdar8714395 {
123*67e74705SXin Li  int &f(const void*);
124*67e74705SXin Li  float &f(const Foo*);
125*67e74705SXin Li
126*67e74705SXin Li  int &f2(const void*);
127*67e74705SXin Li  float &f2(Foo const* const *);
128*67e74705SXin Li
129*67e74705SXin Li  int &f3(const void*);
130*67e74705SXin Li  float &f3(Foo const**);
131*67e74705SXin Li
132*67e74705SXin Li  void g(Foo *p) {
133*67e74705SXin Li    float &fr = f(p);
134*67e74705SXin Li    float &fr2 = f2(&p);
135*67e74705SXin Li    int &ir = f3(&p);
136*67e74705SXin Li  }
137*67e74705SXin Li
138*67e74705SXin Li
139*67e74705SXin Li}
140*67e74705SXin Li
141*67e74705SXin Linamespace rdar8734046 {
142*67e74705SXin Li  void f1(id);
143*67e74705SXin Li  void f2(id<P0>);
144*67e74705SXin Li  void g(const A *a) {
145*67e74705SXin Li    f1(a);
146*67e74705SXin Li    f2(a);
147*67e74705SXin Li  }
148*67e74705SXin Li}
149*67e74705SXin Li
150*67e74705SXin Linamespace PR9735 {
151*67e74705SXin Li  int &f3(const A*);
152*67e74705SXin Li  float &f3(const void*);
153*67e74705SXin Li
154*67e74705SXin Li  void test_f(B* b, const B* bc) {
155*67e74705SXin Li    int &ir1 = f3(b);
156*67e74705SXin Li    int &ir2 = f3(bc);
157*67e74705SXin Li  }
158*67e74705SXin Li}
159*67e74705SXin Li
160*67e74705SXin Li@interface D : B
161*67e74705SXin Li@end
162*67e74705SXin Li
163*67e74705SXin Linamespace rdar9327203 {
164*67e74705SXin Li  int &f(void* const&, int);
165*67e74705SXin Li  float &f(void* const&, long);
166*67e74705SXin Li
167*67e74705SXin Li  void g(id x) {
168*67e74705SXin Li    int &fr = (f)(x, 0);
169*67e74705SXin Li  }
170*67e74705SXin Li}
171*67e74705SXin Li
172*67e74705SXin Linamespace class_id {
173*67e74705SXin Li  // it's okay to overload Class with id.
174*67e74705SXin Li  void f(Class) { }
175*67e74705SXin Li  void f(id) { }
176*67e74705SXin Li}
177