@@ -81,6 +81,7 @@ class smv_typecheckt:public typecheckt
81
81
smv_ranget convert_type (const typet &);
82
82
void convert (smv_parse_treet::modulet::itemt &);
83
83
void typecheck (smv_parse_treet::modulet::itemt &);
84
+ void typecheck_expr_rec (exprt &, const typet &, modet);
84
85
85
86
smv_parse_treet::modulet *modulep;
86
87
@@ -428,7 +429,7 @@ void smv_typecheckt::typecheck_op(
428
429
}
429
430
430
431
for (auto &op : expr.operands ())
431
- typecheck (op, type, mode);
432
+ typecheck_expr_rec (op, type, mode);
432
433
433
434
expr.type ()=type;
434
435
@@ -562,6 +563,26 @@ void smv_typecheckt::typecheck(
562
563
exprt &expr,
563
564
const typet &type,
564
565
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)
565
586
{
566
587
const auto static nil_type = static_cast <const typet &>(get_nil_irep ());
567
588
@@ -627,7 +648,7 @@ void smv_typecheckt::typecheck(
627
648
}
628
649
629
650
for (auto &op : expr.operands ())
630
- typecheck (op, op_type, mode);
651
+ typecheck_expr_rec (op, op_type, mode);
631
652
632
653
expr.type ()=op_type;
633
654
}
@@ -646,7 +667,7 @@ void smv_typecheckt::typecheck(
646
667
expr.id ()==ID_gt || expr.id ()==ID_ge)
647
668
{
648
669
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);
650
671
651
672
if (expr.operands ().size ()!=2 )
652
673
{
@@ -659,9 +680,9 @@ void smv_typecheckt::typecheck(
659
680
exprt &op0 = to_binary_expr (expr).op0 (), &op1 = to_binary_expr (expr).op1 ();
660
681
661
682
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);
665
686
666
687
INVARIANT (op0.type () == op1.type (), " type of operands of relational operators" );
667
688
@@ -680,9 +701,9 @@ void smv_typecheckt::typecheck(
680
701
auto &if_expr = to_if_expr (expr);
681
702
auto &true_case = if_expr.true_case ();
682
703
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);
686
707
expr.type () = type;
687
708
}
688
709
else if (expr.id ()==ID_plus || expr.id ()==ID_minus ||
@@ -836,10 +857,11 @@ void smv_typecheckt::typecheck(
836
857
for (auto &op : expr.operands ())
837
858
{
838
859
if (condition)
839
- typecheck (op, bool_typet (), mode);
860
+ typecheck_expr_rec (op, bool_typet (), mode);
840
861
else
841
862
{
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);
843
865
expr.type () = type_union (expr.type (), op.type ());
844
866
}
845
867
@@ -855,9 +877,9 @@ void smv_typecheckt::typecheck(
855
877
for (auto &op : expr.operands ())
856
878
{
857
879
if (condition)
858
- typecheck (op, bool_typet (), mode);
880
+ typecheck_expr_rec (op, bool_typet (), mode);
859
881
else
860
- typecheck (op, expr.type (), mode);
882
+ typecheck_expr_rec (op, expr.type (), mode);
861
883
862
884
condition=!condition;
863
885
}
@@ -871,15 +893,15 @@ void smv_typecheckt::typecheck(
871
893
throw errort ().with_location (expr.source_location ())
872
894
<< " CTL operator not permitted here" ;
873
895
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);
875
897
}
876
898
else if (expr.id () == ID_X || expr.id () == ID_F || expr.id () == ID_G)
877
899
{
878
900
if (mode != LTL)
879
901
throw errort ().with_location (expr.source_location ())
880
902
<< " LTL operator not permitted here" ;
881
903
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);
883
905
}
884
906
else if (
885
907
expr.id () == ID_EU || expr.id () == ID_ER || expr.id () == ID_AU ||
@@ -890,8 +912,8 @@ void smv_typecheckt::typecheck(
890
912
<< " CTL operator not permitted here" ;
891
913
auto &binary_expr = to_binary_expr (expr);
892
914
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);
895
917
}
896
918
else if (expr.id () == ID_U || expr.id () == ID_R)
897
919
{
@@ -900,8 +922,8 @@ void smv_typecheckt::typecheck(
900
922
<< " LTL operator not permitted here" ;
901
923
auto &binary_expr = to_binary_expr (expr);
902
924
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);
905
927
}
906
928
else if (expr.id ()==ID_typecast)
907
929
{
0 commit comments