Accesses to a collection within a fast enumeration 'for' statement constitute a 'use'.

llvm-svn: 59075
This commit is contained in:
Ted Kremenek 2008-11-11 19:40:47 +00:00
parent 38c9a14a88
commit 3b4e1d5cc6

View File

@ -177,17 +177,23 @@ void TransferFuncs::VisitBinaryOperator(BinaryOperator* B) {
}
void TransferFuncs::VisitObjCForCollectionStmt(ObjCForCollectionStmt* S) {
Stmt* Element = S->getElement();
if (DeclStmt* DS = dyn_cast<DeclStmt>(Element)) {
VisitDeclStmt(DS);
return;
}
// This represents a 'use' of the collection.
Visit(S->getCollection());
// This represents a 'kill' for the variable.
DeclRefExpr* DR = cast<DeclRefExpr>(Element);
LiveState(cast<VarDecl>(DR->getDecl()), AD) = Dead;
if (AD.Observer) { AD.Observer->ObserverKill(DR); }
Stmt* Element = S->getElement();
DeclRefExpr *DR;
VarDecl* VD = 0;
if (DeclStmt* DS = dyn_cast<DeclStmt>(Element))
VD = cast<VarDecl>(DS->getSolitaryDecl());
else {
DR = cast<DeclRefExpr>(Element);
VD = cast<VarDecl>(DR->getDecl());
}
LiveState(VD, AD) = Dead;
if (AD.Observer && DR) { AD.Observer->ObserverKill(DR); }
}