diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2014-03-05 23:44:00 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2014-03-05 23:44:00 +0000 |
| commit | 6766f8d23bcb9d17f2694b962fb9ba44cb048232 (patch) | |
| tree | 38b951db642d087172e01eb8553cb7e9db74872d /clang | |
| parent | 21eea24d7924def4cbb62dfa4b9d6035307ee580 (diff) | |
| download | bcm5719-llvm-6766f8d23bcb9d17f2694b962fb9ba44cb048232.tar.gz bcm5719-llvm-6766f8d23bcb9d17f2694b962fb9ba44cb048232.zip | |
Objective-C. Suppress the warning for auto synthesis of property not
synthesizing protocol properties if class's super class
implements them. // rdar://16089191
llvm-svn: 203028
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaObjCProperty.cpp | 32 | ||||
| -rw-r--r-- | clang/test/SemaObjC/default-synthesize-3.m | 32 |
2 files changed, 60 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaObjCProperty.cpp b/clang/lib/Sema/SemaObjCProperty.cpp index ce8f9d15157..c96fcbed537 100644 --- a/clang/lib/Sema/SemaObjCProperty.cpp +++ b/clang/lib/Sema/SemaObjCProperty.cpp @@ -1534,6 +1534,26 @@ Sema::IvarBacksCurrentMethodAccessor(ObjCInterfaceDecl *IFace, return false; } +static bool SuperClassImplementsProperty(ObjCInterfaceDecl *IDecl, + ObjCPropertyDecl *Prop) { + bool SuperClassImplementsGetter = false; + bool SuperClassImplementsSetter = false; + if (Prop->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_readonly) + SuperClassImplementsSetter = true; + + while (IDecl->getSuperClass()) { + ObjCInterfaceDecl *SDecl = IDecl->getSuperClass(); + if (!SuperClassImplementsGetter && SDecl->getInstanceMethod(Prop->getGetterName())) + SuperClassImplementsGetter = true; + + if (!SuperClassImplementsSetter && SDecl->getInstanceMethod(Prop->getSetterName())) + SuperClassImplementsSetter = true; + if (SuperClassImplementsGetter && SuperClassImplementsSetter) + return true; + IDecl = IDecl->getSuperClass(); + } + return false; +} /// \brief Default synthesizes all properties which must be synthesized /// in class's \@implementation. @@ -1590,10 +1610,14 @@ void Sema::DefaultSynthesizeProperties(Scope *S, ObjCImplDecl* IMPDecl, if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(Prop->getDeclContext())) { // We won't auto-synthesize properties declared in protocols. - Diag(IMPDecl->getLocation(), - diag::warn_auto_synthesizing_protocol_property) - << Prop << Proto; - Diag(Prop->getLocation(), diag::note_property_declare); + // Suppress the warning if class's superclass implements property's + // getter and implements property's setter (if readwrite property). + if (!SuperClassImplementsProperty(IDecl, Prop)) { + Diag(IMPDecl->getLocation(), + diag::warn_auto_synthesizing_protocol_property) + << Prop << Proto; + Diag(Prop->getLocation(), diag::note_property_declare); + } continue; } diff --git a/clang/test/SemaObjC/default-synthesize-3.m b/clang/test/SemaObjC/default-synthesize-3.m index e409d216928..94065431691 100644 --- a/clang/test/SemaObjC/default-synthesize-3.m +++ b/clang/test/SemaObjC/default-synthesize-3.m @@ -181,3 +181,35 @@ typedef NSObject<Fooing> FooObject; @implementation Fail // expected-warning {{auto property synthesis will not synthesize property 'muahahaha' declared in protocol 'Fooing'}} expected-warning {{auto property synthesis will not synthesize property 'hoho' declared in protocol 'SubFooling'}} @end +// rdar://16089191 +@class NSURL; + +@interface Root +- (void)setFileURL : (NSURL *) arg; +- (void)setFile : (NSURL *) arg; +- (NSURL *)fileSys; +- (void)setFileSys : (NSURL *) arg; +- (NSURL *)fileKerl; +@end + +@interface SuperClass : Root +- (NSURL *)fileURL; +- (NSURL *)file; +- (NSURL *)fileLog; +- (void)setFileLog : (NSURL *) arg; +- (void)setFileKerl : (NSURL *) arg; +@end + +@protocol r16089191Protocol +@property (readonly) NSURL *fileURL; +@property (copy) NSURL *file; +@property (copy) NSURL *fileSys; +@property (copy) NSURL *fileLog; +@property (copy) NSURL *fileKerl; +@end + +@interface SubClass : SuperClass <r16089191Protocol> +@end + +@implementation SubClass +@end |

