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