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