diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-04-15 03:47:30 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-04-15 03:47:30 +0000 |
commit | c8e00b2f4c860af1a01e3db459539ddff78a94a2 (patch) | |
tree | 74b137960e7ff35796e355e58b77035e47aa99e9 /lib/Analysis/LiveVariables.cpp | |
parent | 53f9e203c1491c3ae4e733700ad03eae3e74ea10 (diff) |
Bug fix in LiveVariables: Operators ++/-- may kill a value, but the variable
is still live.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49705 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/LiveVariables.cpp')
-rw-r--r-- | lib/Analysis/LiveVariables.cpp | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/lib/Analysis/LiveVariables.cpp b/lib/Analysis/LiveVariables.cpp index acc13dead8..06f30fa4fd 100644 --- a/lib/Analysis/LiveVariables.cpp +++ b/lib/Analysis/LiveVariables.cpp @@ -110,14 +110,13 @@ void TransferFuncs::VisitUnaryOperator(UnaryOperator* U) { case UnaryOperator::PostDec: case UnaryOperator::PreInc: case UnaryOperator::PreDec: - case UnaryOperator::AddrOf: // Walk through the subexpressions, blasting through ParenExprs // until we either find a DeclRefExpr or some non-DeclRefExpr // expression. if (DeclRefExpr* DR = dyn_cast<DeclRefExpr>(E->IgnoreParens())) - if (VarDecl* VD = dyn_cast<VarDecl>(DR->getDecl())) { - // Treat the --/++/& operator as a kill. - LiveState(VD, AD) = Dead; + if (isa<VarDecl>(DR->getDecl())) { + // Treat the --/++ operator as a kill. Note that the variable + // is still live, just its value has been changed. if (AD.Observer) { AD.Observer->ObserverKill(DR); } return VisitDeclRefExpr(DR); } @@ -134,7 +133,7 @@ void TransferFuncs::VisitAssign(BinaryOperator* B) { // Assigning to a variable? if (DeclRefExpr* DR = dyn_cast<DeclRefExpr>(LHS->IgnoreParens())) { - LiveState(DR->getDecl(),AD) = Dead; + LiveState(DR->getDecl(), AD) = Dead; if (AD.Observer) { AD.Observer->ObserverKill(DR); } // Handle things like +=, etc., which also generate "uses" @@ -153,7 +152,7 @@ void TransferFuncs::VisitDeclStmt(DeclStmt* DS) { // possibly be live before they are declared. for (ScopedDecl* D = DS->getDecl(); D != NULL; D = D->getNextDeclarator()) if (VarDecl* VD = dyn_cast<VarDecl>(D)) { - LiveState(D,AD) = Dead; + LiveState(D, AD) = Dead; if (Expr* Init = VD->getInit()) Visit(Init); |