From: Ted Kremenek Date: Fri, 14 Nov 2008 21:07:14 +0000 (+0000) Subject: Minor tweaks to liveness analysis: X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=06529aeadf03c2a2231a4c7221c422e3650a2a71;p=clang Minor tweaks to liveness analysis: - Block-expression for 'ObjCForCollectionStmt' is not alive before it occurs - Recursively visit 'element' expression for ObjCForCollectionStmt to get liveness for referenced block-level expressions and variables. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59316 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/LiveVariables.cpp b/lib/Analysis/LiveVariables.cpp index 7b04beb2b5..4b181a954c 100644 --- a/lib/Analysis/LiveVariables.cpp +++ b/lib/Analysis/LiveVariables.cpp @@ -179,6 +179,9 @@ void TransferFuncs::VisitBinaryOperator(BinaryOperator* B) { void TransferFuncs::BlockStmt_VisitObjCForCollectionStmt(ObjCForCollectionStmt* S) { + // This is a block-level expression. Its value is 'dead' before this point. + LiveState(S, AD) = Dead; + // This represents a 'use' of the collection. Visit(S->getCollection()); @@ -193,6 +196,10 @@ TransferFuncs::BlockStmt_VisitObjCForCollectionStmt(ObjCForCollectionStmt* S) { Expr* ElemExpr = cast(Element)->IgnoreParens(); if ((DR = dyn_cast(ElemExpr))) VD = cast(DR->getDecl()); + else { + Visit(ElemExpr); + return; + } } if (VD) {