1// RUN: %clang_cc1 -fsyntax-only -fblocks -fobjc-arc -verify -Wno-objc-root-class %s 2 3// rdar://8843524 4 5struct A { 6 id x; // expected-error {{ARC forbids Objective-C objects in struct}} 7}; 8 9union 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 25struct r10260525 { 26 id (^block) (); // expected-error {{ARC forbids blocks in struct}} 27}; 28 29struct 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 43extern id __autoreleasing X1; // expected-error {{global variables cannot have __autoreleasing ownership}} 44 45void 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// rdar://12173491 89@property (copy, nonatomic) __attribute__((ns_returns_retained)) id (^fblock)(void); 90@end 91 92// Test that we give a good diagnostic here that mentions the missing 93// ownership qualifier. We don't want this to get suppressed because 94// of an invalid conversion. 95void test7(void) { 96 id x; 97 id *px = &x; // expected-error {{pointer to non-const type 'id' with no explicit ownership}} 98 99 I *y; 100 J **py = &y; // expected-error {{pointer to non-const type 'J *' with no explicit ownership}} expected-warning {{incompatible pointer types initializing}} 101} 102