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 the ns_returns_retained attribute was previously declared without the ns_returns_retained attribute}} 203