diff options
-rw-r--r-- | lib/StaticAnalyzer/Core/BugReporter.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/StaticAnalyzer/Core/BugReporter.cpp b/lib/StaticAnalyzer/Core/BugReporter.cpp index 84535d5b1e..de59943d63 100644 --- a/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -1233,14 +1233,29 @@ PathDiagnosticPiece* BugReport::getEndPath(BugReporterContext& BRC, const ExplodedNode* EndPathNode) { - const Stmt* S = getStmt(); + const ProgramPoint &PP = EndPathNode->getLocation(); + PathDiagnosticLocation L; + + if (const BlockEntrance *BE = dyn_cast<BlockEntrance>(&PP)) { + const CFGBlock *block = BE->getBlock(); + if (block->getBlockID() == 0) { + L = PathDiagnosticLocation( + EndPathNode->getLocationContext()->getDecl()->getBodyRBrace(), + BRC.getSourceManager()); + } + } - if (!S) - return NULL; + if (!L.isValid()) { + const Stmt* S = getStmt(); + + if (!S) + return NULL; + + L = PathDiagnosticLocation(S, BRC.getSourceManager()); + } BugReport::ranges_iterator Beg, End; llvm::tie(Beg, End) = getRanges(); - PathDiagnosticLocation L(S, BRC.getSourceManager()); // Only add the statement itself as a range if we didn't specify any // special ranges for this report. |