Skip to content

Commit 29491d5

Browse files
authored
Merge pull request #1002 from diffblue/smv-typed-assign
SMV: make `ASSIGN` typed
2 parents b07f60d + f4e2663 commit 29491d5

File tree

5 files changed

+53
-33
lines changed

5 files changed

+53
-33
lines changed
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
KNOWNBUG
1+
CORE
22
smv_if2.smv
33

4+
^\[.*\] X \(b = 2 \| b = 4\): PROVED up to bound 5$
45
^EXIT=0$
56
^SIGNAL=0$
67
--
78
--
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)
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
CORE broken-smt-backend
22
range_type5.smv
33
--bound 3
4-
^EXIT=0$
4+
^file .* line 14: Expected expression of type `5..10', but got expression `x', which is of type `0..6'$
5+
^EXIT=2$
56
^SIGNAL=0$
6-
^\[spec1\] AG \(!x = 6\): PROVED up to bound 3$
77
--
88
^warning: ignoring

src/smvlang/smv_parse_tree.h

+9-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,15 @@ class smv_parse_treet
113113
}
114114

115115
// for ASSIGN_CURRENT, ASSIGN_INIT, ASSIGN_NEXT, DEFINE
116-
const equal_exprt &equal_expr()
116+
const equal_exprt &equal_expr() const
117+
{
118+
PRECONDITION(
119+
is_assign_current() || is_assign_init() || is_assign_next() ||
120+
is_define());
121+
return to_equal_expr(expr);
122+
}
123+
124+
equal_exprt &equal_expr()
117125
{
118126
PRECONDITION(
119127
is_assign_current() || is_assign_init() || is_assign_next() ||

src/smvlang/smv_typecheck.cpp

+38-28
Original file line numberDiff line numberDiff line change
@@ -1257,47 +1257,57 @@ Function: smv_typecheckt::typecheck
12571257
void smv_typecheckt::typecheck(
12581258
smv_parse_treet::modulet::itemt &item)
12591259
{
1260-
modet mode;
1261-
12621260
switch(item.item_type)
12631261
{
1264-
case smv_parse_treet::modulet::itemt::ASSIGN_CURRENT:
1265-
mode = OTHER;
1266-
break;
1267-
1268-
case smv_parse_treet::modulet::itemt::ASSIGN_INIT:
1269-
mode = INIT;
1270-
break;
1271-
1272-
case smv_parse_treet::modulet::itemt::ASSIGN_NEXT:
1273-
mode = TRANS;
1274-
break;
1275-
12761262
case smv_parse_treet::modulet::itemt::INIT:
1277-
mode=INIT;
1278-
break;
1263+
typecheck(item.expr, INIT);
1264+
convert_expr_to(item.expr, bool_typet{});
1265+
return;
12791266

12801267
case smv_parse_treet::modulet::itemt::TRANS:
1281-
mode=TRANS;
1282-
break;
1268+
typecheck(item.expr, TRANS);
1269+
convert_expr_to(item.expr, bool_typet{});
1270+
return;
12831271

12841272
case smv_parse_treet::modulet::itemt::CTLSPEC:
1285-
mode = CTL;
1286-
break;
1273+
typecheck(item.expr, CTL);
1274+
convert_expr_to(item.expr, bool_typet{});
1275+
return;
12871276

12881277
case smv_parse_treet::modulet::itemt::LTLSPEC:
1289-
mode = LTL;
1290-
break;
1278+
typecheck(item.expr, LTL);
1279+
convert_expr_to(item.expr, bool_typet{});
1280+
return;
12911281

1292-
case smv_parse_treet::modulet::itemt::DEFINE:
12931282
case smv_parse_treet::modulet::itemt::INVAR:
12941283
case smv_parse_treet::modulet::itemt::FAIRNESS:
1295-
default:
1296-
mode=OTHER;
1297-
}
1284+
typecheck(item.expr, OTHER);
1285+
convert_expr_to(item.expr, bool_typet{});
1286+
return;
1287+
1288+
case smv_parse_treet::modulet::itemt::ASSIGN_CURRENT:
1289+
typecheck(item.equal_expr().lhs(), OTHER);
1290+
typecheck(item.equal_expr().rhs(), item.equal_expr().lhs().type(), OTHER);
1291+
item.equal_expr().type() = bool_typet{};
1292+
return;
1293+
1294+
case smv_parse_treet::modulet::itemt::ASSIGN_INIT:
1295+
typecheck(item.equal_expr().lhs(), INIT);
1296+
typecheck(item.equal_expr().rhs(), item.equal_expr().lhs().type(), INIT);
1297+
item.equal_expr().type() = bool_typet{};
1298+
return;
12981299

1299-
typecheck(item.expr, mode);
1300-
convert_expr_to(item.expr, bool_typet{});
1300+
case smv_parse_treet::modulet::itemt::ASSIGN_NEXT:
1301+
typecheck(item.equal_expr().lhs(), TRANS);
1302+
typecheck(item.equal_expr().rhs(), item.equal_expr().lhs().type(), TRANS);
1303+
item.equal_expr().type() = bool_typet{};
1304+
return;
1305+
1306+
case smv_parse_treet::modulet::itemt::DEFINE:
1307+
typecheck(item.expr, OTHER);
1308+
item.equal_expr().type() = bool_typet{};
1309+
return;
1310+
}
13011311
}
13021312

13031313
/*******************************************************************\

0 commit comments

Comments
 (0)