diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-05-11 22:19:32 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-05-11 22:19:32 +0000 |
commit | 2ee73b86c0ad30efcfa0be7668b04b848076e710 (patch) | |
tree | 5848770e0e5b2766f3152d06c4ffcec36d26a8c5 /clang/lib/Analysis/BugReporter.cpp | |
parent | b517f2c5e23a2213c6c41ea34f747204ae7ea5d4 (diff) | |
download | bcm5719-llvm-2ee73b86c0ad30efcfa0be7668b04b848076e710.tar.gz bcm5719-llvm-2ee73b86c0ad30efcfa0be7668b04b848076e710.zip |
EdgeBuilder: DeclStmts and BinaryOperators are not the enclosing location context when they are used as initialization code for loops.
llvm-svn: 71480
Diffstat (limited to 'clang/lib/Analysis/BugReporter.cpp')
-rw-r--r-- | clang/lib/Analysis/BugReporter.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/clang/lib/Analysis/BugReporter.cpp b/clang/lib/Analysis/BugReporter.cpp index 5407cea4e2c..23f33423998 100644 --- a/clang/lib/Analysis/BugReporter.cpp +++ b/clang/lib/Analysis/BugReporter.cpp @@ -212,7 +212,7 @@ PathDiagnosticBuilder::getEnclosingStmtLocation(const Stmt *S) { assert(S && "Null Stmt* passed to getEnclosingStmtLocation"); ParentMap &P = getParentMap(); SourceManager &SMgr = getSourceManager(); - + while (isa<Expr>(S) && P.isConsumedExpr(cast<Expr>(S))) { const Stmt *Parent = P.getParentIgnoreParens(S); @@ -269,6 +269,31 @@ PathDiagnosticBuilder::getEnclosingStmtLocation(const Stmt *S) { } assert(S && "Cannot have null Stmt for PathDiagnosticLocation"); + + // Special case: DeclStmts can appear in for statement declarations, in which + // case the ForStmt is the context. + if (isa<DeclStmt>(S)) { + if (const Stmt *Parent = P.getParent(S)) { + switch (Parent->getStmtClass()) { + case Stmt::ForStmtClass: + case Stmt::ObjCForCollectionStmtClass: + return PathDiagnosticLocation(Parent, SMgr); + default: + break; + } + } + } + else if (isa<BinaryOperator>(S)) { + // Special case: the binary operator represents the initialization + // code in a for statement (this can happen when the variable being + // initialized is an old variable. + if (const ForStmt *FS = + dyn_cast_or_null<ForStmt>(P.getParentIgnoreParens(S))) { + if (FS->getInit() == S) + return PathDiagnosticLocation(FS, SMgr); + } + } + return PathDiagnosticLocation(S, SMgr); } |