From 46abc7db6be1805fcc7e0e22cc511918e1ba5678 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Wed, 23 Jul 2008 18:21:36 +0000 Subject: [PATCH] Properly skip IBOutlets when checking for unused ivars. Refine the error message of unused ivars. Added test case. llvm-svn: 53957 --- clang/lib/Analysis/CheckObjCUnusedIVars.cpp | 10 ++++++---- clang/test/Analysis/unused-ivars.m | 10 ++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 clang/test/Analysis/unused-ivars.m diff --git a/clang/lib/Analysis/CheckObjCUnusedIVars.cpp b/clang/lib/Analysis/CheckObjCUnusedIVars.cpp index d074dde8a3c9..d536ea4bdbfa 100644 --- a/clang/lib/Analysis/CheckObjCUnusedIVars.cpp +++ b/clang/lib/Analysis/CheckObjCUnusedIVars.cpp @@ -57,8 +57,9 @@ void clang::CheckObjCUnusedIvar(ObjCImplementationDecl* D, BugReporter& BR) { // Ignore ivars that aren't private. if (ID->getAccessControl() != ObjCIvarDecl::Private) continue; - - if (ID->getAttr() == 0) + + // Skip IB Outlets. + if (ID->getAttr()) continue; M[ID] = Unused; @@ -77,8 +78,9 @@ void clang::CheckObjCUnusedIvar(ObjCImplementationDecl* D, BugReporter& BR) { if (I->second == Unused) { std::ostringstream os; - os << "Private ivar '" << I->first->getName() << "' is never used."; - + os << "Instance variable '" << I->first->getName() + << "' in class '" << ID->getName() << "' is never used."; + BR.EmitBasicReport("unused ivar", os.str().c_str(), I->first->getLocation()); } diff --git a/clang/test/Analysis/unused-ivars.m b/clang/test/Analysis/unused-ivars.m new file mode 100644 index 000000000000..c29e243fc36d --- /dev/null +++ b/clang/test/Analysis/unused-ivars.m @@ -0,0 +1,10 @@ +// RUN: clang -warn-objc-unused-ivars %s -verify + +@interface A +{ + @private int x; // expected-warning {{Instance variable 'x' in class 'A' is never used.}} +} +@end + +@implementation A @end +