@@ -60,7 +60,9 @@ class smv_typecheckt:public typecheckt
6060 } modet;
6161
6262 void convert (smv_parse_treet::modulet &);
63- void create_var_symbols (const smv_parse_treet::modulet::item_listt &);
63+ void create_var_symbols (
64+ const smv_parse_treet::modulet::item_listt &,
65+ const std::list<irep_idt> &module_parameters);
6466
6567 void collect_define (const equal_exprt &);
6668 void convert_defines (exprt::operandst &invar);
@@ -2133,13 +2135,20 @@ Function: smv_typecheckt::create_var_symbols
21332135\*******************************************************************/
21342136
21352137void smv_typecheckt::create_var_symbols (
2136- const smv_parse_treet::modulet::item_listt &items)
2138+ const smv_parse_treet::modulet::item_listt &items,
2139+ const std::list<irep_idt> &module_parameters)
21372140{
21382141 const irep_idt mode = " SMV" ;
21392142
21402143 // to catch variables that have the same name as enums
21412144 std::unordered_set<irep_idt, irep_id_hash> enums;
21422145
2146+ // to catch re-use of parameter identifiers
2147+ std::unordered_set<irep_idt, irep_id_hash> parameters;
2148+
2149+ for (const auto ¶meter : module_parameters)
2150+ parameters.insert (parameter);
2151+
21432152 for (const auto &item : items)
21442153 {
21452154 if (item.is_var () || item.is_ivar ())
@@ -2154,6 +2163,13 @@ void smv_typecheckt::create_var_symbols(
21542163 << " identifier " << base_name << " already used as enum" ;
21552164 }
21562165
2166+ // already used as a parameter?
2167+ if (parameters.find (base_name) != parameters.end ())
2168+ {
2169+ throw errort{}.with_location (item.expr .source_location ())
2170+ << " identifier " << base_name << " already used as a parameter" ;
2171+ }
2172+
21572173 auto symbol_ptr = symbol_table.lookup (identifier);
21582174 if (symbol_ptr != nullptr )
21592175 {
@@ -2202,6 +2218,13 @@ void smv_typecheckt::create_var_symbols(
22022218 << " identifier " << base_name << " already used as enum" ;
22032219 }
22042220
2221+ // already used as a parameter?
2222+ if (parameters.find (base_name) != parameters.end ())
2223+ {
2224+ throw errort{}.with_location (identifier_expr.source_location ())
2225+ << " identifier " << base_name << " already used as a parameter" ;
2226+ }
2227+
22052228 auto symbol_ptr = symbol_table.lookup (identifier);
22062229 if (symbol_ptr != nullptr )
22072230 {
@@ -2236,6 +2259,13 @@ void smv_typecheckt::create_var_symbols(
22362259 irep_idt base_name = to_smv_identifier_expr (item.expr ).identifier ();
22372260 irep_idt identifier = module + " ::var::" + id2string (base_name);
22382261
2262+ // already used as a parameter?
2263+ if (parameters.find (base_name) != parameters.end ())
2264+ {
2265+ throw errort{}.with_location (item.expr .source_location ())
2266+ << " identifier " << base_name << " already used as a parameter" ;
2267+ }
2268+
22392269 auto symbol_ptr = symbol_table.lookup (identifier);
22402270 if (symbol_ptr != nullptr )
22412271 {
@@ -2390,7 +2420,7 @@ void smv_typecheckt::convert(smv_parse_treet::modulet &smv_module)
23902420 define_map.clear ();
23912421
23922422 // variables/defines first, can be used before their declaration
2393- create_var_symbols (smv_module.items );
2423+ create_var_symbols (smv_module.items , smv_module. parameters );
23942424
23952425 // transition relation
23962426
0 commit comments