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


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53987 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/CheckObjCDealloc.cpp b/lib/Analysis/CheckObjCDealloc.cpp
index 7bb0015..6da52ba 100644
--- a/lib/Analysis/CheckObjCDealloc.cpp
+++ b/lib/Analysis/CheckObjCDealloc.cpp
@@ -42,6 +42,13 @@
   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 @@
   //        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 @@
     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;
     }