diff --git a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp --- a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp @@ -337,11 +337,15 @@ class RefLeakReportVisitor : public RefCountReportVisitor { public: - RefLeakReportVisitor(SymbolRef sym) : RefCountReportVisitor(sym) {} + RefLeakReportVisitor(SymbolRef Sym, const MemRegion *FirstBinding) + : RefCountReportVisitor(Sym), FirstBinding(FirstBinding) {} PathDiagnosticPieceRef getEndPath(BugReporterContext &BRC, const ExplodedNode *N, PathSensitiveBugReport &BR) override; + +private: + const MemRegion *FirstBinding; }; } // end namespace retaincountchecker @@ -729,14 +733,6 @@ // assigned to different variables, etc. BR.markInteresting(Sym); - // We are reporting a leak. Walk up the graph to get to the first node where - // the symbol appeared, and also get the first VarDecl that tracked object - // is stored to. - AllocationInfo AllocI = GetAllocationSite(BRC.getStateManager(), EndN, Sym); - - const MemRegion* FirstBinding = AllocI.R; - BR.markInteresting(AllocI.InterestingMethodContext); - PathDiagnosticLocation L = cast(BR).getEndOfPath(); std::string sbuf; @@ -902,15 +898,15 @@ } RefLeakReport::RefLeakReport(const RefCountBug &D, const LangOptions &LOpts, - ExplodedNode *n, SymbolRef sym, + ExplodedNode *N, SymbolRef Sym, CheckerContext &Ctx) - : RefCountReport(D, LOpts, n, sym, /*isLeak=*/true) { + : RefCountReport(D, LOpts, N, Sym, /*isLeak=*/true) { - deriveAllocLocation(Ctx, sym); + deriveAllocLocation(Ctx, Sym); if (!AllocBinding) - deriveParamLocation(Ctx, sym); + deriveParamLocation(Ctx, Sym); createDescription(Ctx); - addVisitor(std::make_unique(sym)); + addVisitor(std::make_unique(Sym, AllocBinding)); }