// RUN: %clang_cc1 -triple x86_64-apple-macosx10.13.0 -fobjc-runtime=macosx-10.13.0 -fblocks -fobjc-arc %s -verify // RUN: %clang_cc1 -triple x86_64-apple-macosx10.13.0 -fobjc-runtime=macosx-10.13.0 -fblocks -fobjc-arc -xobjective-c++ %s -verify #define EXT_RET __attribute__((objc_externally_retained)) @interface ObjCTy @end void test1() { EXT_RET int a; // expected-warning{{'objc_externally_retained' can only be applied to}} EXT_RET __weak ObjCTy *b; // expected-warning{{'objc_externally_retained' can only be applied to}} EXT_RET __weak int (^c)(); // expected-warning{{'objc_externally_retained' can only be applied to}} EXT_RET int (^d)() = ^{return 0;}; EXT_RET ObjCTy *e = 0; EXT_RET __strong ObjCTy *f = 0; e = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} f = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} d = ^{ return 0; }; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} } void test2(ObjCTy *a); void test2(ObjCTy *a) EXT_RET { a = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} } EXT_RET ObjCTy *test3; // expected-warning{{'objc_externally_retained' can only be applied to}} @interface X // expected-warning{{defined without specifying a base class}} expected-note{{add a super class}} -(void)m: (ObjCTy *) p; @end @implementation X -(void)m: (ObjCTy *) p EXT_RET { p = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} } @end void test4() { __attribute__((objc_externally_retained(0))) ObjCTy *a; // expected-error{{'objc_externally_retained' attribute takes no arguments}} } void test5(ObjCTy *first, __strong ObjCTy *second) EXT_RET { first = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} second = 0; // fine } void test6(ObjCTy *first, __strong ObjCTy *second) EXT_RET { first = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} second = 0; } __attribute__((objc_root_class)) @interface Y @end @implementation Y - (void)test7:(__strong ObjCTy *)first withThird:(ObjCTy *)second EXT_RET { first = 0; second = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} } @end void (^blk)(ObjCTy *, ObjCTy *) = ^(__strong ObjCTy *first, ObjCTy *second) EXT_RET { first = 0; second = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} }; void (^blk2)(ObjCTy *, ObjCTy *) = ^(__strong ObjCTy *first, ObjCTy *second) __attribute__((objc_externally_retained)) { first = 0; second = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} }; void test8(EXT_RET ObjCTy *x) {} // expected-warning{{'objc_externally_retained' attribute only applies to variables}} #pragma clang attribute ext_ret.push(__attribute__((objc_externally_retained)), apply_to=any(function, block, objc_method)) void test9(ObjCTy *first, __strong ObjCTy *second) { first = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} second = 0; } void (^test10)(ObjCTy *first, ObjCTy *second) = ^(ObjCTy *first, __strong ObjCTy *second) { first = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} second = 0; }; __attribute__((objc_root_class)) @interface Test11 @end @implementation Test11 -(void)meth: (ObjCTy *)first withSecond:(__strong ObjCTy *)second { first = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} second = 0; } +(void)othermeth: (ObjCTy *)first withSecond:(__strong ObjCTy *)second { first = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} second = 0; } @end #if __cplusplus class Test12 { void inline_member(ObjCTy *first, __strong ObjCTy *second) { first = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} second = 0; } static void static_inline_member(ObjCTy *first, __strong ObjCTy *second) { first = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} second = 0; } }; #endif void test13(ObjCTy *first, __weak ObjCTy *second, __unsafe_unretained ObjCTy *third, __strong ObjCTy *fourth) { first = 0; // expected-error{{variable declared with 'objc_externally_retained' cannot be modified in ARC}} second = 0; third = 0; fourth = 0; } #pragma clang attribute ext_ret.pop