Skip to content

Commit a8a94b8

Browse files
committed
SMV: typechecking for ?:
This fixes type checking for SMV ?:
1 parent f8aa6bd commit a8a94b8

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
@@ -703,9 +703,21 @@ void smv_typecheckt::typecheck_expr_rec(
703703
auto &true_case = if_expr.true_case();
704704
auto &false_case = if_expr.false_case();
705705
typecheck_expr_rec(if_expr.cond(), bool_typet{}, mode);
706-
typecheck_expr_rec(true_case, dest_type, mode);
707-
typecheck_expr_rec(false_case, dest_type, mode);
708-
expr.type() = dest_type;
706+
707+
if(dest_type.is_nil())
708+
{
709+
typecheck_expr_rec(true_case, nil_type, mode);
710+
typecheck_expr_rec(false_case, nil_type, mode);
711+
expr.type() = type_union(true_case.type(), false_case.type());
712+
typecheck_expr_rec(true_case, expr.type(), mode);
713+
typecheck_expr_rec(false_case, expr.type(), mode);
714+
}
715+
else
716+
{
717+
typecheck_expr_rec(true_case, dest_type, mode);
718+
typecheck_expr_rec(false_case, dest_type, mode);
719+
expr.type() = dest_type;
720+
}
709721
}
710722
else if(expr.id()==ID_plus || expr.id()==ID_minus ||
711723
expr.id()==ID_mult || expr.id()==ID_div ||

0 commit comments

Comments
 (0)