]> granicus.if.org Git - clang/commitdiff
Added support for assignments in GRConstants.
authorTed Kremenek <kremenek@apple.com>
Wed, 16 Jan 2008 19:42:59 +0000 (19:42 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 16 Jan 2008 19:42:59 +0000 (19:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46086 91177308-0d34-0410-b5e6-96231b3b80d8

Analysis/GRConstants.cpp

index 3eff0e0c864335959d855a312687814a2b99e437..1502fd4fb87b14fb90d7cc9b585866d8ea3b9b08 100644 (file)
@@ -192,6 +192,8 @@ public:
   StateTy RemoveGrandchildrenMappings(Stmt* S, StateTy M);
 
   void AddBinding(Expr* E, ExprVariantTy V, bool isBlkLvl = false);
+  void AddBinding(Decl* D, ExprVariantTy V);
+  
   ExprVariantTy GetBinding(Expr* E);
   
   void BlockStmt_VisitStmt(Stmt* S) { DoStmt(S); }
@@ -200,6 +202,7 @@ public:
   void VisitIntegerLiteral(IntegerLiteral* L);
   void VisitBinAdd(BinaryOperator* O);
   void VisitBinSub(BinaryOperator* O);
+  void VisitBinAssign(BinaryOperator* D);
 };
 } // end anonymous namespace
 
@@ -229,6 +232,13 @@ void GRConstants::AddBinding(Expr* E, ExprVariantTy V, bool isBlkLvl) {
     CurrentState = StateMgr.Add(CurrentState, DSPtr(E,isBlkLvl), V.getVal());
 }
 
+void GRConstants::AddBinding(Decl* D, ExprVariantTy V) {
+  if (V)
+    CurrentState = StateMgr.Add(CurrentState, DSPtr(D), V.getVal());
+  else
+    CurrentState = StateMgr.Remove(CurrentState, DSPtr(D));
+}
+
 void GRConstants::SwitchNodeSets() {
   NodeSetTy* Tmp = OldNodes;
   OldNodes = Nodes;
@@ -290,6 +300,20 @@ void GRConstants::VisitBinSub(BinaryOperator* B) {
   AddBinding(B, GetBinding(B->getLHS()) - GetBinding(B->getRHS()));
 }
 
+
+static inline Expr* IgnoreParen(Expr* E) {
+  while (ParenExpr* P = dyn_cast<ParenExpr>(E))
+    E = P->getSubExpr();
+  
+  return E;
+}
+
+
+void GRConstants::VisitBinAssign(BinaryOperator* B) {
+  if (DeclRefExpr* D = dyn_cast<DeclRefExpr>(IgnoreParen(B->getLHS())))
+    AddBinding(D->getDecl(), GetBinding(B->getRHS()));
+}
+
 //===----------------------------------------------------------------------===//
 // Driver.
 //===----------------------------------------------------------------------===//