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"