|
@@ -639,7 +639,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,
|
|
|
case Stmt::StringLiteralClass:
|
|
|
case Stmt::ObjCStringLiteralClass:
|
|
|
case Stmt::CXXBindTemporaryExprClass:
|
|
|
- case Stmt::CXXDefaultArgExprClass:
|
|
|
case Stmt::SubstNonTypeTemplateParmExprClass:
|
|
|
case Stmt::CXXNullPtrLiteralExprClass: {
|
|
|
Bldr.takeNodes(Pred);
|
|
@@ -650,6 +649,39 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
+ case Stmt::CXXDefaultArgExprClass: {
|
|
|
+ Bldr.takeNodes(Pred);
|
|
|
+ ExplodedNodeSet PreVisit;
|
|
|
+ getCheckerManager().runCheckersForPreStmt(PreVisit, Pred, S, *this);
|
|
|
+
|
|
|
+ ExplodedNodeSet Tmp;
|
|
|
+ StmtNodeBuilder Bldr2(PreVisit, Tmp, *currBldrCtx);
|
|
|
+
|
|
|
+ const LocationContext *LCtx = Pred->getLocationContext();
|
|
|
+ const Expr *ArgE = cast<CXXDefaultArgExpr>(S)->getExpr();
|
|
|
+
|
|
|
+ // Avoid creating and destroying a lot of APSInts.
|
|
|
+ SVal V;
|
|
|
+ llvm::APSInt Result;
|
|
|
+
|
|
|
+ for (ExplodedNodeSet::iterator I = PreVisit.begin(), E = PreVisit.end();
|
|
|
+ I != E; ++I) {
|
|
|
+ ProgramStateRef State = (*I)->getState();
|
|
|
+
|
|
|
+ if (ArgE->EvaluateAsInt(Result, getContext()))
|
|
|
+ V = svalBuilder.makeIntVal(Result);
|
|
|
+ else
|
|
|
+ V = State->getSVal(ArgE, LCtx);
|
|
|
+
|
|
|
+ State = State->BindExpr(S, LCtx, V);
|
|
|
+ Bldr2.generateNode(S, *I, State);
|
|
|
+ }
|
|
|
+
|
|
|
+ getCheckerManager().runCheckersForPostStmt(Dst, Tmp, S, *this);
|
|
|
+ Bldr.addNodes(Dst);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
case Expr::ObjCArrayLiteralClass:
|
|
|
case Expr::ObjCDictionaryLiteralClass:
|
|
|
// FIXME: explicitly model with a region and the actual contents
|