diff options
author | Erik Verbruggen <erikjv@me.com> | 2012-03-14 18:01:43 +0000 |
---|---|---|
committer | Erik Verbruggen <erikjv@me.com> | 2012-03-14 18:01:43 +0000 |
commit | e711d7e7875920fee4180a26bfc67d67f0f71a2c (patch) | |
tree | 59980a6ec044aa85c32a42b94898bb882d12686d /lib/StaticAnalyzer/Core/ExprEngine.cpp | |
parent | 72ff6bb6f61e39b62e000d90244ae7181b5bc33e (diff) |
[Analyser] Remove unnecessary recursive visits for ExprWithCleanups and
MaterializeTemporaryExpr.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152730 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Core/ExprEngine.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Core/ExprEngine.cpp | 39 |
1 files changed, 15 insertions, 24 deletions
diff --git a/lib/StaticAnalyzer/Core/ExprEngine.cpp b/lib/StaticAnalyzer/Core/ExprEngine.cpp index 3d1d6ea8a9..fa52beea2a 100644 --- a/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -363,29 +363,22 @@ void ExprEngine::ProcessInitializer(const CFGInitializer Init, SVal thisVal = Pred->getState()->getSVal(thisReg); if (BMI->isAnyMemberInitializer()) { - ExplodedNodeSet AfterEval; - // Evaluate the initializer. - Visit(BMI->getInit(), Pred, AfterEval); - StmtNodeBuilder Bldr(AfterEval, Dst, *currentBuilderContext); - for (ExplodedNodeSet::iterator I = AfterEval.begin(), - E = AfterEval.end(); I != E; ++I){ - ExplodedNode *P = *I; - ProgramStateRef state = P->getState(); + StmtNodeBuilder Bldr(Pred, Dst, *currentBuilderContext); + ProgramStateRef state = Pred->getState(); - const FieldDecl *FD = BMI->getAnyMember(); + const FieldDecl *FD = BMI->getAnyMember(); - SVal FieldLoc = state->getLValue(FD, thisVal); - SVal InitVal = state->getSVal(BMI->getInit(), Pred->getLocationContext()); - state = state->bindLoc(FieldLoc, InitVal); + SVal FieldLoc = state->getLValue(FD, thisVal); + SVal InitVal = state->getSVal(BMI->getInit(), Pred->getLocationContext()); + state = state->bindLoc(FieldLoc, InitVal); - // Use a custom node building process. - PostInitializer PP(BMI, stackFrame); - // Builder automatically add the generated node to the deferred set, - // which are processed in the builder's dtor. - Bldr.generateNode(PP, P, state); - } + // Use a custom node building process. + PostInitializer PP(BMI, stackFrame); + // Builder automatically add the generated node to the deferred set, + // which are processed in the builder's dtor. + Bldr.generateNode(PP, Pred, state); } else { assert(BMI->isBaseInitializer()); @@ -574,9 +567,7 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, } case Stmt::ExprWithCleanupsClass: - Bldr.takeNodes(Pred); - Visit(cast<ExprWithCleanups>(S)->getSubExpr(), Pred, Dst); - Bldr.addNodes(Dst); + // Handled due to fully linearised CFG. break; // Cases not handled yet; but will handle some day. @@ -835,10 +826,10 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, Bldr.takeNodes(Pred); const MaterializeTemporaryExpr *Materialize = cast<MaterializeTemporaryExpr>(S); - if (!Materialize->getType()->isRecordType()) - CreateCXXTemporaryObject(Materialize, Pred, Dst); + if (Materialize->getType()->isRecordType()) + Dst.Add(Pred); else - Visit(Materialize->GetTemporaryExpr(), Pred, Dst); + CreateCXXTemporaryObject(Materialize, Pred, Dst); Bldr.addNodes(Dst); break; } |