Implement RegionStoreManager::Remove().


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61069 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/RegionStore.cpp b/lib/Analysis/RegionStore.cpp
index b78c2ed..98b4081 100644
--- a/lib/Analysis/RegionStore.cpp
+++ b/lib/Analysis/RegionStore.cpp
@@ -111,10 +111,7 @@
 
   Store Bind(Store St, Loc LV, SVal V);
 
-  Store Remove(Store store, Loc LV) {
-    // FIXME: Implement.
-    return store;
-  }
+  Store Remove(Store store, Loc LV);
 
   Store getInitialStore();
   
@@ -141,7 +138,7 @@
   const GRState* setExtent(const GRState* St, const MemRegion* R, SVal Extent);
 
   static inline RegionBindingsTy GetRegionBindings(Store store) {
-    return RegionBindingsTy(static_cast<const RegionBindingsTy::TreeTy*>(store));
+   return RegionBindingsTy(static_cast<const RegionBindingsTy::TreeTy*>(store));
   }
 
   void print(Store store, std::ostream& Out, const char* nl, const char *sep);
@@ -482,6 +479,15 @@
          : RBFactory.Add(B, R, V).getRoot();
 }
 
+Store RegionStoreManager::Remove(Store store, Loc L) {
+  RegionBindingsTy B = GetRegionBindings(store);
+
+  const MemRegion* R = cast<loc::MemRegionVal>(L).getRegion();
+  assert(R);
+
+  return RBFactory.Remove(B, R).getRoot();
+}
+
 Store RegionStoreManager::BindStruct(Store store, const TypedRegion* R, SVal V){
   // Verify we want getRValueType.
   QualType T = R->getRValueType(getContext());
@@ -747,7 +753,7 @@
       continue;
     
     // Remove this dead region from the store.
-    store = Remove(store, loc::MemRegionVal(R));
+    store = Remove(store, Loc::MakeVal(R));
 
     // Mark all non-live symbols that this region references as dead.
     if (const SymbolicRegion* SymR = dyn_cast<SymbolicRegion>(R)) {