24#include "llvm/ADT/STLExtras.h" 
   38    IvarUsageMap::iterator I = M.find(D);
 
   45  if (
const BlockExpr *BE = dyn_cast<BlockExpr>(S)) {
 
   46    Scan(M, BE->getBody());
 
   51    for (
const Expr *sub : POE->semantics()) {
 
   53        sub = OVE->getSourceExpr();
 
 
   70  IvarUsageMap::iterator I = M.find(ID);
 
 
   78    Scan(M, I->getBody());
 
   83    for (
const auto *I : ID->property_impls())
 
   87    for (
const auto *Cat : ID->getClassInterface()->visible_categories()) {
 
 
   96  for (
const auto *I : 
C->decls())
 
   97    if (
const auto *FD = dyn_cast<FunctionDecl>(I)) {
 
   99      if (
SM.getFileID(L) == FID)
 
  100        Scan(M, FD->getBody());
 
 
  112  for (
const auto *Ivar : ID->ivars()) {
 
  119        Ivar->hasAttr<UnusedAttr>() || Ivar->hasAttr<IBOutletAttr>() ||
 
  120        Ivar->hasAttr<IBOutletCollectionAttr>() || Ivar->isUnnamedBitField())
 
  133  bool hasUnused = 
false;
 
  134  for (
IVarState State : llvm::make_second_range(M))
 
  152  for (
auto [Ivar, State] : M)
 
  155      llvm::raw_string_ostream os(sbuf);
 
  156      os << 
"Instance variable '" << *Ivar << 
"' in class '" << *ID
 
  157         << 
"' is never used by the methods in its @implementation " 
  158            "(although it may be used by category methods).";
 
  163                         "Optimization", os.str(), L);
 
 
  172class ObjCUnusedIvarsChecker : 
public Checker<
 
  173                                      check::ASTDecl<ObjCImplementationDecl> > {
 
  175  void checkASTDecl(
const ObjCImplementationDecl *D, AnalysisManager& mgr,
 
  176                    BugReporter &BR)
 const {
 
  186bool ento::shouldRegisterObjCUnusedIvarsChecker(
const CheckerManager &mgr) {
 
static void checkObjCUnusedIvar(const ObjCImplementationDecl *D, BugReporter &BR, const CheckerBase *Checker)
llvm::DenseMap< const ObjCIvarDecl *, IVarState > IvarUsageMap
static void Scan(IvarUsageMap &M, const Stmt *S)
Defines the SourceManager interface.
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
SourceLocation getLocation() const
DeclContext * getDeclContext()
This represents one expression.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCContainerDecl - Represents a container for method declarations.
instmeth_range instance_methods() const
const ObjCInterfaceDecl * getClassInterface() const
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Represents an ObjC class declaration.
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
ObjCIvarDecl * getPropertyIvarDecl() const
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
Encodes a location in the source.
This class handles loading and caching of source files into memory.
Stmt - This represents one statement.
BugReporter is a utility class for generating PathDiagnostics for analysis.
const SourceManager & getSourceManager()
void EmitBasicReport(const Decl *DeclWithIssue, const CheckerFrontend *Checker, StringRef BugName, StringRef BugCategory, StringRef BugStr, PathDiagnosticLocation Loc, ArrayRef< SourceRange > Ranges={}, ArrayRef< FixItHint > Fixits={})
The non-templated common ancestor of all the simple Checker<...> classes.
CHECKER * registerChecker(AT &&...Args)
Register a single-part checker (derived from Checker): construct its singleton instance,...
Simple checker classes that implement one frontend (i.e.
static PathDiagnosticLocation create(const Decl *D, const SourceManager &SM)
Create a location corresponding to the given declaration.
The JSON file list parser is used to communicate input to InstallAPI.