37 new_symbol.
value = expr;
43 result.add_source_location() = source_location;
52 convert(code_assign, dest, mode);
72 expr.
id() == ID_side_effect || expr.
id() == ID_compound_literal ||
73 expr.
id() == ID_comma)
92 if(expr.
id() == ID_forall || expr.
id() == ID_exists)
95 for(
const auto &op : expr.
operands())
108 expr.
id() == ID_and || expr.
id() == ID_or || expr.
id() == ID_implies);
114 "' must be Boolean, but got ",
120 if(
auto implies = expr_try_dynamic_cast<implies_exprt>(expr))
123 std::move(implies->lhs()),
124 std::move(implies->rhs()),
135 if(expr.
id() == ID_and)
145 for(exprt::operandst::reverse_iterator it = ops.rbegin(); it != ops.rend();
152 "boolean operators must have only boolean operands",
155 if(expr.
id() == ID_and)
163 if(expr.
id() == ID_or)
193 if(expr.
id() == ID_and || expr.
id() == ID_or || expr.
id() == ID_implies)
199 return clean_expr(expr, mode, result_is_used);
201 else if(expr.
id() == ID_if)
220 "condition for an 'if' must be boolean",
321 else if(expr.
id() == ID_comma)
331 bool last = (it == --expr.
operands().end());
367 else if(expr.
id() == ID_typecast)
380 else if(expr.
id() == ID_side_effect)
385 if(statement == ID_gcc_conditional_expression)
390 else if(statement == ID_statement_expression)
397 else if(statement == ID_assign)
402 "side-effect assignment expressions must have two operands");
407 side_effect_assign.rhs().id() == ID_side_effect &&
413 exprt lhs = side_effect_assign.lhs();
427 side_effect_assign.rhs(), new_lhs.
type());
433 expr = must_use_rhs ? new_rhs : lhs;
441 else if(expr.
id() == ID_forall || expr.
id() == ID_exists)
445 "the front-end should check quantified expressions for side-effects");
447 else if(expr.
id() == ID_address_of)
460 if(expr.
id() == ID_side_effect)
465 else if(expr.
id() == ID_compound_literal)
469 expr.
operands().size() == 1,
"ID_compound_literal has a single operand");
484 if(expr.
id() == ID_compound_literal)
487 expr.
operands().size() == 1,
"ID_compound_literal has a single operand");
492 else if(expr.
id() == ID_string_constant)
497 else if(expr.
id() == ID_index)
503 else if(expr.
id() == ID_dereference)
508 else if(expr.
id() == ID_comma)
517 bool last = (it == --expr.
operands().end());
537 else if(expr.
id() == ID_side_effect)
@ AUTOMATIC_LOCAL
Allocate local objects with automatic lifetime.
Operator to return the address of an object.
A goto_instruction_codet representing an assignment in the program.
A goto_instruction_codet representing the removal of a local variable going out of scope.
A goto_instruction_codet representing the declaration of a local variable.
codet representation of an expression statement.
Operator to dereference a pointer.
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Base class for all expressions.
const source_locationt & find_source_location() const
Get a source_locationt from the expression or from its operands (non-recursively).
std::vector< exprt > operandst
exprt & with_source_location(source_locationt location) &
Add the source location from location, if it is non-nil.
bool is_true() const
Return whether the expression is a constant representing true.
source_locationt & add_source_location()
bool is_boolean() const
Return whether the expression represents a Boolean.
const source_locationt & source_location() const
bool is_false() const
Return whether the expression is a constant representing false.
typet & type()
Return the type of the expression.
The Boolean constant false.
clean_expr_resultt clean_expr_address_of(exprt &expr, const irep_idt &mode)
symbol_table_baset & symbol_table
void convert_assign(const code_assignt &code, goto_programt &dest, const irep_idt &mode)
clean_expr_resultt remove_gcc_conditional_expression(exprt &expr, const irep_idt &mode)
void copy(const codet &code, goto_program_instruction_typet type, goto_programt &dest)
void generate_ifthenelse(const exprt &cond, const source_locationt &, goto_programt &true_case, const source_locationt &, goto_programt &false_case, const source_locationt &, goto_programt &dest, const irep_idt &mode)
if(guard) true_case; else false_case;
std::string tmp_symbol_prefix
struct goto_convertt::targetst targets
symbolt & new_tmp_symbol(const typet &type, const std::string &suffix, goto_programt &dest, const source_locationt &, const irep_idt &mode)
symbol_exprt make_compound_literal(const exprt &expr, goto_programt &dest, const irep_idt &mode)
clean_expr_resultt remove_side_effect(side_effect_exprt &expr, const irep_idt &mode, bool result_is_used, bool address_taken)
static bool needs_cleaning(const exprt &expr)
Returns 'true' for expressions that may change the program state.
void convert(const codet &code, goto_programt &dest, const irep_idt &mode)
converts 'code' and appends the result to 'dest'
clean_expr_resultt remove_function_call(side_effect_expr_function_callt &expr, const irep_idt &mode, bool result_is_used)
clean_expr_resultt remove_statement_expression(side_effect_exprt &expr, const irep_idt &mode, bool result_is_used)
clean_expr_resultt clean_expr(exprt &expr, const irep_idt &mode, bool result_is_used=true)
void rewrite_boolean(exprt &dest)
re-write boolean operators into ?:
static bool assignment_lhs_needs_temporary(const exprt &lhs)
A generic container class for the GOTO intermediate representation of one function.
The trinary if-then-else operator.
const irep_idt & id() const
mstreamt & result() const
void add(const codet &destructor, std::optional< goto_programt::targett > declaration)
Adds a destructor/declaration pair to the current stack, attaching it to the current node.
const irep_idt & get_statement() const
Expression to hold a symbol (variable)
class symbol_exprt symbol_expr() const
Produces a symbol_exprt for a symbol.
exprt value
Initial value of symbol.
The Boolean constant true.
Semantic type conversion.
static exprt conditional_cast(const exprt &expr, const typet &type)
void destruct_locals(const std::list< irep_idt > &vars, goto_programt &dest, const namespacet &ns)
#define Forall_operands(it, expr)
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
Deprecated expression utility functions.
symbolt & get_fresh_aux_symbol(const typet &type, const std::string &name_prefix, const std::string &basename_prefix, const source_locationt &source_location, const irep_idt &symbol_mode, const namespacet &ns, symbol_table_baset &symbol_table)
Installs a fresh-named symbol with respect to the given namespace ns with the requested name pattern ...
Fresh auxiliary symbol creation.
API to expression classes for Pointers.
const dereference_exprt & to_dereference_expr(const exprt &expr)
Cast an exprt to a dereference_exprt.
const address_of_exprt & to_address_of_expr(const exprt &expr)
Cast an exprt to an address_of_exprt.
exprt deref_expr(const exprt &expr)
Wraps a given expression into a dereference_exprt unless it is an address_of_exprt in which case it j...
bool simplify(exprt &expr, const namespacet &ns)
#define PRECONDITION_WITH_DIAGNOSTICS(CONDITION,...)
#define UNREACHABLE
This should be used to mark dead code.
#define DATA_INVARIANT(CONDITION, REASON)
This condition should be used to document that assumptions that are made on goto_functions,...
#define PRECONDITION(CONDITION)
#define DATA_INVARIANT_WITH_DIAGNOSTICS(CONDITION, REASON,...)
side_effect_exprt & to_side_effect_expr(exprt &expr)
side_effect_expr_function_callt & to_side_effect_expr_function_call(exprt &expr)
side_effect_expr_assignt & to_side_effect_expr_assign(exprt &expr)
API to expression classes.
const if_exprt & to_if_expr(const exprt &expr)
Cast an exprt to an if_exprt.
const symbol_exprt & to_symbol_expr(const exprt &expr)
Cast an exprt to a symbol_exprt.
const typecast_exprt & to_typecast_expr(const exprt &expr)
Cast an exprt to a typecast_exprt.
const binary_exprt & to_binary_expr(const exprt &expr)
Cast an exprt to a binary_exprt.
const unary_exprt & to_unary_expr(const exprt &expr)
Cast an exprt to a unary_exprt.
const index_exprt & to_index_expr(const exprt &expr)
Cast an exprt to an index_exprt.
std::list< irep_idt > temporaries
Identifiers of temporaries introduced while cleaning an expression.
void add(clean_expr_resultt &&other)
void add_temporary(const irep_idt &id)
goto_programt side_effects
Statements implementing side effects of the expression that was subject to cleaning.