]> granicus.if.org Git - clang/commitdiff
Explicit declaration of property setters over-ride
authorFariborz Jahanian <fjahanian@apple.com>
Sat, 10 Jan 2009 18:43:55 +0000 (18:43 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Sat, 10 Jan 2009 18:43:55 +0000 (18:43 +0000)
prohibition of 'readonly' properties in an assignment.

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

lib/AST/DeclObjC.cpp
test/SemaObjC/property-user-setter.m [new file with mode: 0644]

index 56da9a6dfa9e4cc3acc0de12f5f898f5c9a183ee..f39eec3dc56d0560f407af58bfe9b1b587b0a6e5 100644 (file)
@@ -257,7 +257,9 @@ void ObjCMethodDecl::setMethodParams(ParmVarDecl **NewParamInfo,
 ///
 bool ObjCInterfaceDecl::isPropertyReadonly(ObjCPropertyDecl *PDecl) const
 {
-  if (!PDecl->isReadOnly())
+  // Even if property is ready only, if interface has a user defined setter, 
+  // it is not considered read only. 
+  if (!PDecl->isReadOnly() || getInstanceMethod(PDecl->getSetterName()))
     return false;
 
   // Main class has the property as 'readonly'. Must search
@@ -265,6 +267,10 @@ bool ObjCInterfaceDecl::isPropertyReadonly(ObjCPropertyDecl *PDecl) const
   // attribute has been over-ridden to 'readwrite'.
   for (ObjCCategoryDecl *Category = getCategoryList();
        Category; Category = Category->getNextClassCategory()) {
+    // Even if property is ready only, if a category has a user defined setter, 
+    // it is not considered read only. 
+    if (Category->getInstanceMethod(PDecl->getSetterName()))
+      return false;
     ObjCPropertyDecl *P = 
       Category->FindPropertyDeclaration(PDecl->getIdentifier());
     if (P && !P->isReadOnly())
diff --git a/test/SemaObjC/property-user-setter.m b/test/SemaObjC/property-user-setter.m
new file mode 100644 (file)
index 0000000..cb2091e
--- /dev/null
@@ -0,0 +1,25 @@
+// RUN: clang -fsyntax-only -verify %s
+
+@interface I0 
+@property(readonly) int x;
+@property(readonly) int y;
+@property(readonly) int z;
+-(void) setY: (int) y0;
+@end
+
+@interface I0 (Cat0)
+-(void) setX: (int) a0;
+@end
+
+@implementation I0
+@dynamic x;
+@dynamic y;
+@dynamic z;
+-(void) setY: (int) y0{}
+
+-(void) im0 {
+  self.x = 0;
+  self.y = 2;
+  self.z = 2; // expected-error {{assigning to property with 'readonly' attribute not allowed}}
+}
+@end