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));
 }
 
 //===----------------------------------------------------------------------===//