diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Checker/GRCoreEngine.cpp | 1 | ||||
-rw-r--r-- | clang/lib/Checker/GRExprEngine.cpp | 1 | ||||
-rw-r--r-- | clang/lib/Checker/GRState.cpp | 6 |
3 files changed, 8 insertions, 0 deletions
diff --git a/clang/lib/Checker/GRCoreEngine.cpp b/clang/lib/Checker/GRCoreEngine.cpp index a9347d01641..63ac31d6064 100644 --- a/clang/lib/Checker/GRCoreEngine.cpp +++ b/clang/lib/Checker/GRCoreEngine.cpp @@ -682,6 +682,7 @@ void GRCallExitNodeBuilder::GenerateNode(const GRState *state) { // Get the callee's location context. const StackFrameContext *LocCtx = cast<StackFrameContext>(Pred->getLocationContext()); + state = state->setAnalysisContext(LocCtx->getParent()->getAnalysisContext()); PostStmt Loc(LocCtx->getCallSite(), LocCtx->getParent()); bool isNew; diff --git a/clang/lib/Checker/GRExprEngine.cpp b/clang/lib/Checker/GRExprEngine.cpp index ad229c7b8fb..d25526e1ede 100644 --- a/clang/lib/Checker/GRExprEngine.cpp +++ b/clang/lib/Checker/GRExprEngine.cpp @@ -1309,6 +1309,7 @@ void GRExprEngine::ProcessCallEnter(GRCallEnterNodeBuilder &B) { const GRState *state = B.getState(); state = getStoreManager().EnterStackFrame(state, LocCtx); + state = state->setAnalysisContext(LocCtx->getAnalysisContext()); B.GenerateNode(state, LocCtx); } diff --git a/clang/lib/Checker/GRState.cpp b/clang/lib/Checker/GRState.cpp index 592f930316e..ce7d6e2a838 100644 --- a/clang/lib/Checker/GRState.cpp +++ b/clang/lib/Checker/GRState.cpp @@ -23,6 +23,12 @@ using namespace clang; // FIXME: Move this elsewhere. ConstraintManager::~ConstraintManager() {} +const GRState *GRState::setAnalysisContext(AnalysisContext *ctx) const { + GRState NewState = *this; + NewState.Env.setAnalysisContext(ctx); + return StateMgr->getPersistentState(NewState); +} + GRStateManager::~GRStateManager() { for (std::vector<GRState::Printer*>::iterator I=Printers.begin(), E=Printers.end(); I!=E; ++I) |