[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