Skip to content

Commit 8f417e6

Browse files
authored
Merge pull request #1404 from diffblue/already_declared5-fix
SMV: catch variables that have the same identifier as an enum
2 parents 66c892b + 61ce763 commit 8f417e6

File tree

4 files changed

+35
-2
lines changed

4 files changed

+35
-2
lines changed

regression/smv/define/define8.desc

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

regression/smv/define/define8.smv

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
MODULE main
2+
3+
VAR some_enum : {x, y, z};
4+
5+
-- x is already defined as an enum
6+
DEFINE x := 123;
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
KNOWNBUG
1+
CORE
22
already_declared5.smv
33

4+
^file .* line 6: identifier x already used as enum$
45
^EXIT=2$
56
^SIGNAL=0$
67
--
78
--
8-
This crashes.

src/smvlang/smv_typecheck.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2137,13 +2137,23 @@ void smv_typecheckt::create_var_symbols(
21372137
{
21382138
const irep_idt mode = "SMV";
21392139

2140+
// to catch variables that have the same name as enums
2141+
std::unordered_set<irep_idt, irep_id_hash> enums;
2142+
21402143
for(const auto &item : items)
21412144
{
21422145
if(item.is_var() || item.is_ivar())
21432146
{
21442147
irep_idt base_name = to_smv_identifier_expr(item.expr).identifier();
21452148
irep_idt identifier = module + "::var::" + id2string(base_name);
21462149

2150+
// already used as enum?
2151+
if(enums.find(base_name) != enums.end())
2152+
{
2153+
throw errort{}.with_location(item.expr.source_location())
2154+
<< "identifier " << base_name << " already used as enum";
2155+
}
2156+
21472157
auto symbol_ptr = symbol_table.lookup(identifier);
21482158
if(symbol_ptr != nullptr)
21492159
{
@@ -2185,6 +2195,13 @@ void smv_typecheckt::create_var_symbols(
21852195
irep_idt base_name = identifier_expr.identifier();
21862196
irep_idt identifier = module + "::var::" + id2string(base_name);
21872197

2198+
// already used as enum?
2199+
if(enums.find(base_name) != enums.end())
2200+
{
2201+
throw errort{}.with_location(identifier_expr.source_location())
2202+
<< "identifier " << base_name << " already used as enum";
2203+
}
2204+
21882205
auto symbol_ptr = symbol_table.lookup(identifier);
21892206
if(symbol_ptr != nullptr)
21902207
{
@@ -2226,6 +2243,8 @@ void smv_typecheckt::create_var_symbols(
22262243
<< "enum " << base_name << " already declared, at "
22272244
<< symbol_ptr->location;
22282245
}
2246+
2247+
enums.insert(base_name);
22292248
}
22302249
}
22312250
}

0 commit comments

Comments
 (0)