Skip to content

Commit 8b88a47

Browse files
authored
Merge pull request #982 from diffblue/define2
SMV: do not allow defining identifiers that are already declared
2 parents e750bad + 35ecf21 commit 8b88a47

15 files changed

+132
-29
lines changed

regression/smv/assign/assign1.desc

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
KNOWNBUG
2+
assign1.smv
3+
4+
^file .* line 6: variable `x' already assigned.*$
5+
^EXIT=1$
6+
^SIGNAL=0$
7+
--
8+
--

regression/smv/assign/assign1.smv

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
MODULE main
2+
3+
VAR x : 1..4;
4+
5+
ASSIGN x := 1;
6+
7+
-- not allowed, x is already assigned
8+
ASSIGN init(x) := 2;

regression/smv/assign/assign2.desc

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
KNOWNBUG
2+
assign1.smv
3+
4+
^file .* line 6: variable `x' already assigned.*$
5+
^EXIT=1$
6+
^SIGNAL=0$
7+
--
8+
--

regression/smv/assign/assign2.smv

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
MODULE main
2+
3+
VAR x : 1..4;
4+
5+
ASSIGN x := 1;
6+
7+
-- not allowed, x is already assigned
8+
ASSIGN next(x) := 2;

regression/smv/define/define2.desc

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
define2.smv
3+
4+
^file .* line 6: variable `x' already declared.*$
5+
^EXIT=1$
6+
^SIGNAL=0$
7+
--
8+
--

regression/smv/define/define2.smv

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
MODULE main
2+
3+
VAR x : boolean;
4+
5+
-- not allowed, x is already a variable
6+
DEFINE x := TRUE;

regression/smv/define/define3.desc

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
define3.smv
3+
4+
^file .* line 6: variable `x' already defined.*$
5+
^EXIT=1$
6+
^SIGNAL=0$
7+
--
8+
--

regression/smv/define/define3.smv

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
MODULE main
2+
3+
DEFINE x := TRUE;
4+
5+
-- not allowed, x is already defined
6+
VAR x : boolean;

regression/smv/define/define4.desc

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
define4.smv
3+
4+
^file .* line 6: variable `x' already defined.*$
5+
^EXIT=1$
6+
^SIGNAL=0$
7+
--
8+
--

regression/smv/define/define4.smv

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
MODULE main
2+
3+
DEFINE x := TRUE;
4+
5+
-- not allowed, x is already defined
6+
ASSIGN x := TRUE;

regression/smv/define/define5.desc

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
KNOWNBUG
2+
define5.smv
3+
4+
^file .* line 6: variable `x' already defined.*$
5+
^EXIT=1$
6+
^SIGNAL=0$
7+
--
8+
--

regression/smv/define/define5.smv

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
MODULE main
2+
3+
DEFINE x := TRUE;
4+
5+
-- not allowed, x is already defined
6+
ASSIGN next(x) := TRUE;

regression/smv/define/define6.desc

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
KNOWNBUG
2+
define6.smv
3+
4+
^file .* line 6: variable `x' already defined.*$
5+
^EXIT=1$
6+
^SIGNAL=0$
7+
--
8+
--

regression/smv/define/define6.smv

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
MODULE main
2+
3+
DEFINE x := TRUE;
4+
5+
-- not allowed, x is already defined
6+
ASSIGN init(x) := TRUE;

src/smvlang/parser.y

+30-29
Original file line numberDiff line numberDiff line change
@@ -477,39 +477,40 @@ defines: define
477477
;
478478

479479
define : assignment_var BECOMES_Token formula ';'
480-
{
481-
const irep_idt &identifier=stack_expr($1).get(ID_identifier);
482-
smv_parse_treet::mc_vart &var=PARSER.module->vars[identifier];
480+
{
481+
const irep_idt &identifier=stack_expr($1).get(ID_identifier);
482+
smv_parse_treet::mc_vart &var=PARSER.module->vars[identifier];
483483

484-
switch(var.var_class)
485-
{
486-
case smv_parse_treet::mc_vart::UNKNOWN:
487-
var.type.make_nil();
488-
var.var_class=smv_parse_treet::mc_vart::DEFINED;
489-
break;
484+
switch(var.var_class)
485+
{
486+
case smv_parse_treet::mc_vart::UNKNOWN:
487+
var.type.make_nil();
488+
var.var_class=smv_parse_treet::mc_vart::DEFINED;
489+
break;
490490

491-
case smv_parse_treet::mc_vart::DECLARED:
492-
var.var_class=smv_parse_treet::mc_vart::DEFINED;
493-
break;
491+
case smv_parse_treet::mc_vart::DECLARED:
492+
yyerror("variable `"+id2string(identifier)+"' already declared");
493+
YYERROR;
494+
break;
494495

495-
case smv_parse_treet::mc_vart::DEFINED:
496-
yyerror("variable `"+id2string(identifier)+"' already defined");
497-
YYERROR;
498-
break;
499-
500-
case smv_parse_treet::mc_vart::ARGUMENT:
501-
yyerror("variable `"+id2string(identifier)+"' already declared as argument");
502-
YYERROR;
503-
break;
504-
505-
default:
506-
DATA_INVARIANT(false, "unexpected variable class");
507-
}
496+
case smv_parse_treet::mc_vart::DEFINED:
497+
yyerror("variable `"+id2string(identifier)+"' already defined");
498+
YYERROR;
499+
break;
508500

509-
binary($$, $1, ID_equal, $3);
510-
PARSER.module->add_define(to_equal_expr(stack_expr($$)));
511-
}
512-
;
501+
case smv_parse_treet::mc_vart::ARGUMENT:
502+
yyerror("variable `"+id2string(identifier)+"' already declared as argument");
503+
YYERROR;
504+
break;
505+
506+
default:
507+
DATA_INVARIANT(false, "unexpected variable class");
508+
}
509+
510+
binary($$, $1, ID_equal, $3);
511+
PARSER.module->add_define(to_equal_expr(stack_expr($$)));
512+
}
513+
;
513514

514515
formula : term
515516
;

0 commit comments

Comments
 (0)