Skip to content

Commit 45b79da

Browse files
committed
SMV: move check for duplicate declarations to type checker
This moves the check for duplicate declarations and definitions from the SMV parser to the type checker.
1 parent 9463ef5 commit 45b79da

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
@@ -704,27 +704,7 @@ var_decl : variable_identifier ':' type_specifier ';'
704704
{
705705
const irep_idt &identifier=stack_expr($1).get(ID_identifier);
706706
smv_parse_treet::mc_vart &var=PARSER.module->vars[identifier];
707-
708-
switch(var.var_class)
709-
{
710-
case smv_parse_treet::mc_vart::UNKNOWN:
711-
var.type=stack_type($3);
712-
var.var_class=smv_parse_treet::mc_vart::DECLARED;
713-
break;
714-
715-
case smv_parse_treet::mc_vart::DEFINED:
716-
case smv_parse_treet::mc_vart::DECLARED:
717-
break;
718-
719-
case smv_parse_treet::mc_vart::ARGUMENT:
720-
yyerror("variable `"+id2string(identifier)+"' already declared as argument");
721-
YYERROR;
722-
break;
723-
724-
default:
725-
DATA_INVARIANT(false, "unexpected variable class");
726-
}
727-
707+
(void)var;
728708
PARSER.module->add_var(stack_expr($1), stack_type($3));
729709
}
730710
;
@@ -748,32 +728,7 @@ assignment : assignment_head '(' assignment_var ')' BECOMES_Token formula ';'
748728
{
749729
const irep_idt &identifier=stack_expr($1).get(ID_identifier);
750730
smv_parse_treet::mc_vart &var=PARSER.module->vars[identifier];
751-
752-
switch(var.var_class)
753-
{
754-
case smv_parse_treet::mc_vart::UNKNOWN:
755-
var.type.make_nil();
756-
var.var_class=smv_parse_treet::mc_vart::DEFINED;
757-
break;
758-
759-
case smv_parse_treet::mc_vart::DECLARED:
760-
var.var_class=smv_parse_treet::mc_vart::DEFINED;
761-
break;
762-
763-
case smv_parse_treet::mc_vart::DEFINED:
764-
yyerror("variable `"+id2string(identifier)+"' already defined");
765-
YYERROR;
766-
break;
767-
768-
case smv_parse_treet::mc_vart::ARGUMENT:
769-
yyerror("variable `"+id2string(identifier)+"' already declared as argument");
770-
YYERROR;
771-
break;
772-
773-
default:
774-
DATA_INVARIANT(false, "unexpected variable class");
775-
}
776-
731+
(void)var;
777732
PARSER.module->add_assign_current(std::move(stack_expr($1)), std::move(stack_expr($3)));
778733
}
779734
;
@@ -794,33 +749,7 @@ define : assignment_var BECOMES_Token formula ';'
794749
{
795750
const irep_idt &identifier=stack_expr($1).get(ID_identifier);
796751
smv_parse_treet::mc_vart &var=PARSER.module->vars[identifier];
797-
798-
switch(var.var_class)
799-
{
800-
case smv_parse_treet::mc_vart::UNKNOWN:
801-
var.type.make_nil();
802-
var.var_class=smv_parse_treet::mc_vart::DEFINED;
803-
break;
804-
805-
case smv_parse_treet::mc_vart::DECLARED:
806-
yyerror("variable `"+id2string(identifier)+"' already declared");
807-
YYERROR;
808-
break;
809-
810-
case smv_parse_treet::mc_vart::DEFINED:
811-
yyerror("variable `"+id2string(identifier)+"' already defined");
812-
YYERROR;
813-
break;
814-
815-
case smv_parse_treet::mc_vart::ARGUMENT:
816-
yyerror("variable `"+id2string(identifier)+"' already declared as argument");
817-
YYERROR;
818-
break;
819-
820-
default:
821-
DATA_INVARIANT(false, "unexpected variable class");
822-
}
823-
752+
(void)var;
824753
PARSER.module->add_define(std::move(stack_expr($1)), std::move(stack_expr($3)));
825754
}
826755
;

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)