1 // RUN: %clang_cc1 -fsyntax-only -fblocks -fobjc-arc -verify -Wno-objc-root-class %s 2 3 // rdar://8843524 4 5 struct A { 6 id x; // expected-error {{ARC forbids Objective-C objects in struct}} 7 }; 8 9 union u { 10 id u; // expected-error {{ARC forbids Objective-C objects in union}} 11 }; 12 13 @interface I { 14 struct A a; 15 struct B { 16 id y[10][20]; // expected-error {{ARC forbids Objective-C objects in struct}} 17 id z; 18 } b; 19 20 union u c; 21 }; 22 @end 23 24 // rdar://10260525 25 struct r10260525 { 26 id (^block) (); // expected-error {{ARC forbids blocks in struct}} 27 }; 28 29 struct S { 30 id __attribute__((objc_ownership(none))) i; 31 void * vp; 32 int i1; 33 }; 34 35 // rdar://9046528 36 37 @class NSError; 38 39 __autoreleasing id X; // expected-error {{global variables cannot have __autoreleasing ownership}} 40 __autoreleasing NSError *E; // expected-error {{global variables cannot have __autoreleasing ownership}} 41 42 43 extern id __autoreleasing X1; // expected-error {{global variables cannot have __autoreleasing ownership}} 44 45 void func() 46 { 47 id X; 48 static id __autoreleasing X1; // expected-error {{global variables cannot have __autoreleasing ownership}} 49 extern id __autoreleasing E; // expected-error {{global variables cannot have __autoreleasing ownership}} 50 51 } 52 53 // rdar://9157348 54 // rdar://15757510 55 56 @interface J 57 @property (retain) id newFoo; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-newFoo' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} 58 @property (strong) id copyBar; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-copyBar' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} 59 @property (copy) id allocBaz; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-allocBaz' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} 60 @property (copy, nonatomic) id new; 61 @property (retain) id newDFoo; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-newDFoo' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} 62 @property (strong) id copyDBar; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-copyDBar' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} 63 @property (copy) id allocDBaz; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-allocDBaz' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} 64 @end 65 66 @implementation J 67 @synthesize newFoo; 68 @synthesize copyBar; 69 @synthesize allocBaz; 70 @synthesize new; 71 - new {return 0; }; 72 73 @dynamic newDFoo; 74 @dynamic copyDBar; 75 @dynamic allocDBaz; 76 @end 77 78 79 @interface MethodFamilyDiags 80 @property (retain) id newFoo; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} 81 - (id)newFoo; // expected-note {{explicitly declare getter '-newFoo' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} 82 83 #define OBJC_METHOD_FAMILY_NONE __attribute__((objc_method_family(none))) 84 - (id)newBar; // expected-note {{explicitly declare getter '-newBar' with 'OBJC_METHOD_FAMILY_NONE' to return an 'unowned' object}} 85 @property (retain) id newBar; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} 86 87 @property (retain) id newBaz; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note {{explicitly declare getter '-newBaz' with 'OBJC_METHOD_FAMILY_NONE' to return an 'unowned' object}} 88 #undef OBJC_METHOD_FAMILY_NONE 89 90 @property (retain, readonly) id newGarply; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note {{explicitly declare getter '-newGarply' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} 91 @end 92 93 @interface MethodFamilyDiags (Redeclarations) 94 - (id)newGarply; // no note here 95 @end 96 97 @implementation MethodFamilyDiags 98 @synthesize newGarply; 99 @end 100 101 102 // rdar://10187884 103 @interface Super 104 - (void)bar:(id)b; // expected-note {{parameter declared here}} 105 - (void)bar1:(id) __attribute((ns_consumed)) b; 106 - (void)ok:(id) __attribute((ns_consumed)) b; 107 - (id)ns_non; // expected-note {{method declared here}} 108 - (id)not_ret:(id) b __attribute((ns_returns_not_retained)); // expected-note {{method declared here}} 109 - (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained)); 110 @end 111 112 @interface Sub : Super 113 - (void)bar:(id) __attribute((ns_consumed)) b; // expected-error {{overriding method has mismatched ns_consumed attribute on its parameter}} 114 - (void)bar1:(id)b; 115 - (void)ok:(id) __attribute((ns_consumed)) b; 116 - (id)ns_non __attribute((ns_returns_not_retained)); // expected-error {{overriding method has mismatched ns_returns_not_retained attributes}} 117 - (id)not_ret:(id) b __attribute((ns_returns_retained)); // expected-error {{overriding method has mismatched ns_returns_retained attributes}} 118 - (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained)); 119 // rdar://12173491 120 @property (copy, nonatomic) __attribute__((ns_returns_retained)) id (^fblock)(void); 121 @end 122 123 // Test that we give a good diagnostic here that mentions the missing 124 // ownership qualifier. We don't want this to get suppressed because 125 // of an invalid conversion. 126 void test7(void) { 127 id x; 128 id *px = &x; // expected-error {{pointer to non-const type 'id' with no explicit ownership}} 129 130 I *y; 131 J **py = &y; // expected-error {{pointer to non-const type 'J *' with no explicit ownership}} expected-warning {{incompatible pointer types initializing}} 132 } 133 134 void func(void) __attribute__((objc_ownership(none))); // expected-warning {{'objc_ownership' only applies to Objective-C object or block pointer types; type here is 'void (void)'}} 135 struct __attribute__((objc_ownership(none))) S2 {}; // expected-error {{'objc_ownership' attribute only applies to variables}} 136 @interface I2 137 @property __attribute__((objc_ownership(frob))) id i; // expected-warning {{'objc_ownership' attribute argument not supported: 'frob'}} 138 @end 139 140 // rdar://15304886 141 @interface NSObject @end 142 143 @interface ControllerClass : NSObject @end 144 145 @interface SomeClassOwnedByController 146 @property (readonly) ControllerClass *controller; // expected-note {{property declared here}} 147 148 // rdar://15465916 149 @property (readonly, weak) ControllerClass *weak_controller; 150 @end 151 152 @interface SomeClassOwnedByController () 153 @property (readwrite, weak) ControllerClass *controller; // expected-warning {{primary property declaration is implicitly strong while redeclaration in class extension is weak}} 154 155 @property (readwrite, weak) ControllerClass *weak_controller; 156 @end 157