Statement,
StatementAsLValue,
Initializer,
- Dtor,
+ ImplicitDtor,
// dtor kind
AutomaticObjectDtor,
BaseDtor,
Kind getKind() const { return static_cast<Kind>(Data1.getInt()); }
Kind getDtorKind() const {
- assert(getKind() == Dtor);
+ assert(getKind() == ImplicitDtor);
return static_cast<Kind>(Data2.getInt() + DTOR_BEGIN);
}
class CFGImplicitDtor : public CFGElement {
protected:
CFGImplicitDtor(unsigned K, void* P, void* S)
- : CFGElement(P, Dtor, S, K - DTOR_BEGIN) {}
+ : CFGElement(P, ImplicitDtor, S, K - DTOR_BEGIN) {}
public:
CFGImplicitDtor() {}
static bool classof(const CFGElement *E) {
- return E->getKind() == Dtor;
+ return E->getKind() == ImplicitDtor;
}
};
}
static bool classof(const CFGElement *E) {
- return E->getKind() == Dtor && E->getDtorKind() == AutomaticObjectDtor;
+ return E->getKind() == ImplicitDtor &&
+ E->getDtorKind() == AutomaticObjectDtor;
}
};
}
static bool classof(const CFGElement *E) {
- return E->getKind() == Dtor && E->getDtorKind() == BaseDtor;
+ return E->getKind() == ImplicitDtor && E->getDtorKind() == BaseDtor;
}
};
}
static bool classof(const CFGElement *E) {
- return E->getKind() == Dtor && E->getDtorKind() == MemberDtor;
+ return E->getKind() == ImplicitDtor && E->getDtorKind() == MemberDtor;
}
};
}
static bool classof(const CFGElement *E) {
- return E->getKind() == Dtor && E->getDtorKind() == TemporaryDtor;
+ return E->getKind() == ImplicitDtor && E->getDtorKind() == TemporaryDtor;
}
};
SubEngine.ProcessEndPath(Builder);
}
- void ProcessStmt(const CFGElement E, GRStmtNodeBuilder& Builder) {
- SubEngine.ProcessStmt(E, Builder);
+ void ProcessElement(const CFGElement E, GRStmtNodeBuilder& Builder) {
+ SubEngine.ProcessElement(E, Builder);
}
bool ProcessBlockEntrance(const CFGBlock* Blk, const ExplodedNode *Pred,
return static_cast<CHECKER*>(lookupChecker(CHECKER::getTag()));
}
- /// ProcessStmt - Called by GRCoreEngine. Used to generate new successor
- /// nodes by processing the 'effects' of a block-level statement.
- void ProcessStmt(const CFGElement E, GRStmtNodeBuilder& builder);
+ /// ProcessElement - Called by GRCoreEngine. Used to generate new successor
+ /// nodes by processing the 'effects' of a CFG element.
+ void ProcessElement(const CFGElement E, GRStmtNodeBuilder& builder);
+
+ void ProcessStmt(const CFGStmt S, GRStmtNodeBuilder &builder);
+
+ void ProcessInitializer(const CFGInitializer I, GRStmtNodeBuilder &builder);
+
+ void ProcessImplicitDtor(const CFGImplicitDtor D, GRStmtNodeBuilder &builder);
/// ProcessBlockEntrance - Called by GRCoreEngine when start processing
/// a CFGBlock. This method returns true if the analysis should continue
/// Called by GRCoreEngine. Used to generate new successor
/// nodes by processing the 'effects' of a block-level statement.
- virtual void ProcessStmt(const CFGElement E, GRStmtNodeBuilder& builder) = 0;
+ virtual void ProcessElement(const CFGElement E, GRStmtNodeBuilder& builder)=0;
/// Called by GRCoreEngine when start processing
/// a CFGBlock. This method returns true if the analysis should continue
if (CFGElement E = L.getFirstElement()) {
GRStmtNodeBuilder Builder(L.getBlock(), 0, Pred, this,
SubEngine.getStateManager());
- ProcessStmt(E, Builder);
+ ProcessElement(E, Builder);
}
else
HandleBlockExit(L.getBlock(), Pred);
else {
GRStmtNodeBuilder Builder(B, StmtIdx, Pred, this,
SubEngine.getStateManager());
- ProcessStmt((*B)[StmtIdx], Builder);
+ ProcessElement((*B)[StmtIdx], Builder);
}
}
}
}
-void GRExprEngine::ProcessStmt(const CFGElement CE,GRStmtNodeBuilder& builder) {
- CurrentStmt = CE.getAs<CFGStmt>();
+void GRExprEngine::ProcessElement(const CFGElement E,
+ GRStmtNodeBuilder& builder) {
+ switch (E.getKind()) {
+ case CFGElement::Statement:
+ case CFGElement::StatementAsLValue:
+ ProcessStmt(E.getAs<CFGStmt>(), builder);
+ break;
+ case CFGElement::Initializer:
+ ProcessInitializer(E.getAs<CFGInitializer>(), builder);
+ break;
+ case CFGElement::ImplicitDtor:
+ ProcessImplicitDtor(E.getAs<CFGImplicitDtor>(), builder);
+ break;
+ default:
+ // Suppress compiler warning.
+ llvm_unreachable("Unexpected CFGElement kind.");
+ }
+}
+
+void GRExprEngine::ProcessStmt(const CFGStmt S, GRStmtNodeBuilder& builder) {
+ CurrentStmt = S.getStmt();
PrettyStackTraceLoc CrashInfo(getContext().getSourceManager(),
CurrentStmt->getLocStart(),
"Error evaluating statement");
Builder->SetCleanedState(*I == EntryNode ? CleanedState : GetState(*I));
// Visit the statement.
- if (CE.getAs<CFGStmt>().asLValue())
+ if (S.asLValue())
VisitLValue(cast<Expr>(CurrentStmt), *I, Dst);
else
Visit(CurrentStmt, *I, Dst);
Builder = NULL;
}
+void GRExprEngine::ProcessInitializer(const CFGInitializer I,
+ GRStmtNodeBuilder &builder) {
+}
+
+void GRExprEngine::ProcessImplicitDtor(const CFGImplicitDtor D,
+ GRStmtNodeBuilder &builder) {
+}
+
void GRExprEngine::Visit(const Stmt* S, ExplodedNode* Pred,
ExplodedNodeSet& Dst) {
PrettyStackTraceLoc CrashInfo(getContext().getSourceManager(),