diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-04-22 16:15:03 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-04-22 16:15:03 +0000 |
commit | 5585114307b6ba4874546212cb6e5399cfff7ffb (patch) | |
tree | 78ae330d04a81719d4b7b155fdb9d753f9f0f37f /lib/Analysis/BugReporter.cpp | |
parent | 5fc073fe3be1830c4479253b59ccd45eb5614c55 (diff) |
PathDiagnosticClients now retain ownership of passed PathDiagnostics, requiring
them to not be stack-allocated.
HTMLDiagnostics now batches PathDiagnostics before emitting HTML in its dtor.
This is a workaround for a problem when we trampled the Preprocessor state
when highlighting macros (sometimes resulting in an assertion failure).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50102 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BugReporter.cpp')
-rw-r--r-- | lib/Analysis/BugReporter.cpp | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/lib/Analysis/BugReporter.cpp b/lib/Analysis/BugReporter.cpp index 6b68d7f70e..be1c52d521 100644 --- a/lib/Analysis/BugReporter.cpp +++ b/lib/Analysis/BugReporter.cpp @@ -382,52 +382,51 @@ void BugReporter::EmitWarning(BugReport& R) { if (R.getBugType().isCached(R)) return; - PathDiagnostic D(R.getName()); - GeneratePathDiagnostic(D, R); + llvm::OwningPtr<PathDiagnostic> D(new PathDiagnostic(R.getName())); + GeneratePathDiagnostic(*D.get(), R); // Emit a full diagnostic for the path if we have a PathDiagnosticClient. - if (PD && !D.empty()) { - PD->HandlePathDiagnostic(D); + if (PD && !D->empty()) { + PD->HandlePathDiagnostic(D.take()); return; } // We don't have a PathDiagnosticClient, but we can still emit a single // line diagnostic. Determine the location. - FullSourceLoc L = D.empty() ? R.getLocation(Ctx.getSourceManager()) - : D.back()->getLocation(); + FullSourceLoc L = D->empty() ? R.getLocation(Ctx.getSourceManager()) + : D->back()->getLocation(); // Determine the range. const SourceRange *Beg, *End; - if (!D.empty()) { - Beg = D.back()->ranges_begin(); - End = D.back()->ranges_end(); + if (!D->empty()) { + Beg = D->back()->ranges_begin(); + End = D->back()->ranges_end(); } else R.getRanges(Beg, End); if (PD) { - PathDiagnostic D(R.getName()); PathDiagnosticPiece* piece = new PathDiagnosticPiece(L, R.getDescription()); for ( ; Beg != End; ++Beg) piece->addRange(*Beg); - D.push_back(piece); - PD->HandlePathDiagnostic(D); + D->push_back(piece); + PD->HandlePathDiagnostic(D.take()); } else { std::ostringstream os; os << "[CHECKER] "; - if (D.empty()) + if (D->empty()) os << R.getDescription(); else - os << D.back()->getString(); + os << D->back()->getString(); unsigned ErrorDiag = Diag.getCustomDiagID(Diagnostic::Warning, |