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. 4int &f0(id __strong const *); // expected-note{{candidate function not viable: 1st argument ('__weak id *') has __weak ownership, but parameter has __strong ownership}} 5 6void 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 21int &f1(id __strong const *); 22float &f1(id __weak const *); 23 24void 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 39int &f2(id __strong const *); // expected-note{{candidate function}} 40float &f2(id __autoreleasing const *); // expected-note{{candidate function}} 41 42void 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 58int &f3(id __autoreleasing *); // expected-note{{candidate function not viable: 1st argument ('__unsafe_unretained id *') has __unsafe_unretained ownership, but parameter has __autoreleasing ownership}} 59 60void 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 73int &f4(id __autoreleasing *); 74float &f4(id __strong *); 75 76void 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. 89int &f5(id __autoreleasing *); 90float &f5(id const __unsafe_unretained *); 91 92void 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 105int &f6(id __autoreleasing *); 106float &f6(id const __unsafe_unretained *); 107 108void 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 119void 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 123void 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 134void f8(const __strong id&); 135 136void 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 148int &f9(__strong id&); 149float &f9(const __autoreleasing id&); 150 151void 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 178void 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}} 179void f9790531_1(struct S*inClientData); // expected-note {{candidate function not viable}} 180void 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 196class rdar10142572 { 197 id f() __attribute__((ns_returns_retained)); 198 id g(); // expected-note{{previous declaration}} 199}; 200 201id rdar10142572::f() { return 0; } // okay: merged down 202id __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