Skip to content

Commit fa53ff3

Browse files
committed
SMV: typechecking for ?:
This fixes type checking for SMV ?:
1 parent 081b322 commit fa53ff3

File tree

3 files changed

+19
-6
lines changed

3 files changed

+19
-6
lines changed
+2-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
KNOWNBUG
1+
CORE
22
smv_if2.smv
3-
3+
--bound 1
44
^EXIT=0$
55
^SIGNAL=0$
66
--
77
--
8-
This yields a type error.

regression/smv/expressions/smv_if2.smv

+2
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,5 @@ VAR b : 1..4;
66

77
ASSIGN init(b) := 1;
88
ASSIGN next(b) := (input ? 1 : 3) + 1;
9+
10+
LTLSPEC X (b=2 | b=4)

src/smvlang/smv_typecheck.cpp

+15-3
Original file line numberDiff line numberDiff line change
@@ -704,9 +704,21 @@ void smv_typecheckt::typecheck_expr_rec(
704704
auto &true_case = if_expr.true_case();
705705
auto &false_case = if_expr.false_case();
706706
typecheck_expr_rec(if_expr.cond(), bool_typet{}, mode);
707-
typecheck_expr_rec(true_case, dest_type, mode);
708-
typecheck_expr_rec(false_case, dest_type, mode);
709-
expr.type() = dest_type;
707+
708+
if(dest_type.is_nil())
709+
{
710+
typecheck_expr_rec(true_case, nil_type, mode);
711+
typecheck_expr_rec(false_case, nil_type, mode);
712+
expr.type() = type_union(true_case.type(), false_case.type());
713+
typecheck_expr_rec(true_case, expr.type(), mode);
714+
typecheck_expr_rec(false_case, expr.type(), mode);
715+
}
716+
else
717+
{
718+
typecheck_expr_rec(true_case, dest_type, mode);
719+
typecheck_expr_rec(false_case, dest_type, mode);
720+
expr.type() = dest_type;
721+
}
710722
}
711723
else if(expr.id()==ID_plus || expr.id()==ID_minus ||
712724
expr.id()==ID_mult || expr.id()==ID_div ||

0 commit comments

Comments
 (0)