@@ -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 ¶meter : 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