[ObjC] Don't warn on readwrite properties with custom setters that

override readonly properties from protocols

rdar://34192541


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@315093 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Alex Lorenz 2017-10-06 19:24:26 +00:00
parent 172bca309c
commit 0cbff250f6
2 changed files with 26 additions and 1 deletions

View File

@ -1599,7 +1599,11 @@ Sema::DiagnosePropertyMismatch(ObjCPropertyDecl *Property,
// meaningless for readonly properties, so don't diagnose if the
// atomic property is 'readonly'.
checkAtomicPropertyMismatch(*this, SuperProperty, Property, false);
if (Property->getSetterName() != SuperProperty->getSetterName()) {
// Readonly properties from protocols can be implemented as "readwrite"
// with a custom setter name.
if (Property->getSetterName() != SuperProperty->getSetterName() &&
!(SuperProperty->isReadOnly() &&
isa<ObjCProtocolDecl>(SuperProperty->getDeclContext()))) {
Diag(Property->getLocation(), diag::warn_property_attribute)
<< Property->getDeclName() << "setter" << inheritedName;
Diag(SuperProperty->getLocation(), diag::note_property_declare);

View File

@ -0,0 +1,21 @@
// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
// rdar://34192541
@class NSString;
@protocol MyProtocol
@property (nonatomic, strong, readonly) NSString *myString;
@end
@interface MyClass <MyProtocol>
// Don't warn about this setter:
@property (nonatomic, strong, setter=setMYString:) NSString *myString;
@property (nonatomic, strong, readonly) NSString *overridenInClass; // expected-note {{property declared here}}
@end
@interface MySubClass: MyClass
@property (nonatomic, strong, setter=setMYOverride:) NSString *overridenInClass;
// expected-warning@-1 {{'setter' attribute on property 'overridenInClass' does not match the property inherited from 'MyClass'}}
@end