@@ -81,6 +81,7 @@ class smv_typecheckt:public typecheckt
8181 smv_ranget convert_type (const typet &);
8282 void convert (smv_parse_treet::modulet::itemt &);
8383 void typecheck (smv_parse_treet::modulet::itemt &);
84+ void typecheck_expr_rec (exprt &, const typet &, modet);
8485
8586 smv_parse_treet::modulet *modulep;
8687
@@ -428,7 +429,7 @@ void smv_typecheckt::typecheck_op(
428429 }
429430
430431 for (auto &op : expr.operands ())
431- typecheck (op, type, mode);
432+ typecheck_expr_rec (op, type, mode);
432433
433434 expr.type ()=type;
434435
@@ -562,6 +563,26 @@ void smv_typecheckt::typecheck(
562563 exprt &expr,
563564 const typet &type,
564565 modet mode)
566+ {
567+ typecheck_expr_rec (expr, type, mode);
568+ }
569+
570+ /* ******************************************************************\
571+
572+ Function: smv_typecheckt::typecheck_expr_rec
573+
574+ Inputs:
575+
576+ Outputs:
577+
578+ Purpose:
579+
580+ \*******************************************************************/
581+
582+ void smv_typecheckt::typecheck_expr_rec (
583+ exprt &expr,
584+ const typet &type,
585+ modet mode)
565586{
566587 const auto static nil_type = static_cast <const typet &>(get_nil_irep ());
567588
@@ -627,7 +648,7 @@ void smv_typecheckt::typecheck(
627648 }
628649
629650 for (auto &op : expr.operands ())
630- typecheck (op, op_type, mode);
651+ typecheck_expr_rec (op, op_type, mode);
631652
632653 expr.type ()=op_type;
633654 }
@@ -646,7 +667,7 @@ void smv_typecheckt::typecheck(
646667 expr.id ()==ID_gt || expr.id ()==ID_ge)
647668 {
648669 for (auto &op : expr.operands ())
649- typecheck (op, static_cast <const typet &>(get_nil_irep ()), mode);
670+ typecheck_expr_rec (op, static_cast <const typet &>(get_nil_irep ()), mode);
650671
651672 if (expr.operands ().size ()!=2 )
652673 {
@@ -659,9 +680,9 @@ void smv_typecheckt::typecheck(
659680 exprt &op0 = to_binary_expr (expr).op0 (), &op1 = to_binary_expr (expr).op1 ();
660681
661682 typet op_type=type_union (op0.type (), op1.type ());
662-
663- typecheck (op0, op_type, mode);
664- typecheck (op1, op_type, mode);
683+
684+ typecheck_expr_rec (op0, op_type, mode);
685+ typecheck_expr_rec (op1, op_type, mode);
665686
666687 INVARIANT (op0.type () == op1.type (), " type of operands of relational operators" );
667688
@@ -680,9 +701,9 @@ void smv_typecheckt::typecheck(
680701 auto &if_expr = to_if_expr (expr);
681702 auto &true_case = if_expr.true_case ();
682703 auto &false_case = if_expr.false_case ();
683- typecheck (if_expr.cond (), bool_typet{}, mode);
684- typecheck (true_case, type, mode);
685- typecheck (false_case, type, mode);
704+ typecheck_expr_rec (if_expr.cond (), bool_typet{}, mode);
705+ typecheck_expr_rec (true_case, type, mode);
706+ typecheck_expr_rec (false_case, type, mode);
686707 expr.type () = type;
687708 }
688709 else if (expr.id ()==ID_plus || expr.id ()==ID_minus ||
@@ -836,10 +857,11 @@ void smv_typecheckt::typecheck(
836857 for (auto &op : expr.operands ())
837858 {
838859 if (condition)
839- typecheck (op, bool_typet (), mode);
860+ typecheck_expr_rec (op, bool_typet (), mode);
840861 else
841862 {
842- typecheck (op, static_cast <const typet &>(get_nil_irep ()), mode);
863+ typecheck_expr_rec (
864+ op, static_cast <const typet &>(get_nil_irep ()), mode);
843865 expr.type () = type_union (expr.type (), op.type ());
844866 }
845867
@@ -855,9 +877,9 @@ void smv_typecheckt::typecheck(
855877 for (auto &op : expr.operands ())
856878 {
857879 if (condition)
858- typecheck (op, bool_typet (), mode);
880+ typecheck_expr_rec (op, bool_typet (), mode);
859881 else
860- typecheck (op, expr.type (), mode);
882+ typecheck_expr_rec (op, expr.type (), mode);
861883
862884 condition=!condition;
863885 }
@@ -871,15 +893,15 @@ void smv_typecheckt::typecheck(
871893 throw errort ().with_location (expr.source_location ())
872894 << " CTL operator not permitted here" ;
873895 expr.type () = bool_typet ();
874- typecheck (to_unary_expr (expr).op (), expr.type (), mode);
896+ typecheck_expr_rec (to_unary_expr (expr).op (), expr.type (), mode);
875897 }
876898 else if (expr.id () == ID_X || expr.id () == ID_F || expr.id () == ID_G)
877899 {
878900 if (mode != LTL)
879901 throw errort ().with_location (expr.source_location ())
880902 << " LTL operator not permitted here" ;
881903 expr.type () = bool_typet ();
882- typecheck (to_unary_expr (expr).op (), expr.type (), mode);
904+ typecheck_expr_rec (to_unary_expr (expr).op (), expr.type (), mode);
883905 }
884906 else if (
885907 expr.id () == ID_EU || expr.id () == ID_ER || expr.id () == ID_AU ||
@@ -890,8 +912,8 @@ void smv_typecheckt::typecheck(
890912 << " CTL operator not permitted here" ;
891913 auto &binary_expr = to_binary_expr (expr);
892914 expr.type () = bool_typet ();
893- typecheck (binary_expr.lhs (), expr.type (), mode);
894- typecheck (binary_expr.rhs (), expr.type (), mode);
915+ typecheck_expr_rec (binary_expr.lhs (), expr.type (), mode);
916+ typecheck_expr_rec (binary_expr.rhs (), expr.type (), mode);
895917 }
896918 else if (expr.id () == ID_U || expr.id () == ID_R)
897919 {
@@ -900,8 +922,8 @@ void smv_typecheckt::typecheck(
900922 << " LTL operator not permitted here" ;
901923 auto &binary_expr = to_binary_expr (expr);
902924 expr.type () = bool_typet ();
903- typecheck (binary_expr.lhs (), expr.type (), mode);
904- typecheck (binary_expr.rhs (), expr.type (), mode);
925+ typecheck_expr_rec (binary_expr.lhs (), expr.type (), mode);
926+ typecheck_expr_rec (binary_expr.rhs (), expr.type (), mode);
905927 }
906928 else if (expr.id ()==ID_typecast)
907929 {
0 commit comments