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// rdar://15757510 55 56@interface J 57@property (retain) id newFoo; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} 58@property (strong) id copyBar; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} 59@property (copy) id allocBaz; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} 60@property (copy, nonatomic) id new; 61@property (retain) id newDFoo; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} 62@property (strong) id copyDBar; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} 63@property (copy) id allocDBaz; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} 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// rdar://10187884 80@interface Super 81- (void)bar:(id)b; // expected-note {{parameter declared here}} 82- (void)bar1:(id) __attribute((ns_consumed)) b; 83- (void)ok:(id) __attribute((ns_consumed)) b; 84- (id)ns_non; // expected-note {{method declared here}} 85- (id)not_ret:(id) b __attribute((ns_returns_not_retained)); // expected-note {{method declared here}} 86- (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained)); 87@end 88 89@interface Sub : Super 90- (void)bar:(id) __attribute((ns_consumed)) b; // expected-error {{overriding method has mismatched ns_consumed attribute on its parameter}} 91- (void)bar1:(id)b; 92- (void)ok:(id) __attribute((ns_consumed)) b; 93- (id)ns_non __attribute((ns_returns_not_retained)); // expected-error {{overriding method has mismatched ns_returns_not_retained attributes}} 94- (id)not_ret:(id) b __attribute((ns_returns_retained)); // expected-error {{overriding method has mismatched ns_returns_retained attributes}} 95- (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained)); 96// rdar://12173491 97@property (copy, nonatomic) __attribute__((ns_returns_retained)) id (^fblock)(void); 98@end 99 100// Test that we give a good diagnostic here that mentions the missing 101// ownership qualifier. We don't want this to get suppressed because 102// of an invalid conversion. 103void test7(void) { 104 id x; 105 id *px = &x; // expected-error {{pointer to non-const type 'id' with no explicit ownership}} 106 107 I *y; 108 J **py = &y; // expected-error {{pointer to non-const type 'J *' with no explicit ownership}} expected-warning {{incompatible pointer types initializing}} 109} 110 111void 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)'}} 112struct __attribute__((objc_ownership(none))) S2 {}; // expected-error {{'objc_ownership' attribute only applies to variables}} 113@interface I2 114 @property __attribute__((objc_ownership(frob))) id i; // expected-warning {{'objc_ownership' attribute argument not supported: 'frob'}} 115@end 116 117// rdar://15304886 118@interface NSObject @end 119 120@interface ControllerClass : NSObject @end 121 122@interface SomeClassOwnedByController 123@property (readonly) ControllerClass *controller; // expected-note {{property declared here}} 124 125// rdar://15465916 126@property (readonly, weak) ControllerClass *weak_controller; 127@end 128 129@interface SomeClassOwnedByController () 130@property (readwrite, weak) ControllerClass *controller; // expected-warning {{primary property declaration is implicitly strong while redeclaration in class extension is weak}} 131 132@property (readwrite, weak) ControllerClass *weak_controller; 133@end 134