let coerce_merge (e1 : expr) (e2 : expr) =
  let e1, e2 = coerce_implicit_pointer e1, coerce_implicit_pointer e2 in
  let t1, t2 = type_of e1, type_of e2 in
  if equal_type t1 t2 then
    e1, e2
  else if is_numeric e1 && is_numeric e2 then
    coerce_merge_numeric e1 e2
  else if is_pointer_or_null e1 && is_pointer_or_null e2 then
    coerce_merge_pointer e1 e2
  else
    raise (Type_Error_local("type merge failed"))