diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-07-24 17:45:56 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-07-24 17:45:56 +0000 |
commit | f071e1837309c63dfc26d0e3f2a1a29a214a6c12 (patch) | |
tree | 9a93e12b2d97eac9b5281f5a379872d1b0983cc4 /lib/Analysis/CheckObjCDealloc.cpp | |
parent | 25460259a635465f9d36e61865bc4bf1e3e36945 (diff) |
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
Diffstat (limited to 'lib/Analysis/CheckObjCDealloc.cpp')
-rw-r--r-- | lib/Analysis/CheckObjCDealloc.cpp | 11 |
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; } |