diff options
Diffstat (limited to 'lib/Analysis/BugReporter.cpp')
-rw-r--r-- | lib/Analysis/BugReporter.cpp | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/lib/Analysis/BugReporter.cpp b/lib/Analysis/BugReporter.cpp index 8a07cd01e1..77a83fef8c 100644 --- a/lib/Analysis/BugReporter.cpp +++ b/lib/Analysis/BugReporter.cpp @@ -823,7 +823,7 @@ public: PrevLoc = PD.begin()->getLocation(); if (const Stmt *S = PrevLoc.asStmt()) - addContext(PDB.getEnclosingStmtLocation(S).asStmt()); + addExtendedContext(PDB.getEnclosingStmtLocation(S).asStmt()); } } @@ -851,6 +851,7 @@ public: void rawAddEdge(PathDiagnosticLocation NewLoc); void addContext(const Stmt *S); + void addExtendedContext(const Stmt *S); }; } // end anonymous namespace @@ -992,6 +993,31 @@ bool EdgeBuilder::IsConsumedExpr(const PathDiagnosticLocation &L) { return false; } +void EdgeBuilder::addExtendedContext(const Stmt *S) { + if (!S) + return; + + const Stmt *Parent = PDB.getParent(S); + while (Parent) { + if (isa<CompoundStmt>(Parent)) + Parent = PDB.getParent(Parent); + else + break; + } + + if (Parent) { + switch (Parent->getStmtClass()) { + case Stmt::DoStmtClass: + case Stmt::ObjCAtSynchronizedStmtClass: + addContext(Parent); + default: + break; + } + } + + addContext(S); +} + void EdgeBuilder::addContext(const Stmt *S) { if (!S) return; @@ -1073,7 +1099,7 @@ static void GenerateExtensivePathDiagnostic(PathDiagnostic& PD, EB.addContext(S); } else - EB.addContext(PDB.getEnclosingStmtLocation(S).asStmt()); + EB.addExtendedContext(PDB.getEnclosingStmtLocation(S).asStmt()); } continue; @@ -1088,7 +1114,7 @@ static void GenerateExtensivePathDiagnostic(PathDiagnostic& PD, EB.addEdge(Loc, true); PD.push_front(p); if (const Stmt *S = Loc.asStmt()) - EB.addContext(PDB.getEnclosingStmtLocation(S).asStmt()); + EB.addExtendedContext(PDB.getEnclosingStmtLocation(S).asStmt()); } } } |