diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-08-07 21:13:23 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-08-07 21:13:23 +0000 |
commit | 35ffcf3c2a054ee124fe8d47152c5d1bcdf86261 (patch) | |
tree | e2fe409aa13d84b9d07b0db4d5aef2e8f52cedf8 /lib/Analysis/CheckObjCUnusedIVars.cpp | |
parent | 0b2dd776318e612c682d32e1f4ca70f7b223c05e (diff) |
Fix: <rdar://problem/7075531> static analyzer wrongly detects unused ivars used in blocks
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78409 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/CheckObjCUnusedIVars.cpp')
-rw-r--r-- | lib/Analysis/CheckObjCUnusedIVars.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/Analysis/CheckObjCUnusedIVars.cpp b/lib/Analysis/CheckObjCUnusedIVars.cpp index dbc90d65c3..3a69e00499 100644 --- a/lib/Analysis/CheckObjCUnusedIVars.cpp +++ b/lib/Analysis/CheckObjCUnusedIVars.cpp @@ -30,14 +30,20 @@ static void Scan(IvarUsageMap& M, const Stmt* S) { if (!S) return; - if (const ObjCIvarRefExpr* Ex = dyn_cast<ObjCIvarRefExpr>(S)) { - const ObjCIvarDecl* D = Ex->getDecl(); + if (const ObjCIvarRefExpr *Ex = dyn_cast<ObjCIvarRefExpr>(S)) { + const ObjCIvarDecl *D = Ex->getDecl(); IvarUsageMap::iterator I = M.find(D); if (I != M.end()) I->second = Used; return; } + // Blocks can reference an instance variable of a class. + if (const BlockExpr *BE = dyn_cast<BlockExpr>(S)) { + Scan(M, BE->getBody()); + return; + } + for (Stmt::const_child_iterator I=S->child_begin(),E=S->child_end(); I!=E;++I) Scan(M, *I); } |