]> granicus.if.org Git - clang/commitdiff
The Decl of an array region can be VarDecl or FieldDecl. Handle this in RegionStoreMa...
authorZhongxing Xu <xuzhongxing@gmail.com>
Fri, 24 Oct 2008 09:06:51 +0000 (09:06 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Fri, 24 Oct 2008 09:06:51 +0000 (09:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58086 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/PathSensitive/MemRegion.h
lib/Analysis/RegionStore.cpp

index a78059dfedb63748fa07404c2d346a20b3cdb840..e0ecb7180fc52df16a9bbfb45f3fc8891b7ebc2c 100644 (file)
@@ -192,7 +192,8 @@ protected:
   static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Decl* D,
                       const MemRegion* superRegion, Kind k);
   
-public:  
+public:
+  const Decl* getDecl() const { return D; }
   void Profile(llvm::FoldingSetNodeID& ID) const;
 };
   
index bd3dd0911dd4922806c4af646a0ec0f3a2b7a2bb..5c75ab369ece0ba251b16961e17edd116a708586 100644 (file)
@@ -181,10 +181,18 @@ SVal RegionStoreManager::getLValueElement(const GRState* St,
 SVal RegionStoreManager::ArrayToPointer(SVal Array) {
   const MemRegion* ArrayR = cast<loc::MemRegionVal>(&Array)->getRegion();
 
-  const VarDecl* D = cast<VarRegion>(ArrayR)->getDecl();
+  const Decl* D = cast<DeclRegion>(ArrayR)->getDecl();
+
+  QualType ArrayTy;
+  if (const VarDecl* VD = dyn_cast<VarDecl>(D))
+    ArrayTy = VD->getType();
+  else if (const FieldDecl* FD = dyn_cast<FieldDecl>(D))
+    ArrayTy = FD->getType(); 
+  else
+    assert(0 && "unknown decl");
 
   if (const ConstantArrayType* CAT = 
-      dyn_cast<ConstantArrayType>(D->getType().getTypePtr())) {
+      dyn_cast<ConstantArrayType>(ArrayTy.getTypePtr())) {
 
     BasicValueFactory& BasicVals = StateMgr.getBasicVals();