26 return val.find_first_not_of(
'0')==std::string::npos;
56 -> decltype(struct_expr.op0())
59 std::is_base_of<struct_exprt, T>::value,
"T must be a struct_exprt.");
63 index < struct_expr.operands().size(),
64 "component matching index should exist");
65 return struct_expr.operands()[index];
97 const typet &compound_type = ns.
follow(member_expr.compound().type());
98 const auto *struct_union_type =
99 type_try_dynamic_cast<struct_union_typet>(compound_type);
102 struct_union_type !=
nullptr,
103 "member must address a struct, union or compatible type");
106 struct_union_type->get_component(member_expr.get_component_name());
111 "member component '" +
id2string(member_expr.get_component_name()) +
112 "' must exist on addressed type");
117 "member expression's type must match the addressed struct or union "
129 let_expr.values().size() == let_expr.variables().size(),
130 "number of variables must match number of values");
133 make_range(let_expr.variables()).zip(let_expr.values()))
138 "let binding symbols must be symbols");
143 "let bindings must be type consistent");
Expression classes for byte-level operators.
static void check(const exprt &expr, const validation_modet vm=validation_modet::INVARIANT)
const irep_idt & get_value() const
bool value_is_zero_string() const
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Base class for all expressions.
std::vector< exprt > operandst
typet & type()
Return the type of the expression.
The Boolean constant false.
const irep_idt & id() const
static void validate(const exprt &, validation_modet)
binding_exprt & binding()
static void validate(const exprt &expr, const namespacet &ns, const validation_modet vm=validation_modet::INVARIANT)
Check that the member expression has the right number of operands, refers to a component that exists ...
static void check(const exprt &expr, const validation_modet vm=validation_modet::INVARIANT)
const typet & follow(const typet &) const
Resolve type symbol to the type it points to.
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
exprt & component(const irep_idt &name, const namespacet &ns)
std::size_t component_number(const irep_idt &component_name) const
Return the sequence number of the component with given name.
The Boolean constant true.
The type of an expression, extends irept.
Deprecated expression utility functions.
const std::string & id2string(const irep_idt &d)
Ranges: pair of begin and end iterators, which can be initialized from containers,...
ranget< iteratort > make_range(iteratort begin, iteratort end)
#define DATA_INVARIANT(CONDITION, REASON)
This condition should be used to document that assumptions that are made on goto_functions,...
exprt conjunction(const exprt::operandst &op)
1) generates a conjunction for two or more operands 2) for one operand, returns the operand 3) return...
exprt disjunction(const exprt::operandst &op)
1) generates a disjunction for two or more operands 2) for one operand, returns the operand 3) return...
auto component(T &struct_expr, const irep_idt &name, const namespacet &ns) -> decltype(struct_expr.op0())
API to expression classes.
const let_exprt & to_let_expr(const exprt &expr)
Cast an exprt to a let_exprt.
const member_exprt & to_member_expr(const exprt &expr)
Cast an exprt to a member_exprt.
const struct_typet & to_struct_type(const typet &type)
Cast a typet to a struct_typet.
#define DATA_CHECK(vm, condition, message)
This macro takes a condition which denotes a well-formedness criterion on goto programs,...