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