[cfe-commits] r54050 - /cfe/trunk/lib/Analysis/CheckObjCUnusedIVars.cpp
Ted Kremenek
kremenek at apple.com
Fri Jul 25 13:28:02 PDT 2008
Author: kremenek
Date: Fri Jul 25 15:28:02 2008
New Revision: 54050
URL: http://llvm.org/viewvc/llvm-project?rev=54050&view=rev
Log:
Have the UnusedIvar check skip ivars with setters/getters created by @synthesize.
Modified:
cfe/trunk/lib/Analysis/CheckObjCUnusedIVars.cpp
Modified: cfe/trunk/lib/Analysis/CheckObjCUnusedIVars.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CheckObjCUnusedIVars.cpp?rev=54050&r1=54049&r2=54050&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/CheckObjCUnusedIVars.cpp (original)
+++ cfe/trunk/lib/Analysis/CheckObjCUnusedIVars.cpp Fri Jul 25 15:28:02 2008
@@ -35,10 +35,24 @@
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 @@
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());
More information about the cfe-commits
mailing list