1// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -fsyntax-only -fobjc-arc -verify %s 2// rdar://9340606 3 4@interface Foo { 5@public 6 id __unsafe_unretained x; 7 id __weak y; 8 id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}} 9} 10@property(strong) id x; 11@property(strong) id y; 12@property(strong) id z; 13@end 14 15@interface Bar { 16@public 17 id __unsafe_unretained x; 18 id __weak y; 19 id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}} 20} 21@property(retain) id x; 22@property(retain) id y; 23@property(retain) id z; 24@end 25 26@interface Bas { 27@public 28 id __unsafe_unretained x; 29 id __weak y; 30 id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}} 31} 32@property(copy) id x; 33@property(copy) id y; 34@property(copy) id z; 35@end 36 37// Errors should start about here :-) 38 39@interface Bat 40@property(strong) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}} 41@property(strong) __weak id y; // expected-error {{strong property 'y' may not also be declared __weak}} 42@property(strong) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}} 43@end 44 45@interface Bau 46@property(retain) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}} 47@property(retain) __weak id y; // expected-error {{strong property 'y' may not also be declared __weak}} 48@property(retain) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}} 49@end 50 51@interface Bav 52@property(copy) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}} 53@property(copy) __weak id y; // expected-error {{strong property 'y' may not also be declared __weak}} 54@property(copy) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}} 55@end 56 57@interface Bingo 58@property(assign) __unsafe_unretained id x; 59@property(assign) __weak id y; // expected-error {{unsafe_unretained property 'y' may not also be declared __weak}} 60@property(assign) __autoreleasing id z; // expected-error {{unsafe_unretained property 'z' may not also be declared __autoreleasing}} 61@end 62 63@interface Batman 64@property(unsafe_unretained) __unsafe_unretained id x; 65@property(unsafe_unretained) __weak id y; // expected-error {{unsafe_unretained property 'y' may not also be declared __weak}} 66@property(unsafe_unretained) __autoreleasing id z; // expected-error {{unsafe_unretained property 'z' may not also be declared __autoreleasing}} 67@end 68 69// rdar://9396329 70@interface Super 71@property (readonly, retain) id foo; 72@property (readonly, weak) id fee; 73@property (readonly, strong) id frr; 74@end 75 76@interface Bugg : Super 77@property (readwrite) id foo; 78@property (readwrite) id fee; 79@property (readwrite) id frr; 80@end 81 82// rdar://20152386 83// rdar://20383235 84 85@interface NSObject @end 86 87#pragma clang assume_nonnull begin 88@interface I: NSObject 89@property(nonatomic, weak) id delegate; // Do not warn, nullable is inferred. 90@property(nonatomic, weak, readonly) id ROdelegate; // Do not warn, nullable is inferred. 91@property(nonatomic, weak, nonnull) id NonNulldelete; // expected-error {{property attributes 'nonnull' and 'weak' are mutually exclusive}} 92@property(nonatomic, weak, nullable) id Nullabledelete; // do not warn 93 94// strong cases. 95@property(nonatomic, strong) id stdelegate; // Do not warn 96@property(nonatomic, readonly) id stROdelegate; // Do not warn 97@property(nonatomic, strong, nonnull) id stNonNulldelete; // Do not warn 98@property(nonatomic, nullable) id stNullabledelete; // do not warn 99@end 100#pragma clang assume_nonnull end 101 102@interface J: NSObject 103@property(nonatomic, weak) id ddd; // Do not warn, nullable is inferred. 104@property(nonatomic, weak, nonnull) id delegate; // expected-error {{property attributes 'nonnull' and 'weak' are mutually exclusive}} 105@property(nonatomic, weak, nonnull, readonly) id ROdelegate; // expected-error {{property attributes 'nonnull' and 'weak' are mutually exclusive}} 106@end 107 108// rdar://problem/23931441 109@protocol P 110@property(readonly, retain) id prop; 111@end 112 113__attribute__((objc_root_class)) 114@interface I2<P> 115@end 116 117@interface I2() 118@property (readwrite) id prop; 119@end 120 121@implementation I2 122@synthesize prop; 123@end 124 125// rdar://31579994 126// Verify that the all of the property declarations in inherited protocols are 127// compatible when synthesing a property from a protocol. 128 129@protocol CopyVsAssign1 130@property (copy, nonatomic, readonly) id prop; // expected-error {{property with attribute 'copy' was selected for synthesis}} 131@end 132@protocol CopyVsAssign2 133@property (assign, nonatomic, readonly) id prop; // expected-note {{it could also be property without attribute 'copy' declared here}} 134@end 135 136@interface CopyVsAssign: Foo <CopyVsAssign1, CopyVsAssign2> 137@end 138@implementation CopyVsAssign 139@synthesize prop; // expected-note {{property synthesized here}} 140@end 141 142@protocol RetainVsNonRetain1 143@property (readonly) id prop; // expected-error {{property without attribute 'retain (or strong)' was selected for synthesis}} 144@end 145@protocol RetainVsNonRetain2 146@property (retain, readonly) id prop; // expected-note {{it could also be property with attribute 'retain (or strong)' declared here}} 147@end 148 149@interface RetainVsNonRetain: Foo <RetainVsNonRetain1, RetainVsNonRetain2> 150@end 151@implementation RetainVsNonRetain 152@synthesize prop; // expected-note {{property synthesized here}} 153@end 154 155@protocol AtomicVsNonatomic1 156@property (copy, nonatomic, readonly) id prop; // expected-error {{property without attribute 'atomic' was selected for synthesis}} 157@end 158@protocol AtomicVsNonatomic2 159@property (copy, atomic, readonly) id prop; // expected-note {{it could also be property with attribute 'atomic' declared here}} 160@end 161 162@interface AtomicVsNonAtomic: Foo <AtomicVsNonatomic1, AtomicVsNonatomic2> 163@end 164@implementation AtomicVsNonAtomic 165@synthesize prop; // expected-note {{property synthesized here}} 166@end 167 168@protocol Getter1 169@property (copy, readonly) id prop; // expected-error {{property with getter 'prop' was selected for synthesis}} 170@end 171@protocol Getter2 172@property (copy, getter=x, readonly) id prop; // expected-note {{it could also be property with getter 'x' declared here}} 173@end 174 175@interface GetterVsGetter: Foo <Getter1, Getter2> 176@end 177@implementation GetterVsGetter 178@synthesize prop; // expected-note {{property synthesized here}} 179@end 180 181@protocol Setter1 182@property (copy, readonly) id prop; 183@end 184@protocol Setter2 185@property (copy, setter=setp:, readwrite) id prop; // expected-error {{property with setter 'setp:' was selected for synthesis}} 186@end 187@protocol Setter3 188@property (copy, readwrite) id prop; // expected-note {{it could also be property with setter 'setProp:' declared here}} 189@end 190 191@interface SetterVsSetter: Foo <Setter1, Setter2, Setter3> 192@end 193@implementation SetterVsSetter 194@synthesize prop; // expected-note {{property synthesized here}} 195@end 196 197@protocol TypeVsAttribute1 198@property (assign, atomic, readonly) int prop; // expected-error {{property of type 'int' was selected for synthesis}} 199@end 200@protocol TypeVsAttribute2 201@property (assign, atomic, readonly) id prop; // expected-note {{it could also be property of type 'id' declared here}} 202@end 203@protocol TypeVsAttribute3 204@property (copy, readonly) id prop; // expected-note {{it could also be property with attribute 'copy' declared here}} 205@end 206 207@interface TypeVsAttribute: Foo <TypeVsAttribute1, TypeVsAttribute2, TypeVsAttribute3> 208@end 209@implementation TypeVsAttribute 210@synthesize prop; // expected-note {{property synthesized here}} 211@end 212 213@protocol TypeVsSetter1 214@property (assign, nonatomic, readonly) int prop; // expected-note {{it could also be property of type 'int' declared here}} 215@end 216@protocol TypeVsSetter2 217@property (assign, nonatomic, readonly) id prop; // ok 218@end 219@protocol TypeVsSetter3 220@property (assign, nonatomic, readwrite) id prop; // expected-error {{property of type 'id' was selected for synthesis}} 221@end 222 223@interface TypeVsSetter: Foo <TypeVsSetter1, TypeVsSetter2, TypeVsSetter3> 224@end 225@implementation TypeVsSetter 226@synthesize prop; // expected-note {{property synthesized here}} 227@end 228 229@protocol AutoStrongProp 230 231@property (nonatomic, readonly) NSObject *prop; 232 233@end 234 235@protocol AutoStrongProp_Internal <AutoStrongProp> 236 237// This property gets the 'strong' attribute automatically. 238@property (nonatomic, readwrite) NSObject *prop; 239 240@end 241 242@interface SynthesizeWithImplicitStrongNoError : NSObject <AutoStrongProp> 243@end 244 245@interface SynthesizeWithImplicitStrongNoError () <AutoStrongProp_Internal> 246 247@end 248 249@implementation SynthesizeWithImplicitStrongNoError 250 251// no error, 'strong' is implicit in the 'readwrite' property. 252@synthesize prop = _prop; 253 254@end 255 256// rdar://39024725 257// Allow strong readwrite property and a readonly one. 258@protocol StrongCollision 259 260@property(strong) NSObject *p; 261@property(copy) NSObject *p2; 262 263// expected-error@+1 {{property with attribute 'retain (or strong)' was selected for synthesis}} 264@property(strong, readwrite) NSObject *collision; 265 266@end 267 268@protocol ReadonlyCollision 269 270@property(readonly) NSObject *p; 271@property(readonly) NSObject *p2; 272 273// expected-note@+1 {{it could also be property without attribute 'retain (or strong)' declared here}} 274@property(readonly, weak) NSObject *collision; 275 276@end 277 278@interface StrongReadonlyCollision : NSObject <StrongCollision, ReadonlyCollision> 279@end 280 281@implementation StrongReadonlyCollision 282 283// no error 284@synthesize p = _p; 285@synthesize p2 = _p2; 286 287@synthesize collision = _collision; // expected-note {{property synthesized here}} 288 289@end 290 291// This used to crash because we'd temporarly store the weak attribute on the 292// declaration specifier, then deallocate it when clearing the declarator. 293id i1, __weak i2, i3; 294