From 1a17942780f7022bab24b2aff90b3f5ffefa494b Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Tue, 18 Mar 2014 00:10:37 +0000 Subject: [PATCH] Objective-C. No need to issue deprecated warning if deprecated method in class extension is being implemented in primary class implementation (no overriding is involved). // rdar://16249335 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204093 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDeclObjC.cpp | 14 ++++++++++++-- test/SemaObjC/warn-deprecated-implementations.m | 16 ++++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 8f68852aaa..9982493ebc 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -372,6 +372,7 @@ void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) { IC->lookupMethod(MDecl->getSelector(), MDecl->isInstanceMethod()); if (IMD) { + ObjCCategoryDecl *CD = 0; ObjCImplDecl *ImplDeclOfMethodDef = dyn_cast(MDecl->getDeclContext()); ObjCContainerDecl *ContDeclOfMethodDecl = @@ -379,11 +380,20 @@ void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) { ObjCImplDecl *ImplDeclOfMethodDecl = 0; if (ObjCInterfaceDecl *OID = dyn_cast(ContDeclOfMethodDecl)) ImplDeclOfMethodDecl = OID->getImplementation(); - else if (ObjCCategoryDecl *CD = dyn_cast(ContDeclOfMethodDecl)) + else if ((CD = dyn_cast(ContDeclOfMethodDecl))) { ImplDeclOfMethodDecl = CD->getImplementation(); + } + bool warn; + // No need to issue deprecated warning if deprecated method in class + // extension is being implemented in primary class implementation + // (no overriding is involved). + if (ImplDeclOfMethodDef && CD && CD->IsClassExtension()) + warn = false; + else // 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) + warn = (!ImplDeclOfMethodDecl || ImplDeclOfMethodDecl != ImplDeclOfMethodDef); + if (warn) DiagnoseObjCImplementedDeprecations(*this, dyn_cast(IMD), MDecl->getLocation(), 0); diff --git a/test/SemaObjC/warn-deprecated-implementations.m b/test/SemaObjC/warn-deprecated-implementations.m index e346fbebec..6e208b5be7 100644 --- a/test/SemaObjC/warn-deprecated-implementations.m +++ b/test/SemaObjC/warn-deprecated-implementations.m @@ -11,13 +11,13 @@ @end @interface A() -- (void) E __attribute__((deprecated)); // expected-note {{method 'E' declared here}} +- (void) E __attribute__((deprecated)); @end @implementation A + (void)F { } // No warning, implementing its own deprecated method - (void) D {} // expected-warning {{Implementing deprecated method}} -- (void) E {} // expected-warning {{Implementing deprecated method}} +- (void) E {} // No warning, implementing deprecated method in its class extension. @end @interface A(CAT) @@ -53,3 +53,15 @@ __attribute__((deprecated)) - (void) B {} // expected-warning {{Implementing deprecated method}} @end +@interface Test +@end + +@interface Test() +- (id)initSpecialInPrivateHeader __attribute__((deprecated)); +@end + +@implementation Test +- (id)initSpecialInPrivateHeader { + return (void *)0; +} +@end -- 2.40.0