forked from OSchip/llvm-project
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:
parent
4e270380c1
commit
d91d21cc33
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue