aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/CheckObjCDealloc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Analysis/CheckObjCDealloc.cpp')
-rw-r--r--lib/Analysis/CheckObjCDealloc.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/Analysis/CheckObjCDealloc.cpp b/lib/Analysis/CheckObjCDealloc.cpp
index 7bb0015462..6da52baed2 100644
--- a/lib/Analysis/CheckObjCDealloc.cpp
+++ b/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;
}