Skip to content

Commit 946e2f2

Browse files
committed
SMV: extract code for duplicate identifiers
This extracts the code that checks for re-use of parameter/define/enum identifiers into a separate method.
1 parent da3c187 commit 946e2f2

File tree

1 file changed

+118
-41
lines changed

1 file changed

+118
-41
lines changed

src/smvlang/smv_typecheck.cpp

Lines changed: 118 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,7 @@ class smv_typecheckt:public typecheckt
6060
} modet;
6161

6262
void convert(smv_parse_treet::modulet &);
63-
void create_var_symbols(
64-
const smv_parse_treet::modulet::element_listt &,
65-
const std::list<irep_idt> &module_parameters);
63+
void create_var_symbols(const smv_parse_treet::modulet::element_listt &);
6664

6765
void collect_define(const equal_exprt &);
6866
void convert_defines(exprt::operandst &invar);
@@ -88,6 +86,8 @@ class smv_typecheckt:public typecheckt
8886
void check_type(typet &);
8987
smv_ranget convert_type(const typet &);
9088

89+
void variable_checks(const smv_parse_treet::modulet &);
90+
9191
void convert(smv_parse_treet::modulet::elementt &);
9292
void typecheck(smv_parse_treet::modulet::elementt &);
9393
void typecheck_expr_rec(exprt &, modet);
@@ -2126,7 +2126,7 @@ void smv_typecheckt::convert(smv_parse_treet::modulet::elementt &element)
21262126

21272127
/*******************************************************************\
21282128
2129-
Function: smv_typecheckt::create_var_symbols
2129+
Function: smv_typecheckt::variable_checks
21302130
21312131
Inputs:
21322132
@@ -2136,27 +2136,18 @@ Function: smv_typecheckt::create_var_symbols
21362136
21372137
\*******************************************************************/
21382138

2139-
void smv_typecheckt::create_var_symbols(
2140-
const smv_parse_treet::modulet::element_listt &elements,
2141-
const std::list<irep_idt> &module_parameters)
2139+
void smv_typecheckt::variable_checks(const smv_parse_treet::modulet &module)
21422140
{
2143-
const irep_idt mode = "SMV";
2141+
std::unordered_set<irep_idt, irep_id_hash> enums, defines, vars, parameters;
21442142

2145-
// to catch variables that have the same name as enums
2146-
std::unordered_set<irep_idt, irep_id_hash> enums;
2147-
2148-
// to catch re-use of parameter identifiers
2149-
std::unordered_set<irep_idt, irep_id_hash> parameters;
2150-
2151-
for(const auto &parameter : module_parameters)
2143+
for(const auto &parameter : module.parameters)
21522144
parameters.insert(parameter);
21532145

2154-
for(const auto &element : elements)
2146+
for(const auto &element : module.elements)
21552147
{
21562148
if(element.is_var() || element.is_ivar())
21572149
{
21582150
irep_idt base_name = to_smv_identifier_expr(element.expr).identifier();
2159-
irep_idt identifier = module + "::var::" + id2string(base_name);
21602151

21612152
// already used as enum?
21622153
if(enums.find(base_name) != enums.end())
@@ -2172,6 +2163,112 @@ void smv_typecheckt::create_var_symbols(
21722163
<< "identifier " << base_name << " already used as a parameter";
21732164
}
21742165

2166+
// already used as variable?
2167+
if(vars.find(base_name) != vars.end())
2168+
{
2169+
throw errort{}.with_location(element.expr.source_location())
2170+
<< "identifier " << base_name << " already used as variable";
2171+
}
2172+
2173+
// already used as define?
2174+
if(defines.find(base_name) != defines.end())
2175+
{
2176+
throw errort{}.with_location(element.expr.source_location())
2177+
<< "identifier " << base_name << " already used as define";
2178+
}
2179+
2180+
vars.insert(base_name);
2181+
}
2182+
else if(element.is_define())
2183+
{
2184+
const auto &identifier_expr =
2185+
to_smv_identifier_expr(to_equal_expr(element.expr).lhs());
2186+
irep_idt base_name = identifier_expr.identifier();
2187+
2188+
// already used as enum?
2189+
if(enums.find(base_name) != enums.end())
2190+
{
2191+
throw errort{}.with_location(identifier_expr.source_location())
2192+
<< "identifier " << base_name << " already used as enum";
2193+
}
2194+
2195+
// already used as a parameter?
2196+
if(parameters.find(base_name) != parameters.end())
2197+
{
2198+
throw errort{}.with_location(identifier_expr.source_location())
2199+
<< "identifier " << base_name << " already used as a parameter";
2200+
}
2201+
2202+
// already used as variable?
2203+
if(vars.find(base_name) != vars.end())
2204+
{
2205+
throw errort{}.with_location(element.expr.source_location())
2206+
<< "identifier " << base_name << " already used as variable";
2207+
}
2208+
2209+
// already used as define?
2210+
if(defines.find(base_name) != defines.end())
2211+
{
2212+
throw errort{}.with_location(element.expr.source_location())
2213+
<< "identifier " << base_name << " already used as define";
2214+
}
2215+
2216+
defines.insert(base_name);
2217+
}
2218+
else if(element.is_enum())
2219+
{
2220+
irep_idt base_name = to_smv_identifier_expr(element.expr).identifier();
2221+
2222+
// already used as a parameter?
2223+
if(parameters.find(base_name) != parameters.end())
2224+
{
2225+
throw errort{}.with_location(element.expr.source_location())
2226+
<< "identifier " << base_name << " already used as a parameter";
2227+
}
2228+
2229+
// already used as variable?
2230+
if(vars.find(base_name) != vars.end())
2231+
{
2232+
throw errort{}.with_location(element.expr.source_location())
2233+
<< "identifier " << base_name << " already used as variable";
2234+
}
2235+
2236+
// already used as define?
2237+
if(defines.find(base_name) != defines.end())
2238+
{
2239+
throw errort{}.with_location(element.expr.source_location())
2240+
<< "identifier " << base_name << " already used as define";
2241+
}
2242+
2243+
enums.insert(base_name);
2244+
}
2245+
}
2246+
}
2247+
2248+
/*******************************************************************\
2249+
2250+
Function: smv_typecheckt::create_var_symbols
2251+
2252+
Inputs:
2253+
2254+
Outputs:
2255+
2256+
Purpose:
2257+
2258+
\*******************************************************************/
2259+
2260+
void smv_typecheckt::create_var_symbols(
2261+
const smv_parse_treet::modulet::element_listt &elements)
2262+
{
2263+
const irep_idt mode = "SMV";
2264+
2265+
for(const auto &element : elements)
2266+
{
2267+
if(element.is_var() || element.is_ivar())
2268+
{
2269+
irep_idt base_name = to_smv_identifier_expr(element.expr).identifier();
2270+
irep_idt identifier = module + "::var::" + id2string(base_name);
2271+
21752272
auto symbol_ptr = symbol_table.lookup(identifier);
21762273
if(symbol_ptr != nullptr)
21772274
{
@@ -2213,20 +2310,6 @@ void smv_typecheckt::create_var_symbols(
22132310
irep_idt base_name = identifier_expr.identifier();
22142311
irep_idt identifier = module + "::var::" + id2string(base_name);
22152312

2216-
// already used as enum?
2217-
if(enums.find(base_name) != enums.end())
2218-
{
2219-
throw errort{}.with_location(identifier_expr.source_location())
2220-
<< "identifier " << base_name << " already used as enum";
2221-
}
2222-
2223-
// already used as a parameter?
2224-
if(parameters.find(base_name) != parameters.end())
2225-
{
2226-
throw errort{}.with_location(identifier_expr.source_location())
2227-
<< "identifier " << base_name << " already used as a parameter";
2228-
}
2229-
22302313
auto symbol_ptr = symbol_table.lookup(identifier);
22312314
if(symbol_ptr != nullptr)
22322315
{
@@ -2261,22 +2344,13 @@ void smv_typecheckt::create_var_symbols(
22612344
irep_idt base_name = to_smv_identifier_expr(element.expr).identifier();
22622345
irep_idt identifier = module + "::var::" + id2string(base_name);
22632346

2264-
// already used as a parameter?
2265-
if(parameters.find(base_name) != parameters.end())
2266-
{
2267-
throw errort{}.with_location(element.expr.source_location())
2268-
<< "identifier " << base_name << " already used as a parameter";
2269-
}
2270-
22712347
auto symbol_ptr = symbol_table.lookup(identifier);
22722348
if(symbol_ptr != nullptr)
22732349
{
22742350
throw errort{}.with_location(element.expr.source_location())
22752351
<< "enum " << base_name << " already declared, at "
22762352
<< symbol_ptr->location;
22772353
}
2278-
2279-
enums.insert(base_name);
22802354
}
22812355
}
22822356
}
@@ -2421,8 +2495,11 @@ void smv_typecheckt::convert(smv_parse_treet::modulet &smv_module)
24212495

24222496
define_map.clear();
24232497

2498+
// check for re-use of variables/defines/parameter identifiers
2499+
variable_checks(smv_module);
2500+
24242501
// variables/defines first, can be used before their declaration
2425-
create_var_symbols(smv_module.elements, smv_module.parameters);
2502+
create_var_symbols(smv_module.elements);
24262503

24272504
// transition relation
24282505

0 commit comments

Comments
 (0)