Skip to content

Commit a958ca9

Browse files
committed
SMV: typechecking for unary minus
1 parent f457b5e commit a958ca9

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

regression/ebmc/range_type/range_type8.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ range_type8.smv
66
^SIGNAL=0$
77
--
88
--
9-
We do not have type checking for unary minus.
9+
We do not have solver support for unary minus on ranges.

src/smvlang/smv_typecheck.cpp

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,12 @@ class smv_typecheckt:public typecheckt
8282
smv_ranget():from(0), to(0)
8383
{
8484
}
85-
85+
86+
smv_ranget(mp_integer _from, mp_integer _to)
87+
: from(std::move(_from)), to(std::move(_to))
88+
{
89+
}
90+
8691
mp_integer from, to;
8792

8893
bool is_contained_in(const smv_ranget &other) const
@@ -141,6 +146,12 @@ class smv_typecheckt:public typecheckt
141146

142147
return *this;
143148
}
149+
150+
// unary minus
151+
smv_ranget operator-() const
152+
{
153+
return smv_ranget{-to, -from};
154+
}
144155
};
145156

146157
smv_ranget convert_type(const typet &type);
@@ -822,6 +833,29 @@ void smv_typecheckt::typecheck(
822833
throw 0;
823834
}
824835
}
836+
else if(expr.id() == ID_unary_minus)
837+
{
838+
typecheck_op(expr, type, mode);
839+
840+
if(expr.operands().size() != 1)
841+
{
842+
error().source_location = expr.find_source_location();
843+
error() << "Expected one operand for " << expr.id() << eom;
844+
throw 0;
845+
}
846+
847+
if(type.is_nil())
848+
{
849+
if(expr.type().id() == ID_range || expr.type().id() == ID_bool)
850+
{
851+
// find proper type for precise arithmetic
852+
smv_ranget smv_range_op =
853+
convert_type(to_unary_minus_expr(expr).op().type());
854+
smv_ranget new_range = -smv_range_op;
855+
new_range.to_type(expr.type());
856+
}
857+
}
858+
}
825859
else if(expr.id()==ID_constant)
826860
{
827861
if(expr.type().id()==ID_integer)

0 commit comments

Comments
 (0)