Skip to content

Commit acc4ccd

Browse files
authored
Merge pull request #1399 from diffblue/smv-vars-erroring
SMV: move check for duplicate declarations to type checker
2 parents 8821039 + 45b79da commit acc4ccd

File tree

4 files changed

+15
-77
lines changed

4 files changed

+15
-77
lines changed

regression/smv/define/define2.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ CORE
22
define2.smv
33

44
^file .* line 6: variable `x' already declared.*$
5-
^EXIT=1$
5+
^EXIT=2$
66
^SIGNAL=0$
77
--
88
--

regression/smv/define/define4.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ CORE
22
define4.smv
33

44
^file .* line 6: variable `x' already defined.*$
5-
^EXIT=1$
5+
^EXIT=2$
66
^SIGNAL=0$
77
--
88
--

src/smvlang/parser.y

Lines changed: 3 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -698,27 +698,7 @@ var_decl : variable_identifier ':' type_specifier ';'
698698
{
699699
const irep_idt &identifier=stack_expr($1).get(ID_identifier);
700700
smv_parse_treet::mc_vart &var=PARSER.module->vars[identifier];
701-
702-
switch(var.var_class)
703-
{
704-
case smv_parse_treet::mc_vart::UNKNOWN:
705-
var.type=stack_type($3);
706-
var.var_class=smv_parse_treet::mc_vart::DECLARED;
707-
break;
708-
709-
case smv_parse_treet::mc_vart::DEFINED:
710-
case smv_parse_treet::mc_vart::DECLARED:
711-
break;
712-
713-
case smv_parse_treet::mc_vart::ARGUMENT:
714-
yyerror("variable `"+id2string(identifier)+"' already declared as argument");
715-
YYERROR;
716-
break;
717-
718-
default:
719-
DATA_INVARIANT(false, "unexpected variable class");
720-
}
721-
701+
(void)var;
722702
PARSER.module->add_var(stack_expr($1), stack_type($3));
723703
}
724704
;
@@ -742,32 +722,7 @@ assignment : assignment_head '(' assignment_var ')' BECOMES_Token formula ';'
742722
{
743723
const irep_idt &identifier=stack_expr($1).get(ID_identifier);
744724
smv_parse_treet::mc_vart &var=PARSER.module->vars[identifier];
745-
746-
switch(var.var_class)
747-
{
748-
case smv_parse_treet::mc_vart::UNKNOWN:
749-
var.type.make_nil();
750-
var.var_class=smv_parse_treet::mc_vart::DEFINED;
751-
break;
752-
753-
case smv_parse_treet::mc_vart::DECLARED:
754-
var.var_class=smv_parse_treet::mc_vart::DEFINED;
755-
break;
756-
757-
case smv_parse_treet::mc_vart::DEFINED:
758-
yyerror("variable `"+id2string(identifier)+"' already defined");
759-
YYERROR;
760-
break;
761-
762-
case smv_parse_treet::mc_vart::ARGUMENT:
763-
yyerror("variable `"+id2string(identifier)+"' already declared as argument");
764-
YYERROR;
765-
break;
766-
767-
default:
768-
DATA_INVARIANT(false, "unexpected variable class");
769-
}
770-
725+
(void)var;
771726
PARSER.module->add_assign_current(std::move(stack_expr($1)), std::move(stack_expr($3)));
772727
}
773728
;
@@ -788,33 +743,7 @@ define : assignment_var BECOMES_Token formula ';'
788743
{
789744
const irep_idt &identifier=stack_expr($1).get(ID_identifier);
790745
smv_parse_treet::mc_vart &var=PARSER.module->vars[identifier];
791-
792-
switch(var.var_class)
793-
{
794-
case smv_parse_treet::mc_vart::UNKNOWN:
795-
var.type.make_nil();
796-
var.var_class=smv_parse_treet::mc_vart::DEFINED;
797-
break;
798-
799-
case smv_parse_treet::mc_vart::DECLARED:
800-
yyerror("variable `"+id2string(identifier)+"' already declared");
801-
YYERROR;
802-
break;
803-
804-
case smv_parse_treet::mc_vart::DEFINED:
805-
yyerror("variable `"+id2string(identifier)+"' already defined");
806-
YYERROR;
807-
break;
808-
809-
case smv_parse_treet::mc_vart::ARGUMENT:
810-
yyerror("variable `"+id2string(identifier)+"' already declared as argument");
811-
YYERROR;
812-
break;
813-
814-
default:
815-
DATA_INVARIANT(false, "unexpected variable class");
816-
}
817-
746+
(void)var;
818747
PARSER.module->add_define(std::move(stack_expr($1)), std::move(stack_expr($3)));
819748
}
820749
;

src/smvlang/smv_typecheck.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2184,6 +2184,15 @@ void smv_typecheckt::create_var_symbols(
21842184
to_smv_identifier_expr(to_equal_expr(item.expr).lhs());
21852185
irep_idt base_name = identifier_expr.identifier();
21862186
irep_idt identifier = module + "::var::" + id2string(base_name);
2187+
2188+
auto symbol_ptr = symbol_table.lookup(identifier);
2189+
if(symbol_ptr != nullptr)
2190+
{
2191+
throw errort{}.with_location(identifier_expr.source_location())
2192+
<< "variable `" << base_name << "' already declared, at "
2193+
<< symbol_ptr->location;
2194+
}
2195+
21872196
typet type;
21882197
type.make_nil();
21892198

@@ -2264,7 +2273,7 @@ void smv_typecheckt::collect_define(const equal_exprt &expr)
22642273
if(!result.second)
22652274
{
22662275
throw errort().with_location(expr.find_source_location())
2267-
<< "symbol `" << identifier << "' defined twice";
2276+
<< "variable `" << symbol.display_name() << "' already defined";
22682277
}
22692278
}
22702279

0 commit comments

Comments
 (0)