let rec data_load env ty  = function
    | Loc _ | Data _ | Value _  as d ->
        let obj = object_of ty in
        Value (M.load (mem_at_env env) obj (loc_of_data obj d))
    | Range _ ->
        Wp_parameters.not_yet_implemented "load of arbitrary region"
    | Set _ ->
        Wp_parameters.not_yet_implemented "load of arbitrary sets"
    | List pl -> union_map (data_load env ty) pl
    | _ -> WpLog.fatal "unexpected argument for [load]"