diff --git a/src/smvlang/parser.y b/src/smvlang/parser.y index 47b06e0cd..386ed63cf 100644 --- a/src/smvlang/parser.y +++ b/src/smvlang/parser.y @@ -662,7 +662,7 @@ enum_list : enum_element enum_element: IDENTIFIER_Token { $$=$1; - PARSER.module->enum_set.insert(stack_expr($1).id_string()); + PARSER.parse_tree.enum_set.insert(stack_expr($1).id_string()); PARSER.module->add_enum( smv_identifier_exprt{stack_expr($1).id(), PARSER.source_location()}); } @@ -905,6 +905,7 @@ identifier : IDENTIFIER_Token variable_identifier: complex_identifier { + // Could be a variable, or an enum auto id = merge_complex_identifier(stack_expr($1)); init($$, ID_smv_identifier); stack_expr($$).set(ID_identifier, id); diff --git a/src/smvlang/smv_parse_tree.cpp b/src/smvlang/smv_parse_tree.cpp index 3dea7dcd9..6a2f19c86 100644 --- a/src/smvlang/smv_parse_tree.cpp +++ b/src/smvlang/smv_parse_tree.cpp @@ -23,6 +23,7 @@ Function: smv_parse_treet::swap void smv_parse_treet::swap(smv_parse_treet &smv_parse_tree) { smv_parse_tree.modules.swap(modules); + smv_parse_tree.enum_set.swap(enum_set); } /*******************************************************************\ diff --git a/src/smvlang/smv_parse_tree.h b/src/smvlang/smv_parse_tree.h index 30d7734f1..ecc2f8f18 100644 --- a/src/smvlang/smv_parse_tree.h +++ b/src/smvlang/smv_parse_tree.h @@ -271,10 +271,11 @@ class smv_parse_treet auto location = expr.source_location(); items.emplace_back(itemt::ENUM, std::move(expr), std::move(location)); } - - enum_sett enum_set; }; - + + // enums are global + enum_sett enum_set; + typedef std::unordered_map modulest; modulest modules; diff --git a/src/smvlang/smv_typecheck.cpp b/src/smvlang/smv_typecheck.cpp index 91a68783c..e93805591 100644 --- a/src/smvlang/smv_typecheck.cpp +++ b/src/smvlang/smv_typecheck.cpp @@ -1895,7 +1895,8 @@ void smv_typecheckt::convert(exprt &expr) identifier.find("::") == std::string::npos, "conversion is done once"); // enum or variable? - if(modulep->enum_set.find(identifier) == modulep->enum_set.end()) + if( + smv_parse_tree.enum_set.find(identifier) == smv_parse_tree.enum_set.end()) { std::string id = module + "::var::" + identifier;