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"