]> granicus.if.org Git - clang/commitdiff
Objctive-C. warn if dealloc is being overridden in
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 17 Dec 2013 22:44:28 +0000 (22:44 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 17 Dec 2013 22:44:28 +0000 (22:44 +0000)
a category implementation. // rdar://15397430

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@197534 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticGroups.td
include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDeclObjC.cpp
test/SemaObjC/dealloc.m

index 1be01a2ed496435e67ff6564344b6498d0e503f1..1c69e0075fb333cbb48eee80b250806bc0f4a019 100644 (file)
@@ -385,6 +385,7 @@ def ARCRepeatedUseOfWeak : DiagGroup<"arc-repeated-use-of-weak",
                                      [ARCRepeatedUseOfWeakMaybe]>;
 def ObjCBridge : DiagGroup<"bridge-cast">;
 
+def DeallocInCategory:DiagGroup<"dealloc-in-category">;
 def SelectorTypeMismatch : DiagGroup<"selector-type-mismatch">;
 def Selector : DiagGroup<"selector", [SelectorTypeMismatch]>;
 def Protocol : DiagGroup<"protocol">;
index 19456297f24ceb82949aa73ba08ab11ae53545bc..d257e1750181a7ec3cf30de2d61e47679235494a 100644 (file)
@@ -776,6 +776,9 @@ def err_arc_perform_selector_retains : Error<
 def warn_arc_perform_selector_leaks : Warning<
   "performSelector may cause a leak because its selector is unknown">,
   InGroup<DiagGroup<"arc-performSelector-leaks">>;
+def warn_dealloc_in_category : Warning<
+"decalloc is being overridden in category">,
+InGroup<DeallocInCategory>;
 def err_gc_weak_property_strong_type : Error<
   "weak attribute declared on a __strong type property in GC mode">;
 def warn_receiver_is_weak : Warning <
index 9f50a207c1a8aa09880c0ac281e51f2a82655780..d536f33c085f3e95232dba05d83c2736a19499ab 100644 (file)
@@ -3213,6 +3213,14 @@ Decl *Sema::ActOnMethodDeclaration(
       ObjCMethod->addAttr(
         new (Context) ObjCRequiresSuperAttr(ObjCMethod->getLocation(), Context));
     }
+    if (isa<ObjCCategoryImplDecl>(ImpDecl)) {
+      ObjCMethodFamily family = ObjCMethod->getMethodFamily();
+      if (family == OMF_dealloc && IMD && IMD->isOverriding()) {
+        Diag(ObjCMethod->getLocation(), diag::warn_dealloc_in_category)
+          << ObjCMethod->getDeclName();
+        Diag(ImpDecl->getLocation(), diag::note_declared_at);
+      }
+    }
   } else {
     cast<DeclContext>(ClassDecl)->addDecl(ObjCMethod);
   }
index 59218d2d0733649b27ba0cba50e3987e1fa32f3c..4e61424e686afa67183ef54cff373d9ebd4e5be3 100644 (file)
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -fblocks -verify %s
-// RUN: not %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -fblocks -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -fblocks -Wdealloc-in-category -verify %s
+// RUN: not %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -fblocks -Wdealloc-in-category -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
 // rdar://11987838
 
 @protocol NSObject
 
 @end
 
+// rdar://15397430
+@interface Base
+- (void)dealloc;
+@end
+
+@interface Subclass : Base
+@end 
+
+@interface Subclass (CAT)
+- (void)dealloc;
+@end
+
+@implementation Subclass (CAT) // expected-note {{declared here}}
+- (void)dealloc { // expected-warning {{decalloc is being overridden in category}}
+}
+@end