diff --git a/src/ansi-c/c_typecheck_expr.cpp b/src/ansi-c/c_typecheck_expr.cpp index a753a5b5ffc..7cebef0ce10 100644 --- a/src/ansi-c/c_typecheck_expr.cpp +++ b/src/ansi-c/c_typecheck_expr.cpp @@ -245,7 +245,7 @@ void c_typecheck_baset::typecheck_expr_main(exprt &expr) subtypes[1].remove(ID_C_volatile); subtypes[1].remove(ID_C_restricted); - expr.make_bool(gcc_types_compatible_p(subtypes[0], subtypes[1])); + expr = make_boolean_expr(gcc_types_compatible_p(subtypes[0], subtypes[1])); expr.add_source_location()=source_location; } else if(expr.id()==ID_clang_builtin_convertvector) diff --git a/src/util/expr.h b/src/util/expr.h index d83ebb7d6f9..015367c3a7a 100644 --- a/src/util/expr.h +++ b/src/util/expr.h @@ -236,6 +236,7 @@ class exprt:public irept DEPRECATED(SINCE(2019, 1, 19, "use typecast_exprt() instead")) void make_typecast(const typet &_type); + DEPRECATED(SINCE(2019, 5, 28, "use make_boolean_expr(value) instead")) void make_bool(bool value); bool is_constant() const; diff --git a/src/util/expr_util.cpp b/src/util/expr_util.cpp index acb9dc99dbf..85f3534667a 100644 --- a/src/util/expr_util.cpp +++ b/src/util/expr_util.cpp @@ -281,3 +281,11 @@ bool is_constantt::is_constant_address_of(const exprt &expr) const return false; } + +constant_exprt make_boolean_expr(bool value) +{ + if(value) + return true_exprt(); + else + return false_exprt(); +} diff --git a/src/util/expr_util.h b/src/util/expr_util.h index bc0b5099071..e669e457b0f 100644 --- a/src/util/expr_util.h +++ b/src/util/expr_util.h @@ -21,6 +21,7 @@ Author: Daniel Kroening, kroening@kroening.com #include +class constant_exprt; class exprt; class symbol_exprt; class update_exprt; @@ -96,4 +97,7 @@ class is_constantt virtual bool is_constant_address_of(const exprt &) const; }; +/// returns true_exprt if given true and false_exprt otherwise +constant_exprt make_boolean_expr(bool); + #endif // CPROVER_UTIL_EXPR_UTIL_H diff --git a/src/util/simplify_expr.cpp b/src/util/simplify_expr.cpp index b04cd6623de..9e4e3aca044 100644 --- a/src/util/simplify_expr.cpp +++ b/src/util/simplify_expr.cpp @@ -115,7 +115,7 @@ bool simplify_exprt::simplify_sign(exprt &expr) if(type.id()==ID_floatbv) { ieee_floatt value(to_constant_expr(expr.op0())); - expr.make_bool(value.get_sign()); + expr = make_boolean_expr(value.get_sign()); return false; } else if(type.id()==ID_signedbv || @@ -124,7 +124,7 @@ bool simplify_exprt::simplify_sign(exprt &expr) const auto value = numeric_cast(expr.op0()); if(value.has_value()) { - expr.make_bool(*value >= 0); + expr = make_boolean_expr(*value >= 0); return false; } } @@ -561,7 +561,7 @@ bool simplify_exprt::simplify_typecast(exprt &expr) if(expr_type_id==ID_bool) { - expr.make_bool(int_value!=0); + expr = make_boolean_expr(int_value != 0); return false; } @@ -646,7 +646,7 @@ bool simplify_exprt::simplify_typecast(exprt &expr) if(expr_type_id==ID_bool) { - expr.make_bool(int_value!=0); + expr = make_boolean_expr(int_value != 0); return false; } diff --git a/src/util/simplify_expr_boolean.cpp b/src/util/simplify_expr_boolean.cpp index 9bcd53ec73a..bb8ca8239c1 100644 --- a/src/util/simplify_expr_boolean.cpp +++ b/src/util/simplify_expr_boolean.cpp @@ -75,7 +75,7 @@ bool simplify_exprt::simplify_boolean(exprt &expr) if(operands.empty()) { - expr.make_bool(negate); + expr = make_boolean_expr(negate); return false; } else if(operands.size()==1) @@ -135,13 +135,13 @@ bool simplify_exprt::simplify_boolean(exprt &expr) op.type().id()==ID_bool && expr_set.find(op.op0())!=expr_set.end()) { - expr.make_bool(expr.id()==ID_or); + expr = make_boolean_expr(expr.id() == ID_or); return false; } if(operands.empty()) { - expr.make_bool(expr.id()==ID_and); + expr = make_boolean_expr(expr.id() == ID_and); return false; } else if(operands.size()==1) diff --git a/src/util/simplify_expr_floatbv.cpp b/src/util/simplify_expr_floatbv.cpp index adb4d9f9330..e68cbbf795d 100644 --- a/src/util/simplify_expr_floatbv.cpp +++ b/src/util/simplify_expr_floatbv.cpp @@ -10,6 +10,7 @@ Author: Daniel Kroening, kroening@kroening.com #include "arith_tools.h" #include "expr.h" +#include "expr_util.h" #include "ieee_float.h" #include "invariant.h" #include "namespace.h" @@ -27,7 +28,7 @@ bool simplify_exprt::simplify_isinf(exprt &expr) if(expr.op0().is_constant()) { ieee_floatt value(to_constant_expr(expr.op0())); - expr.make_bool(value.is_infinity()); + expr = make_boolean_expr(value.is_infinity()); return false; } @@ -42,7 +43,7 @@ bool simplify_exprt::simplify_isnan(exprt &expr) if(expr.op0().is_constant()) { ieee_floatt value(to_constant_expr(expr.op0())); - expr.make_bool(value.is_NaN()); + expr = make_boolean_expr(value.is_NaN()); return false; } @@ -57,7 +58,7 @@ bool simplify_exprt::simplify_isnormal(exprt &expr) if(expr.op0().is_constant()) { ieee_floatt value(to_constant_expr(expr.op0())); - expr.make_bool(value.is_normal()); + expr = make_boolean_expr(value.is_normal()); return false; } @@ -119,7 +120,7 @@ bool simplify_exprt::simplify_sign(exprt &expr) if(type.id()==ID_floatbv) { ieee_floatt value(to_constant_expr(expr.op0())); - expr.make_bool(value.get_sign()); + expr = make_boolean_expr(value.get_sign()); return false; } else if(type.id()==ID_signedbv || @@ -128,7 +129,7 @@ bool simplify_exprt::simplify_sign(exprt &expr) mp_integer value; if(!to_integer(expr.op0(), value)) { - expr.make_bool(value>=0); + expr = make_boolean_expr(value>=0); return false; } } @@ -381,9 +382,9 @@ bool simplify_exprt::simplify_ieee_float_relation(exprt &expr) ieee_floatt f1(to_constant_expr(expr.op1())); if(expr.id()==ID_ieee_float_notequal) - expr.make_bool(f0.ieee_not_equal(f1)); + expr = make_boolean_expr(f0.ieee_not_equal(f1)); else if(expr.id()==ID_ieee_float_equal) - expr.make_bool(f0.ieee_equal(f1)); + expr = make_boolean_expr(f0.ieee_equal(f1)); else UNREACHABLE; diff --git a/src/util/simplify_expr_int.cpp b/src/util/simplify_expr_int.cpp index 1918af989ed..de31570584b 100644 --- a/src/util/simplify_expr_int.cpp +++ b/src/util/simplify_expr_int.cpp @@ -846,7 +846,7 @@ bool simplify_exprt::simplify_extractbit(exprt &expr) src_bit_width, numeric_cast_v(*index_converted_to_int)); - expr.make_bool(bit); + expr = make_boolean_expr(bit); return false; } @@ -1425,7 +1425,7 @@ bool simplify_exprt::simplify_inequality_both_constant(exprt &expr) } equal = tmp0_const.is_zero() && tmp1_const.is_zero(); } - expr.make_bool(expr.id() == ID_equal ? equal : !equal); + expr = make_boolean_expr(expr.id() == ID_equal ? equal : !equal); return false; } @@ -1435,13 +1435,13 @@ bool simplify_exprt::simplify_inequality_both_constant(exprt &expr) fixedbvt f1(tmp1_const); if(expr.id() == ID_ge) - expr.make_bool(f0 >= f1); + expr = make_boolean_expr(f0 >= f1); else if(expr.id() == ID_le) - expr.make_bool(f0 <= f1); + expr = make_boolean_expr(f0 <= f1); else if(expr.id() == ID_gt) - expr.make_bool(f0 > f1); + expr = make_boolean_expr(f0 > f1); else if(expr.id() == ID_lt) - expr.make_bool(f0 < f1); + expr = make_boolean_expr(f0 < f1); else UNREACHABLE; @@ -1453,13 +1453,13 @@ bool simplify_exprt::simplify_inequality_both_constant(exprt &expr) ieee_floatt f1(tmp1_const); if(expr.id() == ID_ge) - expr.make_bool(f0 >= f1); + expr = make_boolean_expr(f0 >= f1); else if(expr.id() == ID_le) - expr.make_bool(f0 <= f1); + expr = make_boolean_expr(f0 <= f1); else if(expr.id() == ID_gt) - expr.make_bool(f0 > f1); + expr = make_boolean_expr(f0 > f1); else if(expr.id() == ID_lt) - expr.make_bool(f0 < f1); + expr = make_boolean_expr(f0 < f1); else UNREACHABLE; @@ -1476,13 +1476,13 @@ bool simplify_exprt::simplify_inequality_both_constant(exprt &expr) return true; if(expr.id() == ID_ge) - expr.make_bool(r0 >= r1); + expr = make_boolean_expr(r0 >= r1); else if(expr.id() == ID_le) - expr.make_bool(r0 <= r1); + expr = make_boolean_expr(r0 <= r1); else if(expr.id() == ID_gt) - expr.make_bool(r0 > r1); + expr = make_boolean_expr(r0 > r1); else if(expr.id() == ID_lt) - expr.make_bool(r0 < r1); + expr = make_boolean_expr(r0 < r1); else UNREACHABLE; @@ -1501,13 +1501,13 @@ bool simplify_exprt::simplify_inequality_both_constant(exprt &expr) return true; if(expr.id() == ID_ge) - expr.make_bool(*v0 >= *v1); + expr = make_boolean_expr(*v0 >= *v1); else if(expr.id() == ID_le) - expr.make_bool(*v0 <= *v1); + expr = make_boolean_expr(*v0 <= *v1); else if(expr.id() == ID_gt) - expr.make_bool(*v0 > *v1); + expr = make_boolean_expr(*v0 > *v1); else if(expr.id() == ID_lt) - expr.make_bool(*v0 < *v1); + expr = make_boolean_expr(*v0 < *v1); else UNREACHABLE; @@ -1669,7 +1669,7 @@ bool simplify_exprt::simplify_inequality_no_constant(exprt &expr) if(ok) { - expr.make_bool(result); + expr = make_boolean_expr(result); return false; } } diff --git a/src/util/simplify_expr_pointer.cpp b/src/util/simplify_expr_pointer.cpp index 43f78dc5714..426e6ee6085 100644 --- a/src/util/simplify_expr_pointer.cpp +++ b/src/util/simplify_expr_pointer.cpp @@ -443,7 +443,7 @@ bool simplify_exprt::simplify_inequality_address_of(exprt &expr) bool equal = to_symbol_expr(tmp0.op0()).get_identifier() == to_symbol_expr(tmp1.op0()).get_identifier(); - expr.make_bool(expr.id()==ID_equal?equal:!equal); + expr = make_boolean_expr(expr.id() == ID_equal ? equal : !equal); return false; } @@ -454,7 +454,7 @@ bool simplify_exprt::simplify_inequality_address_of(exprt &expr) bool equal = to_dynamic_object_expr(tmp0.op0()).get_instance() == to_dynamic_object_expr(tmp1.op0()).get_instance(); - expr.make_bool(expr.id() == ID_equal ? equal : !equal); + expr = make_boolean_expr(expr.id() == ID_equal ? equal : !equal); return false; } @@ -462,7 +462,7 @@ bool simplify_exprt::simplify_inequality_address_of(exprt &expr) (tmp0.op0().id() == ID_symbol && tmp1.op0().id() == ID_dynamic_object) || (tmp0.op0().id() == ID_dynamic_object && tmp1.op0().id() == ID_symbol)) { - expr.make_bool(expr.id() != ID_equal); + expr = make_boolean_expr(expr.id() != ID_equal); return false; } @@ -580,7 +580,8 @@ bool simplify_exprt::simplify_is_dynamic_object(exprt &expr) const irep_idt identifier=to_symbol_expr(op.op0()).get_identifier(); // this is for the benefit of symex - expr.make_bool(has_prefix(id2string(identifier), SYMEX_DYNAMIC_PREFIX)); + expr = make_boolean_expr( + has_prefix(id2string(identifier), SYMEX_DYNAMIC_PREFIX)); return false; } else if(op.op0().id()==ID_string_constant)