aboutsummaryrefslogtreecommitdiff
path: root/lib/StaticAnalyzer/Core/ExprEngine.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erikjv@me.com>2012-03-14 18:01:43 +0000
committerErik Verbruggen <erikjv@me.com>2012-03-14 18:01:43 +0000
commite711d7e7875920fee4180a26bfc67d67f0f71a2c (patch)
tree59980a6ec044aa85c32a42b94898bb882d12686d /lib/StaticAnalyzer/Core/ExprEngine.cpp
parent72ff6bb6f61e39b62e000d90244ae7181b5bc33e (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.cpp39
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;
}