Static Analyzer Diagnostics: Switch CFRefCount to using the new visitor API. BugReport no longer needs to inherit from BugReporterVisitor.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@138142 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/StaticAnalyzer/Core/BugReporter.cpp b/lib/StaticAnalyzer/Core/BugReporter.cpp
index fb0331c..df3ebb8 100644
--- a/lib/StaticAnalyzer/Core/BugReporter.cpp
+++ b/lib/StaticAnalyzer/Core/BugReporter.cpp
@@ -1224,9 +1224,7 @@
BugReport::~BugReport() {
for (visitor_iterator I = visitor_begin(), E = visitor_end(); I != E; ++I) {
- if ((*I)->isOwnedByReporterContext()) {
- delete *I;
- }
+ delete *I;
}
}
@@ -1340,13 +1338,6 @@
return FullSourceLoc();
}
-PathDiagnosticPiece *BugReport::VisitNode(const ExplodedNode *N,
- const ExplodedNode *PrevN,
- BugReporterContext &BRC,
- BugReport &BR) {
- return NULL;
-}
-
//===----------------------------------------------------------------------===//
// Methods for BugReporter and subclasses.
//===----------------------------------------------------------------------===//
diff --git a/lib/StaticAnalyzer/Core/CFRefCount.cpp b/lib/StaticAnalyzer/Core/CFRefCount.cpp
index 78325f3..9e6d829 100644
--- a/lib/StaticAnalyzer/Core/CFRefCount.cpp
+++ b/lib/StaticAnalyzer/Core/CFRefCount.cpp
@@ -1959,6 +1959,26 @@
// Bug Reports. //
//===---------===//
+ class CFRefReportVisitor : public BugReporterVisitor {
+ SymbolRef Sym;
+ const CFRefCount &TF;
+ public:
+
+ CFRefReportVisitor(SymbolRef sym, const CFRefCount &tf)
+ : Sym(sym), TF(tf) {}
+
+ void Profile(llvm::FoldingSetNodeID &ID) const {
+ static int x = 0;
+ ID.AddPointer(&x);
+ ID.AddPointer(Sym);
+ }
+
+ PathDiagnosticPiece *VisitNode(const ExplodedNode *N,
+ const ExplodedNode *PrevN,
+ BugReporterContext &BRC,
+ BugReport &BR);
+ };
+
class CFRefReport : public BugReport {
protected:
SymbolRef Sym;
@@ -1966,11 +1986,15 @@
public:
CFRefReport(CFRefBug& D, const CFRefCount &tf,
ExplodedNode *n, SymbolRef sym)
- : BugReport(D, D.getDescription(), n), Sym(sym), TF(tf) {}
+ : BugReport(D, D.getDescription(), n), Sym(sym), TF(tf) {
+ addVisitor(new CFRefReportVisitor(sym, tf));
+ }
CFRefReport(CFRefBug& D, const CFRefCount &tf,
ExplodedNode *n, SymbolRef sym, StringRef endText)
- : BugReport(D, D.getDescription(), endText, n), Sym(sym), TF(tf) {}
+ : BugReport(D, D.getDescription(), endText, n), Sym(sym), TF(tf) {
+ addVisitor(new CFRefReportVisitor(sym, tf));
+ }
virtual ~CFRefReport() {}
@@ -1991,11 +2015,6 @@
const ExplodedNode *N);
std::pair<const char**,const char**> getExtraDescriptiveText();
-
- PathDiagnosticPiece *VisitNode(const ExplodedNode *N,
- const ExplodedNode *PrevN,
- BugReporterContext &BRC,
- BugReport &BR);
};
class CFRefLeakReport : public CFRefReport {
@@ -2060,10 +2079,10 @@
return false;
}
-PathDiagnosticPiece *CFRefReport::VisitNode(const ExplodedNode *N,
- const ExplodedNode *PrevN,
- BugReporterContext &BRC,
- BugReport &BR) {
+PathDiagnosticPiece *CFRefReportVisitor::VisitNode(const ExplodedNode *N,
+ const ExplodedNode *PrevN,
+ BugReporterContext &BRC,
+ BugReport &BR) {
if (!isa<PostStmt>(N->getLocation()))
return NULL;
@@ -2113,7 +2132,7 @@
if (CurrV.isOwned()) {
os << "+1 retain count";
- if (static_cast<CFRefBug&>(getBugType()).getTF().isGCEnabled()) {
+ if (TF.isGCEnabled()) {
assert(CurrV.getObjKind() == RetEffect::CF);
os << ". "
"Core Foundation objects are not automatically garbage collected.";
@@ -2507,6 +2526,8 @@
// FIXME: AllocBinding doesn't get populated for RegionStore yet.
if (AllocBinding)
os << " and stored into '" << AllocBinding->getString() << '\'';
+
+ addVisitor(new CFRefReportVisitor(sym, tf));
}
//===----------------------------------------------------------------------===//