Emit dead store warnings for ++ and -- operators.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50679 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/DeadStores.cpp b/lib/Analysis/DeadStores.cpp
index 6858e3a..f7523e5 100644
--- a/lib/Analysis/DeadStores.cpp
+++ b/lib/Analysis/DeadStores.cpp
@@ -35,6 +35,19 @@
   
   virtual ~DeadStoreObs() {}
   
+  void CheckDeclRef(DeclRefExpr* DR, Expr* Val,
+                    const LiveVariables::AnalysisDataTy& AD,
+                    const LiveVariables::ValTy& Live) {
+    
+    if (VarDecl* VD = dyn_cast<VarDecl>(DR->getDecl()))
+      if (VD->hasLocalStorage() && !Live(VD, AD)) {
+        SourceRange R = Val->getSourceRange();
+        Diags.Report(&Client,
+                     Ctx.getFullLoc(DR->getSourceRange().getBegin()),
+                     diag::warn_dead_store, 0, 0, &R, 1);
+      }
+  }
+  
   virtual void ObserveStmt(Stmt* S,
                            const LiveVariables::AnalysisDataTy& AD,
                            const LiveVariables::ValTy& Live) {
@@ -47,15 +60,18 @@
       if (!B->isAssignmentOp()) return; // Skip non-assignments.
       
       if (DeclRefExpr* DR = dyn_cast<DeclRefExpr>(B->getLHS()))
-        if (VarDecl* VD = dyn_cast<VarDecl>(DR->getDecl()))
-          if (VD->hasLocalStorage() && !Live(VD,AD)) {
-            SourceRange R = B->getRHS()->getSourceRange();
-            Diags.Report(&Client,
-                         Ctx.getFullLoc(DR->getSourceRange().getBegin()),
-                         diag::warn_dead_store, 0, 0, &R, 1);                                                                        
-        }
+        CheckDeclRef(DR, B->getRHS(), AD, Live);
     }
-    else if(DeclStmt* DS = dyn_cast<DeclStmt>(S))
+    else if (UnaryOperator* U = dyn_cast<UnaryOperator>(S)) {
+      if (!U->isIncrementOp())
+        return;
+      
+      Expr *Ex = U->getSubExpr()->IgnoreParenCasts();
+      
+      if (DeclRefExpr* DR = dyn_cast<DeclRefExpr>(Ex))
+        CheckDeclRef(DR, U, AD, Live);
+    }    
+    else if (DeclStmt* DS = dyn_cast<DeclStmt>(S))
       // Iterate through the decls.  Warn if any initializers are complex
       // expressions that are not live (never used).
       for (ScopedDecl* SD = DS->getDecl(); SD; SD = SD->getNextDeclarator()) {