BugReporter (extensive diagnostics): improve location context generation for the

start of 'do' and '@synchronized' statements.

llvm-svn: 71038
This commit is contained in:
Ted Kremenek 2009-05-05 23:13:38 +00:00
parent b3c657bbd4
commit a8106efce9
1 changed files with 29 additions and 3 deletions

View File

@ -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());
}
}
}