]> granicus.if.org Git - clang/commitdiff
Enhance "Assumption" logic in BasicConstraintManager when reasoning about regions...
authorTed Kremenek <kremenek@apple.com>
Fri, 17 Oct 2008 21:22:20 +0000 (21:22 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 17 Oct 2008 21:22:20 +0000 (21:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57730 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/BasicConstraintManager.cpp

index aab1f5e7eb1510211aed52dedfedc141701c0d3a..8617ba650f381a4978a3513816bd568e426d2d26 100644 (file)
@@ -129,7 +129,26 @@ const GRState* BasicConstraintManager::AssumeAux(const GRState* St, Loc Cond,
       return AssumeSymEQ(St, cast<loc::SymbolVal>(Cond).getSymbol(),
                          BasicVals.getZeroWithPtrWidth(), isFeasible);
 
-  case loc::MemRegionKind:
+  case loc::MemRegionKind: {
+    // FIXME: Should this go into the storemanager?
+    
+    const MemRegion* R = cast<loc::MemRegionVal>(Cond).getRegion();
+    
+    while (R) {
+      if (const SubRegion* SubR = dyn_cast<SubRegion>(R)) {
+        R = SubR->getSuperRegion();
+        continue;
+      }
+      else if (const SymbolicRegion* SymR = dyn_cast<SymbolicRegion>(R))
+        return AssumeAux(St, loc::SymbolVal(SymR->getSymbol()), Assumption,
+                                            isFeasible);
+      
+      break;
+    }
+    
+    // FALL-THROUGH.
+  }
+      
   case loc::FuncValKind:
   case loc::GotoLabelKind:
   case loc::StringLiteralValKind: