objective-C: Do not issue deprecated warning about implementation

of a deprecated method in original class (or category), only
in overrides. // rdar://12717705

llvm-svn: 168270
This commit is contained in:
Fariborz Jahanian 2012-11-17 20:53:53 +00:00
parent 4e270380c1
commit d91d21cc33
2 changed files with 26 additions and 4 deletions

View File

@ -373,10 +373,23 @@ void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) {
ObjCMethodDecl *IMD =
IC->lookupMethod(MDecl->getSelector(), MDecl->isInstanceMethod());
if (IMD)
if (IMD) {
ObjCImplDecl *ImplDeclOfMethodDef =
dyn_cast<ObjCImplDecl>(MDecl->getDeclContext());
ObjCContainerDecl *ContDeclOfMethodDecl =
dyn_cast<ObjCContainerDecl>(IMD->getDeclContext());
ObjCImplDecl *ImplDeclOfMethodDecl = 0;
if (ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(ContDeclOfMethodDecl))
ImplDeclOfMethodDecl = OID->getImplementation();
else if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(ContDeclOfMethodDecl))
ImplDeclOfMethodDecl = CD->getImplementation();
// No need to issue deprecated warning if deprecated mehod in class/category
// is being implemented in its own implementation (no overriding is involved).
if (!ImplDeclOfMethodDecl || ImplDeclOfMethodDecl != ImplDeclOfMethodDef)
DiagnoseObjCImplementedDeprecations(*this,
dyn_cast<NamedDecl>(IMD),
MDecl->getLocation(), 0);
}
// If this is "dealloc" or "finalize", set some bit here.
// Then in ActOnSuperMessage() (SemaExprObjC), set it back to false.

View File

@ -1,12 +1,13 @@
// RUN: %clang_cc1 -fsyntax-only -Wdeprecated-implementations -verify -Wno-objc-root-class %s
// rdar://8973810
// rdar://12717705
@protocol P
- (void) D __attribute__((deprecated)); // expected-note {{method 'D' declared here}}
@end
@interface A <P>
+ (void)F __attribute__((deprecated)); // expected-note {{method 'F' declared here}}
+ (void)F __attribute__((deprecated));
@end
@interface A()
@ -14,11 +15,19 @@
@end
@implementation A
+ (void)F { } // expected-warning {{Implementing deprecated method}}
+ (void)F { } // No warning, implementing its own deprecated method
- (void) D {} // expected-warning {{Implementing deprecated method}}
- (void) E {} // expected-warning {{Implementing deprecated method}}
@end
@interface A(CAT)
- (void) G __attribute__((deprecated));
@end
@implementation A(CAT)
- (void) G {} // No warning, implementing its own deprecated method
@end
__attribute__((deprecated))
@interface CL // expected-note 2 {{class declared here}} // expected-note 2 {{declared here}}
@end