aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/BugReporter.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-04-22 16:15:03 +0000
committerTed Kremenek <kremenek@apple.com>2008-04-22 16:15:03 +0000
commit5585114307b6ba4874546212cb6e5399cfff7ffb (patch)
tree78ae330d04a81719d4b7b155fdb9d753f9f0f37f /lib/Analysis/BugReporter.cpp
parent5fc073fe3be1830c4479253b59ccd45eb5614c55 (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.cpp27
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,