]> granicus.if.org Git - clang/commitdiff
In ARC we emit an error when compiling:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 26 Jul 2011 21:48:26 +0000 (21:48 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 26 Jul 2011 21:48:26 +0000 (21:48 +0000)
@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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136155 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaObjCProperty.cpp
test/SemaObjC/arc.m

index cdfa11203eea653e95ba433f24e440a6de145562..8b21362532d8cf1de9e0743f6e184dd44d37e6be 100644 (file)
@@ -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<
index 53de50c16cfadaf9736a11ea295e7f5c7c5729d2..8c8af1389b9b301317af4c364f5e54850bc4f58e 100644 (file)
@@ -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 |
index 669a92798d47d7984b07539aeeb8ab7b22f5776a..1ee76ecdba89e45904bab3eeeb29abeb15237f85 100644 (file)
@@ -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