parent
26d54b3ef3
commit
b45e6b91c6
|
@ -494,9 +494,6 @@ protected:
|
|||
/// VisitDeclStmt - Transfer function logic for DeclStmts.
|
||||
void VisitDeclStmt(DeclStmt* DS, NodeTy* Pred, NodeSet& Dst);
|
||||
|
||||
void VisitDeclStmtAux(DeclStmt* DS, ScopedDecl* D,
|
||||
NodeTy* Pred, NodeSet& Dst);
|
||||
|
||||
/// VisitGuardedExpr - Transfer function logic for ?, __builtin_choose
|
||||
void VisitGuardedExpr(Expr* Ex, Expr* L, Expr* R, NodeTy* Pred, NodeSet& Dst);
|
||||
|
||||
|
|
|
@ -1452,25 +1452,19 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
|
|||
}
|
||||
|
||||
void GRExprEngine::VisitDeclStmt(DeclStmt* DS, NodeTy* Pred, NodeSet& Dst) {
|
||||
VisitDeclStmtAux(DS, DS->getDecl(), Pred, Dst);
|
||||
}
|
||||
|
||||
void GRExprEngine::VisitDeclStmtAux(DeclStmt* DS, ScopedDecl* D,
|
||||
NodeTy* Pred, NodeSet& Dst) {
|
||||
|
||||
if (!D)
|
||||
return;
|
||||
// The CFG has one DeclStmt per Decl, so we don't need to walk the
|
||||
// Decl chain.
|
||||
|
||||
if (!isa<VarDecl>(D)) {
|
||||
VisitDeclStmtAux(DS, D->getNextDeclarator(), Pred, Dst);
|
||||
ScopedDecl* D = DS->getDecl();
|
||||
|
||||
if (!D || !isa<VarDecl>(D))
|
||||
return;
|
||||
}
|
||||
|
||||
const VarDecl* VD = dyn_cast<VarDecl>(D);
|
||||
|
||||
// FIXME: Add support for local arrays.
|
||||
if (VD->getType()->isArrayType()) {
|
||||
VisitDeclStmtAux(DS, D->getNextDeclarator(), Pred, Dst);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1480,21 +1474,16 @@ void GRExprEngine::VisitDeclStmtAux(DeclStmt* DS, ScopedDecl* D,
|
|||
// time a function is called those values may not be current.
|
||||
NodeSet Tmp;
|
||||
|
||||
if (Ex) Visit(Ex, Pred, Tmp);
|
||||
if (Tmp.empty()) Tmp.Add(Pred);
|
||||
if (Ex)
|
||||
Visit(Ex, Pred, Tmp);
|
||||
|
||||
if (Tmp.empty())
|
||||
Tmp.Add(Pred);
|
||||
|
||||
for (NodeSet::iterator I=Tmp.begin(), E=Tmp.end(); I!=E; ++I) {
|
||||
const GRState* St = GetState(*I);
|
||||
St = StateMgr.AddDecl(St, VD, Ex, Builder->getCurrentBlockCount());
|
||||
|
||||
// Create a new node. We don't really need to create a new NodeSet
|
||||
// here, but it simplifies things and doesn't cost much.
|
||||
NodeSet Tmp2;
|
||||
MakeNode(Tmp2, DS, *I, St);
|
||||
if (Tmp2.empty()) Tmp2.Add(*I);
|
||||
|
||||
for (NodeSet::iterator I2=Tmp2.begin(), E2=Tmp2.end(); I2!=E2; ++I2)
|
||||
VisitDeclStmtAux(DS, D->getNextDeclarator(), *I2, Dst);
|
||||
MakeNode(Dst, DS, *I, St);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue