The base type is not always pointer type. We may cast to a base reference.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122393 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Checker/RegionStore.cpp b/lib/Checker/RegionStore.cpp
index bc28f13..b6f9929 100644
--- a/lib/Checker/RegionStore.cpp
+++ b/lib/Checker/RegionStore.cpp
@@ -807,9 +807,15 @@
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());