In ARC we emit an error when compiling:

@interface Foo : NSObject
@property (readonly) id myProp;
@end

@implementation Foo
@synthesize myProp;
@end

t.m:9:13: error: ARC forbids synthesizing a property of an Objective-C object with unspecified storage attribute
@synthesize myProp;
            ^

which is fine, we want the ownership of the synthesized ivar to be explicit. But we should _not_ emit an error
for the following cases, because we can get the ownership either from the declared ivar or from the property type:

@interface Foo : NSObject {
	__weak id _myProp1;
	id myProp2;
}
@property (readonly) id myProp1;
@property (readonly) id myProp2;
@property (readonly) __strong id myProp3;
@end

@implementation Foo
@synthesize myProp1 = _myProp1;
@synthesize myProp2;
@synthesize myProp3;
@end

rdar://9844006.

llvm-svn: 136155
This commit is contained in:
Argyrios Kyrtzidis 2011-07-26 21:48:26 +00:00
parent a5f7a8cfde
commit e3be9795c8
3 changed files with 23 additions and 11 deletions

View File

@ -2627,7 +2627,7 @@ def err_arc_objc_object_in_struct : Error<
"ARC forbids Objective-C objects in structs or unions">; "ARC forbids Objective-C objects in structs or unions">;
def err_arc_objc_property_default_assign_on_object : Error< def err_arc_objc_property_default_assign_on_object : Error<
"ARC forbids synthesizing a property of an Objective-C object " "ARC forbids synthesizing a property of an Objective-C object "
"with unspecified storage attribute">; "with unspecified ownership or storage attribute">;
def err_arc_illegal_selector : Error< def err_arc_illegal_selector : Error<
"ARC forbids use of %0 in a @selector">; "ARC forbids use of %0 in a @selector">;
def err_arc_illegal_method_def : Error< def err_arc_illegal_method_def : Error<

View File

@ -594,13 +594,6 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
ObjCIvarDecl *Ivar = 0; ObjCIvarDecl *Ivar = 0;
// Check that we have a valid, previously declared ivar for @synthesize // Check that we have a valid, previously declared ivar for @synthesize
if (Synthesize) { if (Synthesize) {
if (getLangOptions().ObjCAutoRefCount &&
!property->hasWrittenStorageAttribute() &&
property->getType()->isObjCRetainableType()) {
Diag(PropertyLoc, diag::err_arc_objc_property_default_assign_on_object);
Diag(property->getLocation(), diag::note_property_declare);
}
// @synthesize // @synthesize
if (!PropertyIvar) if (!PropertyIvar)
PropertyIvar = PropertyId; PropertyIvar = PropertyId;
@ -619,6 +612,13 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
if (getLangOptions().ObjCAutoRefCount && if (getLangOptions().ObjCAutoRefCount &&
!PropertyIvarType.getObjCLifetime()) { !PropertyIvarType.getObjCLifetime()) {
if (!property->hasWrittenStorageAttribute() &&
property->getType()->isObjCRetainableType()) {
Diag(PropertyLoc,
diag::err_arc_objc_property_default_assign_on_object);
Diag(property->getLocation(), diag::note_property_declare);
}
// retain/copy have retaining lifetime. // retain/copy have retaining lifetime.
if (kind & (ObjCPropertyDecl::OBJC_PR_retain | if (kind & (ObjCPropertyDecl::OBJC_PR_retain |
ObjCPropertyDecl::OBJC_PR_strong | ObjCPropertyDecl::OBJC_PR_strong |

View File

@ -483,19 +483,31 @@ void test26(id y) {
@end @end
// rdar://9525555 // rdar://9525555
@interface Test27 @interface Test27 {
__weak id _myProp1;
id myProp2;
}
@property id x; // expected-warning {{no 'assign', 'retain', or 'copy' attribute is specified - 'assign' is assumed}} \ @property id x; // expected-warning {{no 'assign', 'retain', or 'copy' attribute is specified - 'assign' is assumed}} \
// expected-warning {{default property attribute 'assign' not appropriate for non-gc object}} \ // expected-warning {{default property attribute 'assign' not appropriate for non-gc object}} \
// expected-note {{declared here}} // expected-note {{declared here}}
@property (readonly) id ro; // expected-note {{declared here}} @property (readonly) id ro; // expected-note {{declared here}}
@property (readonly) id custom_ro; @property (readonly) id custom_ro;
@property int y; @property int y;
@property (readonly) id myProp1;
@property (readonly) id myProp2;
@property (readonly) __strong id myProp3;
@end @end
@implementation Test27 @implementation Test27
@synthesize x; // expected-error {{ARC forbids synthesizing a property of an Objective-C object with unspecified storage attribute}} @synthesize x; // expected-error {{ARC forbids synthesizing a property of an Objective-C object with unspecified ownership or storage attribute}}
@synthesize ro; // expected-error {{ARC forbids synthesizing a property of an Objective-C object with unspecified storage attribute}} @synthesize ro; // expected-error {{ARC forbids synthesizing a property of an Objective-C object with unspecified ownership or storage attribute}}
@synthesize y; @synthesize y;
@synthesize myProp1 = _myProp1;
@synthesize myProp2;
@synthesize myProp3;
-(id)custom_ro { return 0; } -(id)custom_ro { return 0; }
@end @end