xref: /aosp_15_r20/external/clang/test/SemaObjCXX/arc-overloading.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fobjc-runtime-has-weak -fsyntax-only -fobjc-arc -verify -fblocks -Wno-objc-root-class %s
2*67e74705SXin Li
3*67e74705SXin Li// Simple ownership conversions + diagnostics.
4*67e74705SXin Liint &f0(id __strong const *); // expected-note{{candidate function not viable: 1st argument ('__weak id *') has __weak ownership, but parameter has __strong ownership}}
5*67e74705SXin Li
6*67e74705SXin Livoid test_f0() {
7*67e74705SXin Li  id __strong *sip;
8*67e74705SXin Li  id __strong const *csip;
9*67e74705SXin Li  id __weak *wip;
10*67e74705SXin Li  id __autoreleasing *aip;
11*67e74705SXin Li  id __unsafe_unretained *uip;
12*67e74705SXin Li
13*67e74705SXin Li  int &ir1 = f0(sip);
14*67e74705SXin Li  int &ir2 = f0(csip);
15*67e74705SXin Li  int &ir3 = f0(aip);
16*67e74705SXin Li  int &ir4 = f0(uip);
17*67e74705SXin Li  f0(wip); // expected-error{{no matching function for call to 'f0'}}
18*67e74705SXin Li}
19*67e74705SXin Li
20*67e74705SXin Li// Simple overloading
21*67e74705SXin Liint &f1(id __strong const *);
22*67e74705SXin Lifloat &f1(id __weak const *);
23*67e74705SXin Li
24*67e74705SXin Livoid test_f1() {
25*67e74705SXin Li  id __strong *sip;
26*67e74705SXin Li  id __strong const *csip;
27*67e74705SXin Li  id __weak *wip;
28*67e74705SXin Li  id __autoreleasing *aip;
29*67e74705SXin Li  id __unsafe_unretained *uip;
30*67e74705SXin Li
31*67e74705SXin Li  int &ir1 = f1(sip);
32*67e74705SXin Li  int &ir2 = f1(csip);
33*67e74705SXin Li  float &fr1 = f1(wip);
34*67e74705SXin Li  int &ir3 = f1(aip);
35*67e74705SXin Li  int &ir4 = f1(uip);
36*67e74705SXin Li}
37*67e74705SXin Li
38*67e74705SXin Li// Simple overloading
39*67e74705SXin Liint &f2(id __strong const *); // expected-note{{candidate function}}
40*67e74705SXin Lifloat &f2(id __autoreleasing const *); // expected-note{{candidate function}}
41*67e74705SXin Li
42*67e74705SXin Livoid test_f2() {
43*67e74705SXin Li  id __strong *sip;
44*67e74705SXin Li  id __strong const *csip;
45*67e74705SXin Li  id __weak *wip;
46*67e74705SXin Li  id __autoreleasing *aip;
47*67e74705SXin Li  id __unsafe_unretained *uip;
48*67e74705SXin Li
49*67e74705SXin Li  // Prefer non-ownership conversions to ownership conversions.
50*67e74705SXin Li  int &ir1 = f2(sip);
51*67e74705SXin Li  int &ir2 = f2(csip);
52*67e74705SXin Li  float &fr1 = f2(aip);
53*67e74705SXin Li
54*67e74705SXin Li  f2(uip); // expected-error{{call to 'f2' is ambiguous}}
55*67e74705SXin Li}
56*67e74705SXin Li
57*67e74705SXin Li// Writeback conversion
58*67e74705SXin Liint &f3(id __autoreleasing *); // expected-note{{candidate function not viable: 1st argument ('__unsafe_unretained id *') has __unsafe_unretained ownership, but parameter has __autoreleasing ownership}}
59*67e74705SXin Li
60*67e74705SXin Livoid test_f3() {
61*67e74705SXin Li  id __strong sip;
62*67e74705SXin Li  id __weak wip;
63*67e74705SXin Li  id __autoreleasing aip;
64*67e74705SXin Li  id __unsafe_unretained uip;
65*67e74705SXin Li
66*67e74705SXin Li  int &ir1 = f3(&sip);
67*67e74705SXin Li  int &ir2 = f3(&wip);
68*67e74705SXin Li  int &ir3 = f3(&aip);
69*67e74705SXin Li  f3(&uip); // expected-error{{no matching function for call to 'f3'}}
70*67e74705SXin Li}
71*67e74705SXin Li
72*67e74705SXin Li// Writeback conversion vs. no conversion
73*67e74705SXin Liint &f4(id __autoreleasing *);
74*67e74705SXin Lifloat &f4(id __strong *);
75*67e74705SXin Li
76*67e74705SXin Livoid test_f4() {
77*67e74705SXin Li  id __strong sip;
78*67e74705SXin Li  id __weak wip;
79*67e74705SXin Li  id __autoreleasing aip;
80*67e74705SXin Li  extern __weak id weak_global_ptr;
81*67e74705SXin Li
82*67e74705SXin Li  float &fr1 = f4(&sip);
83*67e74705SXin Li  int &ir1 = f4(&wip);
84*67e74705SXin Li  int &ir2 = f4(&aip);
85*67e74705SXin Li  int &ir3 = f4(&weak_global_ptr); // expected-error{{passing address of non-local object to __autoreleasing parameter for write-back}}
86*67e74705SXin Li}
87*67e74705SXin Li
88*67e74705SXin Li// Writeback conversion vs. other conversion.
89*67e74705SXin Liint &f5(id __autoreleasing *);
90*67e74705SXin Lifloat &f5(id const __unsafe_unretained *);
91*67e74705SXin Li
92*67e74705SXin Livoid test_f5() {
93*67e74705SXin Li  id __strong sip;
94*67e74705SXin Li  id __weak wip;
95*67e74705SXin Li  id __autoreleasing aip;
96*67e74705SXin Li
97*67e74705SXin Li  int &ir1 = f5(&wip);
98*67e74705SXin Li  float &fr1 = f5(&sip);
99*67e74705SXin Li  int &ir2 = f5(&aip);
100*67e74705SXin Li}
101*67e74705SXin Li
102*67e74705SXin Li@interface A
103*67e74705SXin Li@end
104*67e74705SXin Li
105*67e74705SXin Liint &f6(id __autoreleasing *);
106*67e74705SXin Lifloat &f6(id const __unsafe_unretained *);
107*67e74705SXin Li
108*67e74705SXin Livoid test_f6() {
109*67e74705SXin Li  A* __strong sip;
110*67e74705SXin Li  A* __weak wip;
111*67e74705SXin Li  A* __autoreleasing aip;
112*67e74705SXin Li
113*67e74705SXin Li  int &ir1 = f6(&wip);
114*67e74705SXin Li  float &fr1 = f6(&sip);
115*67e74705SXin Li  int &ir2 = f6(&aip);
116*67e74705SXin Li}
117*67e74705SXin Li
118*67e74705SXin Li// Reference binding
119*67e74705SXin Livoid f7(__strong id&); // expected-note{{candidate function not viable: 1st argument ('__weak id') has __weak ownership, but parameter has __strong ownership}} \
120*67e74705SXin Li // expected-note{{candidate function not viable: 1st argument ('__autoreleasing id') has __autoreleasing ownership, but parameter has __strong ownership}} \
121*67e74705SXin Li // expected-note{{candidate function not viable: 1st argument ('__unsafe_unretained id') has __unsafe_unretained ownership, but parameter has __strong ownership}}
122*67e74705SXin Li
123*67e74705SXin Livoid test_f7() {
124*67e74705SXin Li  __strong id strong_id;
125*67e74705SXin Li  __weak id weak_id;
126*67e74705SXin Li  __autoreleasing id autoreleasing_id;
127*67e74705SXin Li  __unsafe_unretained id unsafe_id;
128*67e74705SXin Li  f7(strong_id);
129*67e74705SXin Li  f7(weak_id); // expected-error{{no matching function for call to 'f7'}}
130*67e74705SXin Li  f7(autoreleasing_id); // expected-error{{no matching function for call to 'f7'}}
131*67e74705SXin Li  f7(unsafe_id); // expected-error{{no matching function for call to 'f7'}}
132*67e74705SXin Li}
133*67e74705SXin Li
134*67e74705SXin Livoid f8(const __strong id&);
135*67e74705SXin Li
136*67e74705SXin Livoid test_f8() {
137*67e74705SXin Li  __strong id strong_id;
138*67e74705SXin Li  __weak id weak_id;
139*67e74705SXin Li  __autoreleasing id autoreleasing_id;
140*67e74705SXin Li  __unsafe_unretained id unsafe_id;
141*67e74705SXin Li
142*67e74705SXin Li  f8(strong_id);
143*67e74705SXin Li  f8(weak_id);
144*67e74705SXin Li  f8(autoreleasing_id);
145*67e74705SXin Li  f8(unsafe_id);
146*67e74705SXin Li}
147*67e74705SXin Li
148*67e74705SXin Liint &f9(__strong id&);
149*67e74705SXin Lifloat &f9(const __autoreleasing id&);
150*67e74705SXin Li
151*67e74705SXin Livoid test_f9() {
152*67e74705SXin Li  __strong id strong_id;
153*67e74705SXin Li  __weak id weak_id;
154*67e74705SXin Li  __autoreleasing id autoreleasing_id;
155*67e74705SXin Li  __unsafe_unretained id unsafe_id;
156*67e74705SXin Li
157*67e74705SXin Li  int &ir1 = f9(strong_id);
158*67e74705SXin Li  float &fr1 = f9(autoreleasing_id);
159*67e74705SXin Li  float &fr2 = f9(unsafe_id);
160*67e74705SXin Li  float &fr2a = f9(weak_id);
161*67e74705SXin Li
162*67e74705SXin Li  __strong A *strong_a;
163*67e74705SXin Li  __weak A *weak_a;
164*67e74705SXin Li  __autoreleasing A *autoreleasing_a;
165*67e74705SXin Li  __unsafe_unretained A *unsafe_unretained_a;
166*67e74705SXin Li  float &fr3 = f9(strong_a);
167*67e74705SXin Li  float &fr4 = f9(autoreleasing_a);
168*67e74705SXin Li  float &fr5 = f9(unsafe_unretained_a);
169*67e74705SXin Li  float &fr6 = f9(weak_a);
170*67e74705SXin Li
171*67e74705SXin Li  const __autoreleasing id& ar1 = strong_a;
172*67e74705SXin Li  const __autoreleasing id& ar2 = autoreleasing_a;
173*67e74705SXin Li  const __autoreleasing id& ar3 = unsafe_unretained_a;
174*67e74705SXin Li  const __autoreleasing id& ar4 = weak_a;
175*67e74705SXin Li}
176*67e74705SXin Li
177*67e74705SXin Li// rdar://9790531
178*67e74705SXin Livoid f9790531(void *inClientData); // expected-note {{candidate function not viable: cannot implicitly convert argument of type 'MixerEQGraphTestDelegate *const __strong' to 'void *' for 1st argument under ARC}}
179*67e74705SXin Livoid f9790531_1(struct S*inClientData); // expected-note {{candidate function not viable}}
180*67e74705SXin Livoid f9790531_2(char * inClientData); // expected-note {{candidate function not viable}}
181*67e74705SXin Li
182*67e74705SXin Li@class UIApplication;
183*67e74705SXin Li
184*67e74705SXin Li@interface MixerEQGraphTestDelegate
185*67e74705SXin Li- (void)applicationDidFinishLaunching;
186*67e74705SXin Li@end
187*67e74705SXin Li
188*67e74705SXin Li@implementation MixerEQGraphTestDelegate
189*67e74705SXin Li- (void)applicationDidFinishLaunching {
190*67e74705SXin Li    f9790531(self); // expected-error {{no matching function for call to 'f9790531'}}
191*67e74705SXin Li    f9790531_1(self); // expected-error {{no matching function for call to 'f9790531_1'}}
192*67e74705SXin Li    f9790531_2(self); // expected-error {{no matching function for call to 'f9790531_2'}}
193*67e74705SXin Li}
194*67e74705SXin Li@end
195*67e74705SXin Li
196*67e74705SXin Liclass rdar10142572 {
197*67e74705SXin Li  id f() __attribute__((ns_returns_retained));
198*67e74705SXin Li  id g(); // expected-note{{previous declaration}}
199*67e74705SXin Li};
200*67e74705SXin Li
201*67e74705SXin Liid rdar10142572::f() { return 0; } // okay: merged down
202*67e74705SXin Liid __attribute__((ns_returns_retained)) rdar10142572::g() { return 0; } // expected-error{{function declared with the ns_returns_retained attribute was previously declared without the ns_returns_retained attribute}}
203