let coerce_merge_pointer (e1 : expr) (e2 : expr) =
(* zero constants (integer) -> any pointer, any pointer -> void *. *)
(* otherwise, types must be equal *)
if is_constant_zero e1 then begin
assert (not (is_constant_zero e2));
let e1 = make_null_pointer (type_of e2) ~orig:e1 in
e1, e2
end
else if is_constant_zero e2 then
let e2 = make_null_pointer (type_of e1) ~orig:e2 in
e1, e2
else if is_void_pointer e1 then
let e2 = assign_coerce e2 (type_of e1) in
e1, e2
else if is_void_pointer e2 then
let e1 = assign_coerce e1 (type_of e2) in
e1, e2
else begin
ensure_same_type e1 e2;
e1, e2
end