Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions regression/smv/enums/name_collision1.desc
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
KNOWNBUG
name_collision1.smv

^EXIT=0$
^SIGNAL=0$
--
^warning: ignoring
--
This crashes.
6 changes: 6 additions & 0 deletions regression/smv/enums/name_collision1.smv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
MODULE main

VAR some_var: { red, green, yellow, off };

-- identifier already used
VAR red : boolean;
9 changes: 9 additions & 0 deletions regression/smv/enums/name_collision2.desc
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
CORE
name_collision2.smv

^file .* line 8: enum red already declared, at file .* line 3$
^EXIT=2$
^SIGNAL=0$
--
^warning: ignoring
--
8 changes: 8 additions & 0 deletions regression/smv/enums/name_collision2.smv
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
MODULE main

VAR red : boolean;

-- The identifier "red" is already used.
-- NuSMV doesn't error this, but yields an error when attempting
-- to use the identifier.
VAR some_var: { red, green, yellow, off };
9 changes: 9 additions & 0 deletions regression/smv/enums/name_collision3.desc
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
KNOWNBUG
name_collision3.smv

^EXIT=0$
^SIGNAL=0$
--
^warning: ignoring
--
This crashes.
9 changes: 9 additions & 0 deletions regression/smv/enums/name_collision3.smv
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
MODULE submodule

MODULE main

VAR some_var: { red, green, yellow, off };

-- identifier already used
VAR red : submodule;

5 changes: 5 additions & 0 deletions src/smvlang/parser.y
Original file line number Diff line number Diff line change
Expand Up @@ -676,6 +676,11 @@ enum_element: IDENTIFIER_Token
{
$$=$1;
PARSER.module->enum_set.insert(stack_expr($1).id_string());

exprt expr(ID_symbol);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this not using symbol_exprt?

expr.set(ID_identifier, stack_expr($1).id());
PARSER.set_source_location(expr);
PARSER.module->add_enum(std::move(expr));
}
;

Expand Down
2 changes: 2 additions & 0 deletions src/smvlang/smv_parse_tree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ std::string to_string(smv_parse_treet::modulet::itemt::item_typet i)
case smv_parse_treet::modulet::itemt::FAIRNESS: return "FAIRNESS";
case smv_parse_treet::modulet::itemt::DEFINE:
return "DEFINE";
case smv_parse_treet::modulet::itemt::ENUM:
return "ENUM";
case smv_parse_treet::modulet::itemt::VAR:
return "VAR";

Expand Down
12 changes: 12 additions & 0 deletions src/smvlang/smv_parse_tree.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ class smv_parse_treet
ASSIGN_NEXT,
CTLSPEC,
DEFINE,
ENUM,
FAIRNESS,
INIT,
INVAR,
Expand Down Expand Up @@ -127,6 +128,11 @@ class smv_parse_treet
return item_type==INIT;
}

bool is_enum() const
{
return item_type == ENUM;
}

bool is_var() const
{
return item_type == VAR;
Expand Down Expand Up @@ -261,6 +267,12 @@ class smv_parse_treet
items.emplace_back(itemt::VAR, std::move(expr), std::move(location));
}

void add_enum(exprt expr)
{
auto location = expr.source_location();
items.emplace_back(itemt::ENUM, std::move(expr), std::move(location));
}

mc_varst vars;
enum_sett enum_set;

Expand Down
14 changes: 14 additions & 0 deletions src/smvlang/smv_typecheck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1877,6 +1877,7 @@ void smv_typecheckt::typecheck(
item.equal_expr().type() = bool_typet{};
return;

case smv_parse_treet::modulet::itemt::ENUM:
case smv_parse_treet::modulet::itemt::VAR:
return;
}
Expand Down Expand Up @@ -1984,6 +1985,19 @@ void smv_typecheckt::create_var_symbols(

symbol_table.insert(std::move(symbol));
}
else if(item.is_enum())
{
irep_idt base_name = to_symbol_expr(item.expr).get_identifier();
irep_idt identifier = module + "::var::" + id2string(base_name);

auto symbol_ptr = symbol_table.lookup(identifier);
if(symbol_ptr != nullptr)
{
throw errort{}.with_location(item.expr.source_location())
<< "enum " << base_name << " already declared, at "
<< symbol_ptr->location;
}
}
}
}

Expand Down
Loading