Skip to content

Commit f275cf3

Browse files
authored
Merge pull request #1405 from diffblue/already_declared4-fix
SMV: catch variables that have the same identifier as a parameter
2 parents 91f0773 + daf9e97 commit f275cf3

File tree

4 files changed

+52
-5
lines changed

4 files changed

+52
-5
lines changed

regression/smv/define/define9.desc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
define9.smv
3+
4+
^file .* line 4: identifier x already used as a parameter$
5+
^EXIT=2$
6+
^SIGNAL=0$
7+
--
8+
--

regression/smv/define/define9.smv

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
MODULE some-module(x)
2+
3+
-- x is already declared as a parameter
4+
DEFINE x := 123;
5+
6+
INIT x = 123
7+
8+
MODULE main
9+
10+
VAR instance : some-module(124);
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
KNOWNBUG
1+
CORE
22
already_declared4.smv
33

44
^EXIT=2$
55
^SIGNAL=0$
66
--
77
--
8-
This should be errored.

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, irep_id_hash> 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(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

Comments
 (0)