Skip to content

Commit b4252db

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 39aa9bc commit b4252db

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
@@ -691,27 +691,7 @@ var_decl : variable_identifier ':' type_specifier ';'
691691
{
692692
const irep_idt &identifier=stack_expr($1).get(ID_identifier);
693693
smv_parse_treet::mc_vart &var=PARSER.module->vars[identifier];
694-
695-
switch(var.var_class)
696-
{
697-
case smv_parse_treet::mc_vart::UNKNOWN:
698-
var.type=stack_type($3);
699-
var.var_class=smv_parse_treet::mc_vart::DECLARED;
700-
break;
701-
702-
case smv_parse_treet::mc_vart::DEFINED:
703-
case smv_parse_treet::mc_vart::DECLARED:
704-
break;
705-
706-
case smv_parse_treet::mc_vart::ARGUMENT:
707-
yyerror("variable `"+id2string(identifier)+"' already declared as argument");
708-
YYERROR;
709-
break;
710-
711-
default:
712-
DATA_INVARIANT(false, "unexpected variable class");
713-
}
714-
694+
(void)var;
715695
PARSER.module->add_var(stack_expr($1), stack_type($3));
716696
}
717697
;
@@ -735,32 +715,7 @@ assignment : assignment_head '(' assignment_var ')' BECOMES_Token formula ';'
735715
{
736716
const irep_idt &identifier=stack_expr($1).get(ID_identifier);
737717
smv_parse_treet::mc_vart &var=PARSER.module->vars[identifier];
738-
739-
switch(var.var_class)
740-
{
741-
case smv_parse_treet::mc_vart::UNKNOWN:
742-
var.type.make_nil();
743-
var.var_class=smv_parse_treet::mc_vart::DEFINED;
744-
break;
745-
746-
case smv_parse_treet::mc_vart::DECLARED:
747-
var.var_class=smv_parse_treet::mc_vart::DEFINED;
748-
break;
749-
750-
case smv_parse_treet::mc_vart::DEFINED:
751-
yyerror("variable `"+id2string(identifier)+"' already defined");
752-
YYERROR;
753-
break;
754-
755-
case smv_parse_treet::mc_vart::ARGUMENT:
756-
yyerror("variable `"+id2string(identifier)+"' already declared as argument");
757-
YYERROR;
758-
break;
759-
760-
default:
761-
DATA_INVARIANT(false, "unexpected variable class");
762-
}
763-
718+
(void)var;
764719
PARSER.module->add_assign_current(std::move(stack_expr($1)), std::move(stack_expr($3)));
765720
}
766721
;
@@ -781,33 +736,7 @@ define : assignment_var BECOMES_Token formula ';'
781736
{
782737
const irep_idt &identifier=stack_expr($1).get(ID_identifier);
783738
smv_parse_treet::mc_vart &var=PARSER.module->vars[identifier];
784-
785-
switch(var.var_class)
786-
{
787-
case smv_parse_treet::mc_vart::UNKNOWN:
788-
var.type.make_nil();
789-
var.var_class=smv_parse_treet::mc_vart::DEFINED;
790-
break;
791-
792-
case smv_parse_treet::mc_vart::DECLARED:
793-
yyerror("variable `"+id2string(identifier)+"' already declared");
794-
YYERROR;
795-
break;
796-
797-
case smv_parse_treet::mc_vart::DEFINED:
798-
yyerror("variable `"+id2string(identifier)+"' already defined");
799-
YYERROR;
800-
break;
801-
802-
case smv_parse_treet::mc_vart::ARGUMENT:
803-
yyerror("variable `"+id2string(identifier)+"' already declared as argument");
804-
YYERROR;
805-
break;
806-
807-
default:
808-
DATA_INVARIANT(false, "unexpected variable class");
809-
}
810-
739+
(void)var;
811740
PARSER.module->add_define(std::move(stack_expr($1)), std::move(stack_expr($3)));
812741
}
813742
;

src/smvlang/smv_typecheck.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2120,6 +2120,15 @@ void smv_typecheckt::create_var_symbols(
21202120
to_smv_identifier_expr(to_equal_expr(item.expr).lhs());
21212121
irep_idt base_name = identifier_expr.identifier();
21222122
irep_idt identifier = module + "::var::" + id2string(base_name);
2123+
2124+
auto symbol_ptr = symbol_table.lookup(identifier);
2125+
if(symbol_ptr != nullptr)
2126+
{
2127+
throw errort{}.with_location(identifier_expr.source_location())
2128+
<< "variable `" << base_name << "' already declared, at "
2129+
<< symbol_ptr->location;
2130+
}
2131+
21232132
typet type;
21242133
type.make_nil();
21252134

@@ -2200,7 +2209,7 @@ void smv_typecheckt::collect_define(const equal_exprt &expr)
22002209
if(!result.second)
22012210
{
22022211
throw errort().with_location(expr.find_source_location())
2203-
<< "symbol `" << identifier << "' defined twice";
2212+
<< "variable `" << symbol.display_name() << "' already defined";
22042213
}
22052214
}
22062215

0 commit comments

Comments
 (0)