Go to the documentation of this file.
20 #include <unordered_set>
24 if(expr.
id() == ID_index)
26 else if(expr.
id() == ID_member)
28 else if(expr.
id() == ID_dereference)
30 else if(expr.
id() == ID_symbol)
40 if(operands.size()<=2)
46 exprt previous=operands.front();
49 for(exprt::operandst::const_iterator
50 it=++operands.begin();
75 for(
const auto &expr : designator)
79 if(expr.id() == ID_index_designator)
83 else if(expr.id() == ID_member_designator)
107 const typet &src_type = src.
type().
id() == ID_c_enum_tag
111 if(src_type.
id()==ID_bool)
115 src_type.
id()==ID_floatbv?ID_ieee_float_notequal:ID_notequal;
124 return std::move(comparison);
129 if(src.
id() == ID_not)
141 const std::function<
bool(
const exprt &)> &pred)
150 src, [&](
const exprt &subexpr) {
return subexpr.
id() ==
id; });
155 const std::function<
bool(
const typet &)> &pred,
158 std::vector<std::reference_wrapper<const typet>> stack;
159 std::unordered_set<typet, irep_hash> visited;
161 const auto push_if_not_visited = [&](
const typet &t) {
162 if(visited.insert(t).second)
163 stack.emplace_back(t);
166 push_if_not_visited(type);
167 while(!stack.empty())
169 const typet &top = stack.back().get();
174 else if(top.
id() == ID_c_enum_tag)
176 else if(top.
id() == ID_struct_tag)
178 else if(top.
id() == ID_union_tag)
180 else if(top.
id() == ID_struct || top.
id() == ID_union)
183 push_if_not_visited(comp.type());
188 push_if_not_visited(subtype);
198 type, [&](
const typet &subtype) {
return subtype.
id() ==
id; }, ns);
219 if(expr.
id()!=ID_typecast)
232 if(expr.
id() == ID_address_of)
237 expr.
id() == ID_typecast || expr.
id() == ID_array_of ||
238 expr.
id() == ID_plus || expr.
id() == ID_mult || expr.
id() == ID_array ||
239 expr.
id() == ID_with || expr.
id() == ID_struct || expr.
id() == ID_union ||
240 expr.
id() == ID_empty_union ||
242 expr.
id() == ID_byte_update_big_endian ||
243 expr.
id() == ID_byte_update_little_endian)
247 return is_constant(e);
257 if(expr.
id() == ID_symbol)
261 else if(expr.
id() == ID_index)
268 else if(expr.
id() == ID_member)
272 else if(expr.
id() == ID_dereference)
278 else if(expr.
id() == ID_string_constant)
297 if(b.
get(ID_value) == ID_false)
303 if(a.
get(ID_value) == ID_false)
312 return and_exprt{std::move(a), std::move(b)};
317 if(expr.
type().
id() != ID_pointer)
330 "front-end should use ID_NULL");
Operator to update elements in structs and arrays.
const union_tag_typet & to_union_tag_type(const typet &type)
Cast a typet to a union_tag_typet.
#define UNREACHABLE
This should be used to mark dead code.
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
exprt make_and(exprt a, exprt b)
Conjunction of two expressions.
bool is_assignable(const exprt &expr)
Returns true iff the argument is one of the following:
const exprt & skip_typecast(const exprt &expr)
find the expression nested inside typecasts, if any
bool has_subexpr(const exprt &expr, const std::function< bool(const exprt &)> &pred)
returns true if the expression has a subexpression that satisfies pred
depth_iteratort depth_end()
const struct_union_typet & to_struct_union_type(const typet &type)
Cast a typet to a struct_union_typet.
const dereference_exprt & to_dereference_expr(const exprt &expr)
Cast an exprt to a dereference_exprt.
The type of an expression, extends irept.
const index_exprt & to_index_expr(const exprt &expr)
Cast an exprt to an index_exprt.
const if_exprt & to_if_expr(const exprt &expr)
Cast an exprt to an if_exprt.
Operator to dereference a pointer.
The trinary if-then-else operator.
virtual bool is_constant_address_of(const exprt &) const
this function determines which reference-typed expressions are constant
const type_with_subtypest & to_type_with_subtypes(const typet &type)
Base class for all expressions.
const union_typet & follow_tag(const union_tag_typet &) const
Follow type tag of union type.
if_exprt lift_if(const exprt &src, std::size_t operand_number)
lift up an if_exprt one level
bool is_true() const
Return whether the expression is a constant representing true.
struct configt::ansi_ct ansi_c
exprt make_binary(const exprt &expr)
splits an expression with >=3 operands into nested binary expressions
bool is_false() const
Return whether the expression is a constant representing false.
const irep_idt & get(const irep_idt &name) const
const binary_exprt & to_binary_expr(const exprt &expr)
Cast an exprt to a binary_exprt.
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
virtual bool is_constant(const exprt &) const
This function determines what expressions are to be propagated as "constants".
typet & type()
Return the type of the expression.
const c_enum_tag_typet & to_c_enum_tag_type(const typet &type)
Cast a typet to a c_enum_tag_typet.
#define PRECONDITION(CONDITION)
bool has_subtype(const typet &type, const std::function< bool(const typet &)> &pred, const namespacet &ns)
returns true if any of the contained types satisfies pred
exprt boolean_negate(const exprt &src)
negate a Boolean expression, possibly removing a not_exprt, and swapping false and true
const exprt & index() const
const irep_idt & id() const
const struct_tag_typet & to_struct_tag_type(const typet &type)
Cast a typet to a struct_tag_typet.
std::vector< exprt > operandst
The Boolean constant false.
const with_exprt & to_with_expr(const exprt &expr)
Cast an exprt to a with_exprt.
Operator to update elements in structs and arrays.
exprt::operandst & designator()
Deprecated expression utility functions.
const not_exprt & to_not_expr(const exprt &expr)
Cast an exprt to an not_exprt.
exprt is_not_zero(const exprt &src, const namespacet &ns)
converts a scalar/float expression to C/C++ Booleans
bool value_is_zero_string() const
depth_iteratort depth_begin()
const typecast_exprt & to_typecast_expr(const exprt &expr)
Cast an exprt to a typecast_exprt.
bool is_constant() const
Return whether the expression is a constant.
A base class for relations, i.e., binary predicates whose two operands have the same type.
void add_to_operands(const exprt &expr)
Add the given argument to the end of exprt's operands.
const member_exprt & to_member_expr(const exprt &expr)
Cast an exprt to a member_exprt.
constant_exprt make_boolean_expr(bool value)
returns true_exprt if given true and false_exprt otherwise
with_exprt make_with_expr(const update_exprt &src)
converts an update expr into a (possibly nested) with expression
const address_of_exprt & to_address_of_expr(const exprt &expr)
Cast an exprt to an address_of_exprt.
bool is_null_pointer(const constant_exprt &expr)
Returns true if expr has a pointer type and a value NULL; it also returns true when expr has value ze...
#define INVARIANT(CONDITION, REASON)
This macro uses the wrapper function 'invariant_violated_string'.
source_locationt & add_source_location()
The Boolean constant true.
A constant literal expression.
const irep_idt & get_value() const
const source_locationt & source_location() const
const index_designatort & to_index_designator(const exprt &expr)
Cast an exprt to an index_designatort.