]> granicus.if.org Git - clang/commitdiff
For the MissingDealloc check, don't treat IBOutlet ivars as being needed to be released
authorTed Kremenek <kremenek@apple.com>
Tue, 15 Jul 2008 23:04:27 +0000 (23:04 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 15 Jul 2008 23:04:27 +0000 (23:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53647 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CheckObjCDealloc.cpp
test/Analysis/IBOutlet.m [new file with mode: 0644]

index 0c9100951ce1983ba2e0284d1d19435fc280e3fc..7bb0015462bb99b6a578841f9ffa1b7b3f2ae02c 100644 (file)
@@ -60,9 +60,11 @@ void clang::CheckObjCDealloc(ObjCImplementationDecl* D,
   for (ObjCInterfaceDecl::ivar_iterator I=ID->ivar_begin(), E=ID->ivar_end();
        I!=E; ++I) {
     
-    QualType T = (*I)->getType();
+    ObjCIvarDecl* ID = *I;
+    QualType T = ID->getType();
     
-    if (T->isPointerType() || T->isObjCQualifiedIdType()) {
+    if ((T->isPointerType() || T->isObjCQualifiedIdType()) &&
+        ID->getAttr<IBOutletAttr>() == 0) { // Skip IBOutlets.
       containsPointerIvar = true;
       break;
     }
diff --git a/test/Analysis/IBOutlet.m b/test/Analysis/IBOutlet.m
new file mode 100644 (file)
index 0000000..4049e79
--- /dev/null
@@ -0,0 +1,20 @@
+// RUN: clang -warn-objc-missing-dealloc '-DIBOutlet=__attribute__((iboutlet))' %s --verify
+
+#ifndef IBOutlet
+#define IBOutlet
+#endif
+
+@class NSWindow;
+
+@interface NSObject {}
+- (void)dealloc;
+@end
+
+@interface A : NSObject {
+IBOutlet NSWindow *window;
+}
+@end
+
+@implementation A // no-warning
+@end
+