]> granicus.if.org Git - clang/commitdiff
objc-arc: 'readonly' property of retainable object
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 8 Nov 2011 20:58:53 +0000 (20:58 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 8 Nov 2011 20:58:53 +0000 (20:58 +0000)
type is strong by default too. // rdar://10410903

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

lib/Sema/SemaObjCProperty.cpp
test/ARCMT/assign-prop-with-arc-runtime.m
test/ARCMT/assign-prop-with-arc-runtime.m.result
test/SemaObjC/arc.m

index 46b2a086dd57af24a726cf4f58d38aca2a949985..4933f001c4e3afc72116321f023739359daaff4f 100644 (file)
@@ -1770,13 +1770,12 @@ void Sema::CheckObjCPropertyAttributes(Decl *PDecl,
                       ObjCDeclSpec::DQ_PR_unsafe_unretained |
                       ObjCDeclSpec::DQ_PR_retain | ObjCDeclSpec::DQ_PR_strong |
                       ObjCDeclSpec::DQ_PR_weak)) &&
-      !(Attributes & ObjCDeclSpec::DQ_PR_readonly) &&
       PropertyTy->isObjCObjectPointerType()) {
       if (getLangOptions().ObjCAutoRefCount)
         // With arc,  @property definitions should default to (strong) when 
-        // not specified
+        // not specified; including when property is 'readonly'.
         PropertyDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_strong);
-      else {
+      else if (!(Attributes & ObjCDeclSpec::DQ_PR_readonly)) {
           // Skip this warning in gc-only mode.
           if (getLangOptions().getGC() != LangOptions::GCOnly)
             Diag(Loc, diag::warn_objc_property_no_assignment_attribute);
index 8408a1858bd86320877b9ce93bfed12434ccf046..8845010895063d5c87b318f46b42667e32506baa 100644 (file)
@@ -14,7 +14,8 @@ typedef _NSCachedAttributedString *BadClassForWeak;
 @class Forw;
 
 @interface Foo : NSObject {
-  Foo *x, *w, *q1, *q2;
+  Foo *w, *q1, *q2;
+  __weak Foo *x;
   WeakOptOut *oo;
   BadClassForWeak bcw;
   id not_safe1;
@@ -22,7 +23,7 @@ typedef _NSCachedAttributedString *BadClassForWeak;
   Forw *not_safe3;
   Foo *assign_plus1;
 }
-@property (readonly) Foo *x;
+@property (readonly) __weak Foo *x;
 @property (assign) Foo *w;
 @property Foo *q1, *q2;
 @property (assign) WeakOptOut *oo;
index e6070a86b740662a67203d0da3cf6c792c690565..2c67f18180a8b5280778dfaa0b6e0fb13560f129 100644 (file)
@@ -14,7 +14,8 @@ typedef _NSCachedAttributedString *BadClassForWeak;
 @class Forw;
 
 @interface Foo : NSObject {
-  Foo *__weak x, *__weak w, *__weak q1, *__weak q2;
+  Foo *__weak w, *__weak q1, *__weak q2;
+  __weak Foo *x;
   WeakOptOut *__unsafe_unretained oo;
   BadClassForWeak __unsafe_unretained bcw;
   id __unsafe_unretained not_safe1;
@@ -22,7 +23,7 @@ typedef _NSCachedAttributedString *BadClassForWeak;
   Forw *__unsafe_unretained not_safe3;
   Foo *assign_plus1;
 }
-@property (readonly) Foo *x;
+@property (readonly) __weak Foo *x;
 @property (weak) Foo *w;
 @property (weak) Foo *q1, *q2;
 @property (unsafe_unretained) WeakOptOut *oo;
index d146d8fad1d5f757fedd6c1a5c12d6980f0f4dfc..c0393c46cc40c815ddd5ba719822780955063c91 100644 (file)
@@ -502,18 +502,18 @@ void test26(id y) {
   id myProp2;
 }
 @property id x;
-@property (readonly) id ro; // expected-note {{declared here}}
+@property (readonly) id ro;
 @property (readonly) id custom_ro;
 @property int y;
 
-@property (readonly) id myProp1;
+@property (readonly) __weak id myProp1;
 @property (readonly) id myProp2;
 @property (readonly) __strong id myProp3;
 @end
 
 @implementation Test27
 @synthesize x;
-@synthesize ro; // expected-error {{ARC forbids synthesizing a property of an Objective-C object with unspecified ownership or storage attribute}}
+@synthesize ro;
 @synthesize y;
 
 @synthesize myProp1 = _myProp1;