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">;
|
"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<
|
||||||
|
|
|
@ -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 |
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue