summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-07-24 17:45:56 +0000
committerTed Kremenek <kremenek@apple.com>2008-07-24 17:45:56 +0000
commit0e60b7588aeea59a61155aa0d0f0b1735ca95a62 (patch)
tree68b9efbb106f8c88c372cbc65504ff4b0421ae20
parent66cd9a32d23991408de2f39ce0812fb60300eb37 (diff)
downloadbcm5719-llvm-0e60b7588aeea59a61155aa0d0f0b1735ca95a62.tar.gz
bcm5719-llvm-0e60b7588aeea59a61155aa0d0f0b1735ca95a62.zip
Don't issue a missing +dealloc warning for classes that just contain SEL ivars.
This fixes PR 2592: http://llvm.org/bugs/show_bug.cgi?id=2592 llvm-svn: 53987
-rw-r--r--clang/lib/Analysis/CheckObjCDealloc.cpp11
-rw-r--r--clang/test/Analysis/IBOutlet.m20
-rw-r--r--clang/test/Analysis/MissingDealloc_SEL.m30
3 files changed, 40 insertions, 21 deletions
diff --git a/clang/lib/Analysis/CheckObjCDealloc.cpp b/clang/lib/Analysis/CheckObjCDealloc.cpp
index 7bb0015462b..6da52baed2f 100644
--- a/clang/lib/Analysis/CheckObjCDealloc.cpp
+++ b/clang/lib/Analysis/CheckObjCDealloc.cpp
@@ -42,6 +42,13 @@ static bool scan_dealloc(Stmt* S, Selector Dealloc) {
return false;
}
+static bool isSEL(QualType T, IdentifierInfo* SelII) {
+ if (const TypedefType* Ty = T->getAsTypedefType())
+ return Ty->getDecl()->getIdentifier() == SelII;
+
+ return false;
+}
+
void clang::CheckObjCDealloc(ObjCImplementationDecl* D,
const LangOptions& LOpts, BugReporter& BR) {
@@ -56,6 +63,7 @@ void clang::CheckObjCDealloc(ObjCImplementationDecl* D,
// http://llvm.org/bugs/show_bug.cgi?id=2517
bool containsPointerIvar = false;
+ IdentifierInfo* SelII = &Ctx.Idents.get("SEL");
for (ObjCInterfaceDecl::ivar_iterator I=ID->ivar_begin(), E=ID->ivar_end();
I!=E; ++I) {
@@ -64,7 +72,8 @@ void clang::CheckObjCDealloc(ObjCImplementationDecl* D,
QualType T = ID->getType();
if ((T->isPointerType() || T->isObjCQualifiedIdType()) &&
- ID->getAttr<IBOutletAttr>() == 0) { // Skip IBOutlets.
+ (ID->getAttr<IBOutletAttr>() == 0 && // Skip IBOutlets.
+ !isSEL(T, SelII))) { // Skip SEL ivars.
containsPointerIvar = true;
break;
}
diff --git a/clang/test/Analysis/IBOutlet.m b/clang/test/Analysis/IBOutlet.m
deleted file mode 100644
index 4049e795547..00000000000
--- a/clang/test/Analysis/IBOutlet.m
+++ /dev/null
@@ -1,20 +0,0 @@
-// 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
-
diff --git a/clang/test/Analysis/MissingDealloc_SEL.m b/clang/test/Analysis/MissingDealloc_SEL.m
new file mode 100644
index 00000000000..be3e0b7af81
--- /dev/null
+++ b/clang/test/Analysis/MissingDealloc_SEL.m
@@ -0,0 +1,30 @@
+// RUN: clang -warn-objc-missing-dealloc -verify %s
+
+typedef struct objc_selector *SEL;
+typedef signed char BOOL;
+typedef unsigned int NSUInteger;
+typedef struct _NSZone NSZone;
+@protocol NSObject
+- (BOOL)isEqual:(id)object;
+@end
+@interface NSObject <NSObject> {}
+- (id)init;
+@end
+
+@interface TestSELs : NSObject {
+ SEL a;
+ SEL b;
+}
+
+@end
+
+@implementation TestSELs // no-warning
+- (id)init {
+ if( (self = [super init]) ) {
+ a = @selector(a);
+ b = @selector(b);
+ }
+
+ return self;
+}
+@end
OpenPOWER on IntegriCloud