Skip to content

Commit 8631e09

Browse files
committed
SMV: catch variables that have the same identifier as a parameter
This errors variable and enum declarations that use the same identifier as a previously defined module parameter.
1 parent 8f417e6 commit 8631e09

File tree

1 file changed

+33
-3
lines changed

1 file changed

+33
-3
lines changed

src/smvlang/smv_typecheck.cpp

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

21352137
void 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> parameters;
2148+
2149+
for(const auto &parameter : 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(item.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

Comments
 (0)