let data_shift ka ga kb gb ~is_pos =
    match ka,kb with
      | (Karray _ | Kptr _ ) , (Kint | Kcint _) ->
          let obj = object_of_pointed ka in
          let gb = integer_of_data kb gb in
          let gb = if is_pos then gb else (F.e_ineg gb) in
          Loc (M.shift
                 (loc_of_data obj ga)
                  obj gb)
      | (Kptr _ | Karray _) , (Kset ((Kint | Kcint _) as kbi)) ->
          let obj = object_of_pointed ka in
          data_shift_range obj (loc_of_data obj ga) kbi gb ~is_pos
      | _ -> WpLog.not_yet_implemented "shift over arbitrary sets of pointers"