@@ -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 ¶meter : module_parameters)
2143+ for (const auto ¶meter : 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