let data_index ta ka ga kb gb =
match ka,kb with
| (Karray _ | Kptr _) , (Kint | Kcint _) ->
Loc (M.index (loc_of_data ta ga) ta (integer_of_data kb gb))
| (Karray _ | Kptr _) , (Kset ((Kint |Kcint _) as kbi)) ->
data_index_range ta (loc_of_data ta ga) kbi gb
| _ -> WpLog.not_yet_implemented "shift over arbitrary sets of pointers"