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 structs or unions}} 7 }; 8 9 union u { 10 id u; // expected-error {{ARC forbids Objective-C objects in structs or unions}} 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 structs or unions}} 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 structs or unions}} 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 55 @interface J 56 @property (retain) id newFoo; // expected-note {{property declared here}} 57 @property (strong) id copyBar; // expected-note {{property declared here}} 58 @property (copy) id allocBaz; // expected-note {{property declared here}} 59 @property (copy, nonatomic) id new; 60 @end 61 62 @implementation J 63 @synthesize newFoo; // expected-error {{property's synthesized getter follows Cocoa naming convention for returning}} 64 @synthesize copyBar; // expected-error {{property's synthesized getter follows Cocoa naming convention for returning}} 65 @synthesize allocBaz; // expected-error {{property's synthesized getter follows Cocoa naming convention for returning}} 66 @synthesize new; 67 - new {return 0; }; 68 @end 69 70 71 // rdar://10187884 72 @interface Super 73 - (void)bar:(id)b; // expected-note {{parameter declared here}} 74 - (void)bar1:(id) __attribute((ns_consumed)) b; 75 - (void)ok:(id) __attribute((ns_consumed)) b; 76 - (id)ns_non; // expected-note {{method declared here}} 77 - (id)not_ret:(id) b __attribute((ns_returns_not_retained)); // expected-note {{method declared here}} 78 - (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained)); 79 @end 80 81 @interface Sub : Super 82 - (void)bar:(id) __attribute((ns_consumed)) b; // expected-error {{overriding method has mismatched ns_consumed attribute on its parameter}} 83 - (void)bar1:(id)b; 84 - (void)ok:(id) __attribute((ns_consumed)) b; 85 - (id)ns_non __attribute((ns_returns_not_retained)); // expected-error {{overriding method has mismatched ns_returns_not_retained attributes}} 86 - (id)not_ret:(id) b __attribute((ns_returns_retained)); // expected-error {{overriding method has mismatched ns_returns_retained attributes}} 87 - (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained)); 88 @end 89 90 // Test that we give a good diagnostic here that mentions the missing 91 // ownership qualifier. We don't want this to get suppressed because 92 // of an invalid conversion. 93 void test7(void) { 94 id x; 95 id *px = &x; // expected-error {{pointer to non-const type 'id' with no explicit ownership}} 96 97 I *y; 98 J **py = &y; // expected-error {{pointer to non-const type 'J *' with no explicit ownership}} expected-warning {{incompatible pointer types initializing}} 99 } 100