summaryrefslogtreecommitdiffstats
path: root/clang/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
commit5923cbd27be7e70b875b1ff38fa04f24258e73e2 (patch)
tree8842601fcdd36220c5096a8fa119287e51fd4d44 /clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
parentd23e333bf6efb3e5952190f268d464f3795d939e (diff)
downloadbcm5719-llvm-5923cbd27be7e70b875b1ff38fa04f24258e73e2.tar.gz
bcm5719-llvm-5923cbd27be7e70b875b1ff38fa04f24258e73e2.zip
[Analyser] Remove unnecessary recursive visits for ExprWithCleanups and
MaterializeTemporaryExpr. llvm-svn: 152730
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/ExprEngine.cpp')
-rw-r--r--clang/lib/StaticAnalyzer/Core/ExprEngine.cpp39
1 files changed, 15 insertions, 24 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
index 3d1d6ea8a9f..fa52beea2a7 100644
--- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
+++ b/clang/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;
}
OpenPOWER on IntegriCloud