summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-07-25 20:28:02 +0000
committerTed Kremenek <kremenek@apple.com>2008-07-25 20:28:02 +0000
commitd074ce47b61ba70907e92fa2244bb75bd2e1639c (patch)
treec97fb70826c40828ecaab977b10c99cb9b510b18 /clang/lib/Analysis
parent448b0cb033469b13c86ea39aef58c11a566ebc14 (diff)
downloadbcm5719-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.cpp30
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());
OpenPOWER on IntegriCloud