diff options
Diffstat (limited to 'lib/Analysis/GRExprEngine.cpp')
-rw-r--r-- | lib/Analysis/GRExprEngine.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index 5ef2524964..76e356be4d 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -1277,7 +1277,7 @@ void GRExprEngine::VisitCallRec(CallExpr* CE, NodeTy* Pred, // FIXME: Refactor into StoreManager itself? MemRegionManager& RM = getStateManager().getRegionManager(); const MemRegion* R = - RM.getAllocaRegion(CE, Builder->getCurrentBlockCount()); + RM.getAllocaRegion(CE, Builder->getCurrentBlockCount()); MakeNode(Dst, CE, *DI, BindExpr(St, CE, loc::MemRegionVal(R))); continue; } @@ -1681,6 +1681,26 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){ continue; } + // Cast alloca'ed pointer to typed pointer. + if (isa<loc::MemRegionVal>(V)) { + if (const AllocaRegion* AR = + dyn_cast<AllocaRegion>(cast<loc::MemRegionVal>(V).getRegion())) { + + // Set the AllocaRegion's type. + const_cast<AllocaRegion*>(AR)->setType(T); + + // Set the CastExpr's value to a pointer to the first element. + MemRegionManager& RM = getStateManager().getRegionManager(); + + llvm::APSInt Zero(llvm::APInt::getNullValue(32), false); + SVal ZeroIdx(nonloc::ConcreteInt(getBasicVals().getValue(Zero))); + const ElementRegion* ER = RM.getElementRegion(ZeroIdx, AR); + + MakeNode(Dst, CastE, N, BindExpr(St, CastE, loc::MemRegionVal(ER))); + continue; + } + } + // All other cases. MakeNode(Dst, CastE, N, BindExpr(St, CastE, EvalCast(V, CastE->getType()))); } |