summaryrefslogtreecommitdiffstats
path: root/clang/lib/Checker/GRExprEngine.cpp
diff options
context:
space:
mode:
authorZhongxing Xu <xuzhongxing@gmail.com>2010-11-20 06:53:12 +0000
committerZhongxing Xu <xuzhongxing@gmail.com>2010-11-20 06:53:12 +0000
commit2c966716ff40c9f1e2f8c128415d1567b1525c48 (patch)
tree9bd4cf3f7f46a028d18a54a7e3867dd0eec01adc /clang/lib/Checker/GRExprEngine.cpp
parentada75c5ad10b01dae20169f18b329a7860052d74 (diff)
downloadbcm5719-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.cpp13
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,
OpenPOWER on IntegriCloud