diff options
-rw-r--r-- | clang/Analysis/DeadStores.cpp | 13 | ||||
-rw-r--r-- | clang/Analysis/LiveVariables.cpp | 5 |
2 files changed, 17 insertions, 1 deletions
diff --git a/clang/Analysis/DeadStores.cpp b/clang/Analysis/DeadStores.cpp index e7077ecae31..f79aa6ae047 100644 --- a/clang/Analysis/DeadStores.cpp +++ b/clang/Analysis/DeadStores.cpp @@ -47,6 +47,19 @@ public: } } } + else if(DeclStmt* DS = dyn_cast<DeclStmt>(S)) { + // Iterate through the decls. Warn if any of them (which have + // initializers) are not live. + for (Decl* D = DS->getDecl() ; D != NULL ; D = D->getNextDeclarator()) + if (VarDecl* V = dyn_cast<VarDecl>(D)) + if (Expr* E = V->getInit()) + if (!L.isLive(Live,D)) { + SourceRange R = E->getSourceRange(); + PP.getDiagnostics().Report(D->getLocation(), + diag::warn_dead_store, 0, 0, + &R,1); + } + } } }; diff --git a/clang/Analysis/LiveVariables.cpp b/clang/Analysis/LiveVariables.cpp index 6b25f9eee60..bf4437470e3 100644 --- a/clang/Analysis/LiveVariables.cpp +++ b/clang/Analysis/LiveVariables.cpp @@ -252,7 +252,10 @@ void LivenessTFuncs::VisitAssign(BinaryOperator* B) { // We only need to register kills once, so we check if this block // has been previously processed. if (!blockPreviouslyProcessed) - V.AddKill(CurrentStmt,DR); + V.AddKill(CurrentStmt,DR); + + if (B->getOpcode() != BinaryOperator::Assign) + Visit(LHS); } else Visit(LHS); |