// RUN: %clang_cc1 -fobjc-runtime-has-weak -fsyntax-only -fobjc-arc -verify -fblocks -Wno-objc-root-class %s // Simple ownership conversions + diagnostics. int &f0(id __strong const *); // expected-note{{candidate function not viable: 1st argument ('__weak id *') has __weak ownership, but parameter has __strong ownership}} void test_f0() { id __strong *sip; id __strong const *csip; id __weak *wip; id __autoreleasing *aip; id __unsafe_unretained *uip; int &ir1 = f0(sip); int &ir2 = f0(csip); int &ir3 = f0(aip); int &ir4 = f0(uip); f0(wip); // expected-error{{no matching function for call to 'f0'}} } // Simple overloading int &f1(id __strong const *); float &f1(id __weak const *); void test_f1() { id __strong *sip; id __strong const *csip; id __weak *wip; id __autoreleasing *aip; id __unsafe_unretained *uip; int &ir1 = f1(sip); int &ir2 = f1(csip); float &fr1 = f1(wip); int &ir3 = f1(aip); int &ir4 = f1(uip); } // Simple overloading int &f2(id __strong const *); // expected-note{{candidate function}} float &f2(id __autoreleasing const *); // expected-note{{candidate function}} void test_f2() { id __strong *sip; id __strong const *csip; id __weak *wip; id __autoreleasing *aip; id __unsafe_unretained *uip; // Prefer non-ownership conversions to ownership conversions. int &ir1 = f2(sip); int &ir2 = f2(csip); float &fr1 = f2(aip); f2(uip); // expected-error{{call to 'f2' is ambiguous}} } // Writeback conversion int &f3(id __autoreleasing *); // expected-note{{candidate function not viable: 1st argument ('__unsafe_unretained id *') has __unsafe_unretained ownership, but parameter has __autoreleasing ownership}} void test_f3() { id __strong sip; id __weak wip; id __autoreleasing aip; id __unsafe_unretained uip; int &ir1 = f3(&sip); int &ir2 = f3(&wip); int &ir3 = f3(&aip); f3(&uip); // expected-error{{no matching function for call to 'f3'}} } // Writeback conversion vs. no conversion int &f4(id __autoreleasing *); float &f4(id __strong *); void test_f4() { id __strong sip; id __weak wip; id __autoreleasing aip; extern __weak id weak_global_ptr; float &fr1 = f4(&sip); int &ir1 = f4(&wip); int &ir2 = f4(&aip); int &ir3 = f4(&weak_global_ptr); // expected-error{{passing address of non-local object to __autoreleasing parameter for write-back}} } // Writeback conversion vs. other conversion. int &f5(id __autoreleasing *); float &f5(id const __unsafe_unretained *); void test_f5() { id __strong sip; id __weak wip; id __autoreleasing aip; int &ir1 = f5(&wip); float &fr1 = f5(&sip); int &ir2 = f5(&aip); } @interface A @end int &f6(id __autoreleasing *); float &f6(id const __unsafe_unretained *); void test_f6() { A* __strong sip; A* __weak wip; A* __autoreleasing aip; int &ir1 = f6(&wip); float &fr1 = f6(&sip); int &ir2 = f6(&aip); } // Reference binding void f7(__strong id&); // expected-note{{candidate function not viable: 1st argument ('__weak id') has __weak ownership, but parameter has __strong ownership}} \ // expected-note{{candidate function not viable: 1st argument ('__autoreleasing id') has __autoreleasing ownership, but parameter has __strong ownership}} \ // expected-note{{candidate function not viable: 1st argument ('__unsafe_unretained id') has __unsafe_unretained ownership, but parameter has __strong ownership}} void test_f7() { __strong id strong_id; __weak id weak_id; __autoreleasing id autoreleasing_id; __unsafe_unretained id unsafe_id; f7(strong_id); f7(weak_id); // expected-error{{no matching function for call to 'f7'}} f7(autoreleasing_id); // expected-error{{no matching function for call to 'f7'}} f7(unsafe_id); // expected-error{{no matching function for call to 'f7'}} } void f8(const __strong id&); void test_f8() { __strong id strong_id; __weak id weak_id; __autoreleasing id autoreleasing_id; __unsafe_unretained id unsafe_id; f8(strong_id); f8(weak_id); f8(autoreleasing_id); f8(unsafe_id); } int &f9(__strong id&); float &f9(const __autoreleasing id&); void test_f9() { __strong id strong_id; __weak id weak_id; __autoreleasing id autoreleasing_id; __unsafe_unretained id unsafe_id; int &ir1 = f9(strong_id); float &fr1 = f9(autoreleasing_id); float &fr2 = f9(unsafe_id); float &fr2a = f9(weak_id); __strong A *strong_a; __weak A *weak_a; __autoreleasing A *autoreleasing_a; __unsafe_unretained A *unsafe_unretained_a; float &fr3 = f9(strong_a); float &fr4 = f9(autoreleasing_a); float &fr5 = f9(unsafe_unretained_a); float &fr6 = f9(weak_a); const __autoreleasing id& ar1 = strong_a; const __autoreleasing id& ar2 = autoreleasing_a; const __autoreleasing id& ar3 = unsafe_unretained_a; const __autoreleasing id& ar4 = weak_a; } // rdar://9790531 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}} void f9790531_1(struct S*inClientData); // expected-note {{candidate function not viable}} void f9790531_2(char * inClientData); // expected-note {{candidate function not viable}} @class UIApplication; @interface MixerEQGraphTestDelegate - (void)applicationDidFinishLaunching; @end @implementation MixerEQGraphTestDelegate - (void)applicationDidFinishLaunching { f9790531(self); // expected-error {{no matching function for call to 'f9790531'}} f9790531_1(self); // expected-error {{no matching function for call to 'f9790531_1'}} f9790531_2(self); // expected-error {{no matching function for call to 'f9790531_2'}} } @end class rdar10142572 { id f() __attribute__((ns_returns_retained)); id g(); // expected-note{{previous declaration}} }; id rdar10142572::f() { return 0; } // okay: merged down 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}}