let rec data_shift_range tobj loc kbi dindex ~is_pos =
match dindex with
| Data _ | Value _ | Loc _ as d ->
let idx =integer_of_data kbi d in
let idx = if is_pos then idx else F.e_ineg idx in
Loc (M.shift loc tobj idx)
| List il -> union_map (data_shift_range tobj loc kbi ~is_pos) il
| Interval r ->
let r = if is_pos then r else neg_interval r in Range(tobj,loc,r)
| Set _ | Range _ ->
Wp_parameters.not_yet_implemented "pointer shift over arbitrary sets"