diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-05-11 19:50:47 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-05-11 19:50:47 +0000 |
commit | 8c8b0ad9601d6ccf3d7b2a3f77a896ef4fb4e6e9 (patch) | |
tree | e3712bbc46008b335b318cea610140088ffded89 | |
parent | b1b9f680f5fc65230de877baccae50820a969a94 (diff) |
BugReporter (extensive diagnostics): Add EdgeBuilder::cleanUpLocation for canonicalization locations and use this in both popLocation and rawAddEdge.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71470 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Analysis/BugReporter.cpp | 62 |
1 files changed, 34 insertions, 28 deletions
diff --git a/lib/Analysis/BugReporter.cpp b/lib/Analysis/BugReporter.cpp index db92823781..661043a92d 100644 --- a/lib/Analysis/BugReporter.cpp +++ b/lib/Analysis/BugReporter.cpp @@ -214,7 +214,7 @@ PathDiagnosticBuilder::getEnclosingStmtLocation(const Stmt *S) { SourceManager &SMgr = getSourceManager(); while (isa<Expr>(S) && P.isConsumedExpr(cast<Expr>(S))) { - const Stmt *Parent = P.getParent(S); + const Stmt *Parent = P.getParentIgnoreParens(S); if (!Parent) break; @@ -225,8 +225,7 @@ PathDiagnosticBuilder::getEnclosingStmtLocation(const Stmt *S) { if (B->isLogicalOp()) return PathDiagnosticLocation(S, SMgr); break; - } - + } case Stmt::CompoundStmtClass: case Stmt::StmtExprClass: return PathDiagnosticLocation(S, SMgr); @@ -778,28 +777,32 @@ class VISIBILITY_HIDDEN EdgeBuilder { PathDiagnosticLocation getContextLocation(const PathDiagnosticLocation &L); + PathDiagnosticLocation cleanUpLocation(const PathDiagnosticLocation &L) { + if (const Stmt *S = L.asStmt()) { + while (1) { + // Adjust the location for some expressions that are best referenced + // by one of their subexpressions. + if (const ParenExpr *PE = dyn_cast<ParenExpr>(S)) + S = PE->IgnoreParens(); + else if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(S)) + S = CO->getCond(); + else if (const ChooseExpr *CE = dyn_cast<ChooseExpr>(S)) + S = CE->getCond(); + else if (const BinaryOperator *BE = dyn_cast<BinaryOperator>(S)) + S = BE->getLHS(); + else + break; + } + + return PathDiagnosticLocation(S, L.getManager()); + } + + return L; + } + void popLocation() { if (!CLocs.back().isDead() && CLocs.back().asLocation().isFileID()) { - PathDiagnosticLocation L = CLocs.back(); - - if (const Stmt *S = L.asStmt()) { - while (1) { - // Adjust the location for some expressions that are best referenced - // by one of their subexpressions. - if (const ParenExpr *PE = dyn_cast<ParenExpr>(S)) - S = PE->IgnoreParens(); - else if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(S)) - S = CO->getCond(); - else if (const ChooseExpr *CE = dyn_cast<ChooseExpr>(S)) - S = CE->getCond(); - else if (const BinaryOperator *BE = dyn_cast<BinaryOperator>(S)) - S = BE->getLHS(); - else - break; - } - - L = PathDiagnosticLocation(S, L.getManager()); - } + PathDiagnosticLocation L = cleanUpLocation(CLocs.back()); // For contexts, we only one the first character as the range. L = PathDiagnosticLocation(L.asLocation(), L.getManager()); @@ -926,16 +929,19 @@ void EdgeBuilder::rawAddEdge(PathDiagnosticLocation NewLoc) { return; } - if (NewLoc.asLocation() == PrevLoc.asLocation()) + const PathDiagnosticLocation &NewLocClean = cleanUpLocation(NewLoc); + const PathDiagnosticLocation &PrevLocClean = cleanUpLocation(PrevLoc); + + if (NewLocClean.asLocation() == PrevLocClean.asLocation()) return; // FIXME: Ignore intra-macro edges for now. - if (NewLoc.asLocation().getInstantiationLoc() == - PrevLoc.asLocation().getInstantiationLoc()) + if (NewLocClean.asLocation().getInstantiationLoc() == + PrevLocClean.asLocation().getInstantiationLoc()) return; - PD.push_front(new PathDiagnosticControlFlowPiece(NewLoc, PrevLoc)); - PrevLoc = NewLoc; + PD.push_front(new PathDiagnosticControlFlowPiece(NewLocClean, PrevLocClean)); + PrevLoc = NewLoc; } void EdgeBuilder::addEdge(PathDiagnosticLocation NewLoc, bool alwaysAdd) { |