Skip to content

Commit c12f6a4

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 c12f6a4

File tree

1 file changed

+118
-37
lines changed

1 file changed

+118
-37
lines changed

src/smvlang/smv_typecheck.cpp

Lines changed: 118 additions & 37 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,10 @@ class smv_typecheckt:public typecheckt
8886
void check_type(typet &);
8987
smv_ranget convert_type(const typet &);
9088

89+
void variable_checks(
90+
const smv_parse_treet::modulet::element_listt &,
91+
const std::list<irep_idt> &module_parameters);
92+
9193
void convert(smv_parse_treet::modulet::elementt &);
9294
void typecheck(smv_parse_treet::modulet::elementt &);
9395
void typecheck_expr_rec(exprt &, modet);
@@ -2126,7 +2128,7 @@ void smv_typecheckt::convert(smv_parse_treet::modulet::elementt &element)
21262128

21272129
/*******************************************************************\
21282130
2129-
Function: smv_typecheckt::create_var_symbols
2131+
Function: smv_typecheckt::variable_checks
21302132
21312133
Inputs:
21322134
@@ -2136,17 +2138,11 @@ Function: smv_typecheckt::create_var_symbols
21362138
21372139
\*******************************************************************/
21382140

2139-
void smv_typecheckt::create_var_symbols(
2141+
void smv_typecheckt::variable_checks(
21402142
const smv_parse_treet::modulet::element_listt &elements,
21412143
const std::list<irep_idt> &module_parameters)
21422144
{
2143-
const irep_idt mode = "SMV";
2144-
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;
2145+
std::unordered_set<irep_idt, irep_id_hash> enums, defines, vars, parameters;
21502146

21512147
for(const auto &parameter : module_parameters)
21522148
parameters.insert(parameter);
@@ -2156,7 +2152,6 @@ void smv_typecheckt::create_var_symbols(
21562152
if(element.is_var() || element.is_ivar())
21572153
{
21582154
irep_idt base_name = to_smv_identifier_expr(element.expr).identifier();
2159-
irep_idt identifier = module + "::var::" + id2string(base_name);
21602155

21612156
// already used as enum?
21622157
if(enums.find(base_name) != enums.end())
@@ -2172,6 +2167,112 @@ void smv_typecheckt::create_var_symbols(
21722167
<< "identifier " << base_name << " already used as a parameter";
21732168
}
21742169

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

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-
22302317
auto symbol_ptr = symbol_table.lookup(identifier);
22312318
if(symbol_ptr != nullptr)
22322319
{
@@ -2261,22 +2348,13 @@ void smv_typecheckt::create_var_symbols(
22612348
irep_idt base_name = to_smv_identifier_expr(element.expr).identifier();
22622349
irep_idt identifier = module + "::var::" + id2string(base_name);
22632350

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-
22712351
auto symbol_ptr = symbol_table.lookup(identifier);
22722352
if(symbol_ptr != nullptr)
22732353
{
22742354
throw errort{}.with_location(element.expr.source_location())
22752355
<< "enum " << base_name << " already declared, at "
22762356
<< symbol_ptr->location;
22772357
}
2278-
2279-
enums.insert(base_name);
22802358
}
22812359
}
22822360
}
@@ -2421,8 +2499,11 @@ void smv_typecheckt::convert(smv_parse_treet::modulet &smv_module)
24212499

24222500
define_map.clear();
24232501

2502+
// check for re-use of variables/defines/parameter identifiers
2503+
variable_checks(smv_module.elements, smv_module.parameters);
2504+
24242505
// variables/defines first, can be used before their declaration
2425-
create_var_symbols(smv_module.elements, smv_module.parameters);
2506+
create_var_symbols(smv_module.elements);
24262507

24272508
// transition relation
24282509

0 commit comments

Comments
 (0)