@@ -86,7 +86,7 @@ class smv_typecheckt:public typecheckt
86
86
87
87
void convert (smv_parse_treet::modulet::itemt &);
88
88
void typecheck (smv_parse_treet::modulet::itemt &);
89
- void typecheck_expr_rec (exprt &, modet);
89
+ void typecheck_expr_node (exprt &, modet);
90
90
void convert_expr_to (exprt &, const typet &dest);
91
91
92
92
smv_parse_treet::modulet *modulep;
@@ -614,7 +614,10 @@ Function: smv_typecheckt::typecheck
614
614
615
615
void smv_typecheckt::typecheck (exprt &expr, modet mode)
616
616
{
617
- typecheck_expr_rec (expr, mode);
617
+ // We use visit_post instead of recursion to avoid
618
+ // stack overflows on very deep nestings of DEFINE definitions.
619
+ expr.visit_post ([this , mode](exprt &expr)
620
+ { typecheck_expr_node (expr, mode); });
618
621
}
619
622
620
623
/* ******************************************************************\
@@ -629,12 +632,8 @@ Function: smv_typecheckt::typecheck_expr_rec
629
632
630
633
\*******************************************************************/
631
634
632
- void smv_typecheckt::typecheck_expr_rec (exprt &expr, modet mode)
635
+ void smv_typecheckt::typecheck_expr_node (exprt &expr, modet mode)
633
636
{
634
- // Do the operands
635
- for (auto &op : expr.operands ())
636
- typecheck_expr_rec (op, mode);
637
-
638
637
// now post-traversal
639
638
640
639
if (expr.id ()==ID_symbol ||
0 commit comments