summaryrefslogtreecommitdiffstats
path: root/clang/lib/Checker/RegionStore.cpp
diff options
context:
space:
mode:
authorZhongxing Xu <xuzhongxing@gmail.com>2010-11-26 08:21:53 +0000
committerZhongxing Xu <xuzhongxing@gmail.com>2010-11-26 08:21:53 +0000
commitec0b8e32eec37c4713f865373a812749ede815a6 (patch)
treefa071b1209d5a32a45041cb45d94433473535179 /clang/lib/Checker/RegionStore.cpp
parente23ab6fae29ab8f301fb529d6b7e4dd40c45b4e5 (diff)
downloadbcm5719-llvm-ec0b8e32eec37c4713f865373a812749ede815a6.tar.gz
bcm5719-llvm-ec0b8e32eec37c4713f865373a812749ede815a6.zip
Regionstore: support derived-to-base cast by creating a CXXBaseObjectRegion.
llvm-svn: 120173
Diffstat (limited to 'clang/lib/Checker/RegionStore.cpp')
-rw-r--r--clang/lib/Checker/RegionStore.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/clang/lib/Checker/RegionStore.cpp b/clang/lib/Checker/RegionStore.cpp
index e5b1bca5d8f..59c87300095 100644
--- a/clang/lib/Checker/RegionStore.cpp
+++ b/clang/lib/Checker/RegionStore.cpp
@@ -224,6 +224,9 @@ public:
/// casts from arrays to pointers.
SVal ArrayToPointer(Loc Array);
+ /// For DerivedToBase casts, create a CXXBaseObjectRegion and return it.
+ virtual SVal evalDerivedToBase(SVal derived, QualType basePtrType);
+
SVal EvalBinOp(BinaryOperator::Opcode Op,Loc L, NonLoc R, QualType resultTy);
Store getInitialStore(const LocationContext *InitLoc) {
@@ -804,6 +807,14 @@ 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();
+ assert(baseDecl && "not a CXXRecordDecl?");
+ loc::MemRegionVal &derivedRegVal = cast<loc::MemRegionVal>(derived);
+ const MemRegion *baseReg =
+ MRMgr.getCXXBaseObjectRegion(baseDecl, derivedRegVal.getRegion());
+ return loc::MemRegionVal(baseReg);
+}
//===----------------------------------------------------------------------===//
// Pointer arithmetic.
//===----------------------------------------------------------------------===//
@@ -869,6 +880,7 @@ SVal RegionStoreManager::EvalBinOp(BinaryOperator::Opcode Op, Loc L, NonLoc R,
case MemRegion::FieldRegionKind:
case MemRegion::ObjCIvarRegionKind:
case MemRegion::CXXObjectRegionKind:
+ case MemRegion::CXXBaseObjectRegionKind:
return UnknownVal();
case MemRegion::FunctionTextRegionKind:
OpenPOWER on IntegriCloud