]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/SemaObjCXX/arc-overloading.mm
Vendor import of clang release_30 branch r142614:
[FreeBSD/FreeBSD.git] / test / SemaObjCXX / arc-overloading.mm
1 // RUN: %clang_cc1 -fobjc-runtime-has-weak -fsyntax-only -fobjc-arc -verify -fblocks %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 the ns_returns_retained attribute was previously declared without the ns_returns_retained attribute}}