]> granicus.if.org Git - clang/commitdiff
Have the UnusedIvar check skip ivars with setters/getters created by @synthesize.
authorTed Kremenek <kremenek@apple.com>
Fri, 25 Jul 2008 20:28:02 +0000 (20:28 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 25 Jul 2008 20:28:02 +0000 (20:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54050 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CheckObjCUnusedIVars.cpp

index d536ea4bdbfad824ed0602bd749b470990098780..45630c63bb8d6bb103dd999f9fb8c8876e8beab4 100644 (file)
@@ -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());