Skip to content

Commit d87f247

Browse files
author
Daniel Kroening
committed
introduce side_effect_expr_assignt
The assignment side effect is one of the most frequently used side effects.
1 parent 0cb2bd8 commit d87f247

File tree

2 files changed

+84
-7
lines changed

2 files changed

+84
-7
lines changed

Diff for: src/cpp/cpp_constructor.cpp

+4-7
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,8 @@ optionalt<codet> cpp_typecheckt::cpp_constructor(
141141
// Override constantness
142142
object_tc.type().set(ID_C_constant, false);
143143
object_tc.set(ID_C_lvalue, true);
144-
side_effect_exprt assign(
145-
ID_assign, {object_tc, operands_tc.front()}, typet(), source_location);
144+
side_effect_expr_assignt assign(
145+
object_tc, operands_tc.front(), typet(), source_location);
146146
typecheck_side_effect_assignment(assign);
147147
code_expressiont new_code;
148148
new_code.expression()=assign;
@@ -189,11 +189,8 @@ optionalt<codet> cpp_typecheckt::cpp_constructor(
189189
if(!component.get_bool(ID_from_base))
190190
val=true_exprt();
191191

192-
side_effect_exprt assign(
193-
ID_assign,
194-
{std::move(member), std::move(val)},
195-
typet(),
196-
source_location);
192+
side_effect_expr_assignt assign(
193+
std::move(member), std::move(val), typet(), source_location);
197194

198195
typecheck_side_effect_assignment(assign);
199196

Diff for: src/util/std_code.h

+80
Original file line numberDiff line numberDiff line change
@@ -1700,6 +1700,86 @@ inline const side_effect_expr_nondett &to_side_effect_expr_nondet(
17001700
return static_cast<const side_effect_expr_nondett &>(side_effect_expr_nondet);
17011701
}
17021702

1703+
/// A \ref side_effect_exprt that performs an assignment
1704+
class side_effect_expr_assignt : public side_effect_exprt
1705+
{
1706+
public:
1707+
/// construct an assignment side-effect, given lhs and rhs
1708+
/// The type is copied from lhs
1709+
side_effect_expr_assignt(
1710+
const exprt &_lhs,
1711+
const exprt &_rhs,
1712+
const source_locationt &loc)
1713+
: side_effect_exprt(ID_assign, {_lhs, _rhs}, _lhs.type(), loc)
1714+
{
1715+
}
1716+
1717+
/// construct an assignment side-effect, given lhs, rhs and the type
1718+
side_effect_expr_assignt(
1719+
const exprt &_lhs,
1720+
const exprt &_rhs,
1721+
const typet &_type,
1722+
const source_locationt &loc)
1723+
: side_effect_exprt(ID_assign, {_lhs, _rhs}, _type, loc)
1724+
{
1725+
}
1726+
1727+
/// construct an assignment side-effect, given lhs, rhs and the type
1728+
side_effect_expr_assignt(
1729+
exprt &&_lhs,
1730+
exprt &&_rhs,
1731+
typet &&_type,
1732+
const source_locationt &loc)
1733+
: side_effect_exprt(
1734+
ID_assign,
1735+
{std::move(_lhs), std::move(_rhs)},
1736+
std::move(_type),
1737+
loc)
1738+
{
1739+
}
1740+
1741+
exprt &lhs()
1742+
{
1743+
return op0();
1744+
}
1745+
1746+
const exprt &lhs() const
1747+
{
1748+
return op0();
1749+
}
1750+
1751+
exprt &rhs()
1752+
{
1753+
return op1();
1754+
}
1755+
1756+
const exprt &rhs() const
1757+
{
1758+
return op1();
1759+
}
1760+
};
1761+
1762+
template <>
1763+
inline bool can_cast_expr<side_effect_expr_assignt>(const exprt &base)
1764+
{
1765+
return detail::can_cast_side_effect_expr_impl(base, ID_assign);
1766+
}
1767+
1768+
inline side_effect_expr_assignt &to_side_effect_expr_assign(exprt &expr)
1769+
{
1770+
auto &side_effect_expr_assign = to_side_effect_expr(expr);
1771+
PRECONDITION(side_effect_expr_assign.get_statement() == ID_assign);
1772+
return static_cast<side_effect_expr_assignt &>(side_effect_expr_assign);
1773+
}
1774+
1775+
inline const side_effect_expr_assignt &
1776+
to_side_effect_expr_assign(const exprt &expr)
1777+
{
1778+
const auto &side_effect_expr_assign = to_side_effect_expr(expr);
1779+
PRECONDITION(side_effect_expr_assign.get_statement() == ID_assign);
1780+
return static_cast<const side_effect_expr_assignt &>(side_effect_expr_assign);
1781+
}
1782+
17031783
/// A \ref side_effect_exprt representation of a function call side effect.
17041784
class side_effect_expr_function_callt:public side_effect_exprt
17051785
{

0 commit comments

Comments
 (0)