]> granicus.if.org Git - clang/commitdiff
Add member template "MemRegion::getAs<RegionType>" that dynamically casts a
authorTed Kremenek <kremenek@apple.com>
Mon, 9 Mar 2009 20:28:08 +0000 (20:28 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 9 Mar 2009 20:28:08 +0000 (20:28 +0000)
given MemRegion object to a target region type. This differs from dyn_cast<> in
that it also ignores TypedViewRegions.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66439 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/PathSensitive/MemRegion.h

index 3c9d705176bc02eac11db2c879f1e43f5ff9e587..d22dccc77cb60055cd5b5a21b3f3a0f99d5680db 100644 (file)
@@ -70,6 +70,8 @@ public:
   
   Kind getKind() const { return kind; }  
   
+  template<typename RegionTy> const RegionTy* getAs() const;
+  
   virtual bool isBoundable(ASTContext&) const { return true; }
 
   static bool classof(const MemRegion*) { return true; }
@@ -452,6 +454,26 @@ public:
     return R->getKind() == ElementRegionKind;
   }
 };
+  
+template<typename RegionTy>
+const RegionTy* MemRegion::getAs() const {
+  const MemRegion *R = this;
+  
+  do {
+    if (const RegionTy* RT = dyn_cast<RegionTy>(R))
+      return RT;
+    
+    if (const TypedViewRegion *TR = dyn_cast<TypedViewRegion>(R)) {
+      R = TR->getSuperRegion();
+      continue;
+    }
+    
+    break;
+  }
+  while (R);
+  
+  return 0;
+}
 
 //===----------------------------------------------------------------------===//
 // MemRegionManager - Factory object for creating regions.
@@ -543,7 +565,7 @@ public:
 
 private:
   MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region);
-};  
+};
 } // end clang namespace
 
 namespace llvm {