Index: clang/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h =================================================================== --- clang/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h +++ clang/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h @@ -65,8 +65,6 @@ /// by a sink node. bool isSuppressOnSink() const { return SuppressOnSink; } void setSuppressOnSink(bool x) { SuppressOnSink = x; } - - virtual void FlushReports(BugReporter& BR); }; class BuiltinBug : public BugType { Index: clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h =================================================================== --- clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h +++ clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h @@ -162,10 +162,6 @@ return getSValBuilder().getSymbolManager(); } - bool isObjCGCEnabled() const { - return Eng.isObjCGCEnabled(); - } - ProgramStateManager &getStateManager() { return Eng.getStateManager(); } Index: clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h =================================================================== --- clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -141,9 +141,6 @@ /// implicitly never returns. ObjCNoReturn ObjCNoRet; - /// Whether or not GC is enabled in this analysis. - bool ObjCGCEnabled; - /// The BugReporter associated with this engine. It is important that /// this object be placed at the very end of member variables so that its /// destructor is called before the rest of the ExprEngine is destroyed. @@ -201,8 +198,6 @@ return *currBldrCtx; } - bool isObjCGCEnabled() { return ObjCGCEnabled; } - const Stmt *getStmt() const; void GenerateAutoTransition(ExplodedNode *N); Index: clang/lib/StaticAnalyzer/Core/BugReporter.cpp =================================================================== --- clang/lib/StaticAnalyzer/Core/BugReporter.cpp +++ clang/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -2023,8 +2023,6 @@ void BugType::anchor() {} -void BugType::FlushReports(BugReporter &BR) {} - void BuiltinBug::anchor() {} //===----------------------------------------------------------------------===// @@ -2253,14 +2251,6 @@ if (BugTypes.isEmpty()) return; - // First flush the warnings for each BugType. This may end up creating new - // warnings and new BugTypes. - // FIXME: Only NSErrorChecker needs BugType's FlushReports. - // Turn NSErrorChecker into a proper checker and remove this. - SmallVector bugTypes(BugTypes.begin(), BugTypes.end()); - for (const auto I : bugTypes) - const_cast(I)->FlushReports(*this); - // We need to flush reports in deterministic order to ensure the order // of the reports is consistent between runs. for (const auto EQ : EQClassesVector) Index: clang/lib/StaticAnalyzer/Core/ExprEngine.cpp =================================================================== --- clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -189,7 +189,7 @@ this), SymMgr(StateMgr.getSymbolManager()), svalBuilder(StateMgr.getSValBuilder()), ObjCNoRet(mgr.getASTContext()), - ObjCGCEnabled(gcEnabled), BR(mgr, *this), + BR(mgr, *this), VisitedCallees(VisitedCalleesIn), HowToInline(HowToInlineIn) { unsigned TrimInterval = mgr.options.getGraphTrimInterval(); if (TrimInterval != 0) { @@ -3184,11 +3184,6 @@ if (trim) { std::vector Src; - // Flush any outstanding reports to make sure we cover all the nodes. - // This does not cause them to get displayed. - for (const auto I : BR) - const_cast(I)->FlushReports(BR); - // Iterate through the reports and get their nodes. for (BugReporter::EQClasses_iterator EI = BR.EQClasses_begin(), EE = BR.EQClasses_end(); EI != EE; ++EI) {