diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-11-20 06:53:12 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-11-20 06:53:12 +0000 |
commit | 2c966716ff40c9f1e2f8c128415d1567b1525c48 (patch) | |
tree | 9bd4cf3f7f46a028d18a54a7e3867dd0eec01adc /clang/lib/Checker/GRExprEngine.cpp | |
parent | ada75c5ad10b01dae20169f18b329a7860052d74 (diff) | |
download | bcm5719-llvm-2c966716ff40c9f1e2f8c128415d1567b1525c48.tar.gz bcm5719-llvm-2c966716ff40c9f1e2f8c128415d1567b1525c48.zip |
Handle CFGAutomaticObjDtor.
llvm-svn: 119897
Diffstat (limited to 'clang/lib/Checker/GRExprEngine.cpp')
-rw-r--r-- | clang/lib/Checker/GRExprEngine.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/clang/lib/Checker/GRExprEngine.cpp b/clang/lib/Checker/GRExprEngine.cpp index ddd3d50fe56..4483cdb76c4 100644 --- a/clang/lib/Checker/GRExprEngine.cpp +++ b/clang/lib/Checker/GRExprEngine.cpp @@ -718,6 +718,8 @@ void GRExprEngine::ProcessInitializer(const CFGInitializer Init, void GRExprEngine::ProcessImplicitDtor(const CFGImplicitDtor D, GRStmtNodeBuilder &builder) { + Builder = &builder; + switch (D.getDtorKind()) { case CFGElement::AutomaticObjectDtor: ProcessAutomaticObjDtor(cast<CFGAutomaticObjDtor>(D), builder); @@ -738,6 +740,17 @@ void GRExprEngine::ProcessImplicitDtor(const CFGImplicitDtor D, void GRExprEngine::ProcessAutomaticObjDtor(const CFGAutomaticObjDtor D, GRStmtNodeBuilder &builder) { + ExplodedNode *Pred = builder.getBasePredecessor(); + const GRState *state = Pred->getState(); + const VarDecl *VD = D.getVarDecl(); + const CXXRecordDecl *CD = VD->getType()->getAsCXXRecordDecl(); + const CXXDestructorDecl *DD = CD->getDestructor(); + + Loc Dest = state->getLValue(VD, Pred->getLocationContext()); + + ExplodedNodeSet Dst; + VisitCXXDestructor(DD, cast<loc::MemRegionVal>(Dest).getRegion(), + D.getTriggerStmt(), Pred, Dst); } void GRExprEngine::ProcessBaseDtor(const CFGBaseDtor D, |