diff options
| author | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-11-26 08:21:53 +0000 |
|---|---|---|
| committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-11-26 08:21:53 +0000 |
| commit | ec0b8e32eec37c4713f865373a812749ede815a6 (patch) | |
| tree | fa071b1209d5a32a45041cb45d94433473535179 /clang/lib/Checker/RegionStore.cpp | |
| parent | e23ab6fae29ab8f301fb529d6b7e4dd40c45b4e5 (diff) | |
| download | bcm5719-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.cpp | 12 |
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: |

