forked from OSchip/llvm-project
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:
parent
a5f7a8cfde
commit
e3be9795c8
|
@ -2627,7 +2627,7 @@ def err_arc_objc_object_in_struct : Error<
|
|||
"ARC forbids Objective-C objects in structs or unions">;
|
||||
def err_arc_objc_property_default_assign_on_object : Error<
|
||||
"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<
|
||||
"ARC forbids use of %0 in a @selector">;
|
||||
def err_arc_illegal_method_def : Error<
|
||||
|
|
|
@ -594,13 +594,6 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
|
|||
ObjCIvarDecl *Ivar = 0;
|
||||
// Check that we have a valid, previously declared ivar for @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
|
||||
if (!PropertyIvar)
|
||||
PropertyIvar = PropertyId;
|
||||
|
@ -619,6 +612,13 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
|
|||
if (getLangOptions().ObjCAutoRefCount &&
|
||||
!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.
|
||||
if (kind & (ObjCPropertyDecl::OBJC_PR_retain |
|
||||
ObjCPropertyDecl::OBJC_PR_strong |
|
||||
|
|
|
@ -483,19 +483,31 @@ void test26(id y) {
|
|||
@end
|
||||
|
||||
// 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}} \
|
||||
// expected-warning {{default property attribute 'assign' not appropriate for non-gc object}} \
|
||||
// expected-note {{declared here}}
|
||||
@property (readonly) id ro; // expected-note {{declared here}}
|
||||
@property (readonly) id custom_ro;
|
||||
@property int y;
|
||||
|
||||
@property (readonly) id myProp1;
|
||||
@property (readonly) id myProp2;
|
||||
@property (readonly) __strong id myProp3;
|
||||
@end
|
||||
|
||||
@implementation Test27
|
||||
@synthesize x; // 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 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 ownership or storage attribute}}
|
||||
@synthesize y;
|
||||
|
||||
@synthesize myProp1 = _myProp1;
|
||||
@synthesize myProp2;
|
||||
@synthesize myProp3;
|
||||
|
||||
-(id)custom_ro { return 0; }
|
||||
@end
|
||||
|
||||
|
|
Loading…
Reference in New Issue