]> granicus.if.org Git - clang/commitdiff
The base type is not always pointer type. We may cast to a base reference.
authorZhongxing Xu <xuzhongxing@gmail.com>
Wed, 22 Dec 2010 08:12:57 +0000 (08:12 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Wed, 22 Dec 2010 08:12:57 +0000 (08:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122393 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Checker/RegionStore.cpp

index bc28f137c456b027af669d89dedc58fe78490b37..b6f992995b0eaa98ba04ebc56f1725d1cc6d51f0 100644 (file)
@@ -807,9 +807,15 @@ SVal RegionStoreManager::ArrayToPointer(Loc Array) {
   return loc::MemRegionVal(MRMgr.getElementRegion(T, ZeroIdx, ArrayR, Ctx));
 }
 
-SVal RegionStoreManager::evalDerivedToBase(SVal derived, QualType basePtrType) {
-  const CXXRecordDecl *baseDecl = basePtrType->getCXXRecordDeclForPointerType();
+SVal RegionStoreManager::evalDerivedToBase(SVal derived, QualType baseType) {
+  const CXXRecordDecl *baseDecl;
+  if (baseType->isPointerType())
+    baseDecl = baseType->getCXXRecordDeclForPointerType();
+  else
+    baseDecl = baseType->getAsCXXRecordDecl();
+
   assert(baseDecl && "not a CXXRecordDecl?");
+
   loc::MemRegionVal &derivedRegVal = cast<loc::MemRegionVal>(derived);
   const MemRegion *baseReg = 
     MRMgr.getCXXBaseObjectRegion(baseDecl, derivedRegVal.getRegion());