diff options
| author | Ted Kremenek <kremenek@apple.com> | 2008-07-25 20:28:02 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2008-07-25 20:28:02 +0000 |
| commit | d074ce47b61ba70907e92fa2244bb75bd2e1639c (patch) | |
| tree | c97fb70826c40828ecaab977b10c99cb9b510b18 /clang/lib/Analysis | |
| parent | 448b0cb033469b13c86ea39aef58c11a566ebc14 (diff) | |
| download | bcm5719-llvm-d074ce47b61ba70907e92fa2244bb75bd2e1639c.tar.gz bcm5719-llvm-d074ce47b61ba70907e92fa2244bb75bd2e1639c.zip | |
Have the UnusedIvar check skip ivars with setters/getters created by @synthesize.
llvm-svn: 54050
Diffstat (limited to 'clang/lib/Analysis')
| -rw-r--r-- | clang/lib/Analysis/CheckObjCUnusedIVars.cpp | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/clang/lib/Analysis/CheckObjCUnusedIVars.cpp b/clang/lib/Analysis/CheckObjCUnusedIVars.cpp index d536ea4bdbf..45630c63bb8 100644 --- a/clang/lib/Analysis/CheckObjCUnusedIVars.cpp +++ b/clang/lib/Analysis/CheckObjCUnusedIVars.cpp @@ -35,10 +35,24 @@ static void Scan(IvarUsageMap& M, Stmt* S) { ObjCIvarDecl* D = Ex->getDecl(); IvarUsageMap::iterator I = M.find(D); if (I != M.end()) I->second = Used; + return; } - else - for (Stmt::child_iterator I=S->child_begin(), E=S->child_end(); I!=E;++I) - Scan(M, *I); + + for (Stmt::child_iterator I=S->child_begin(), E=S->child_end(); I!=E;++I) + Scan(M, *I); +} + +static void Scan(IvarUsageMap& M, ObjCPropertyImplDecl* D) { + if (!D) + return; + + ObjCIvarDecl* ID = D->getPropertyIvarDecl(); + + if (!ID) + return; + + IvarUsageMap::iterator I = M.find(ID); + if (I != M.end()) I->second = Used; } void clang::CheckObjCUnusedIvar(ObjCImplementationDecl* D, BugReporter& BR) { @@ -73,13 +87,21 @@ void clang::CheckObjCUnusedIvar(ObjCImplementationDecl* D, BugReporter& BR) { E = D->instmeth_end(); I!=E; ++I) Scan(M, (*I)->getBody()); + // Scan for @synthesized property methods that act as setters/getters + // to an ivar. + for (ObjCImplementationDecl::propimpl_iterator I = D->propimpl_begin(), + E = D->propimpl_end(); I!=E; ++I) + Scan(M, *I); + // Find ivars that are unused. for (IvarUsageMap::iterator I = M.begin(), E = M.end(); I!=E; ++I) if (I->second == Unused) { std::ostringstream os; os << "Instance variable '" << I->first->getName() - << "' in class '" << ID->getName() << "' is never used."; + << "' in class '" << ID->getName() + << "' is never used by the methods in its @implementation " + "(although it may be used by category methods)."; BR.EmitBasicReport("unused ivar", os.str().c_str(), I->first->getLocation()); |

