diff options
-rw-r--r-- | include/clang/AST/DeclObjC.h | 4 | ||||
-rw-r--r-- | lib/AST/DeclObjC.cpp | 4 | ||||
-rw-r--r-- | test/SemaObjC/property-5.m | 3 |
3 files changed, 11 insertions, 0 deletions
diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 84abdfd802..d985ce3962 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -1205,6 +1205,10 @@ public: void setPropertyAttributes(PropertyAttributeKind PRVal) { PropertyAttributes |= PRVal; } + + bool isReadOnly() const { + return (PropertyAttributes & OBJC_PR_readonly); + } Selector getGetterName() const { return GetterName; } void setGetterName(Selector Sel) { GetterName = Sel; } diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 2e03802436..e74e21dbbc 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -433,6 +433,10 @@ void ObjCInterfaceDecl::addPropertyMethods( } property->setGetterMethodDecl(GetterDecl); + // Skip setter if property is read-only. + if (property->isReadOnly()) + return; + // Find the default setter and if one not found, add one. ObjCMethodDecl *SetterDecl = getInstanceMethod(property->getSetterName()); if (!SetterDecl) { diff --git a/test/SemaObjC/property-5.m b/test/SemaObjC/property-5.m index c467e634dc..70ef315b22 100644 --- a/test/SemaObjC/property-5.m +++ b/test/SemaObjC/property-5.m @@ -29,3 +29,6 @@ @property(readonly) ConstData *p_base; // expected-warning {{property type 'ConstData *' does not match property type inherited from 'Data'}} @end +void foo(Base *b, id x) { + [ b setRef: x ]; // expected-warning {{method '-setRef:' not found}} +} |