let rec memory_offset env ty (dp:data) = function
    | TNoOffset -> ty,dp
    | TIndex(t,off) ->
        let kp = kind_of_data ty dp in
        let ki = kind_of t.term_type in
        let di = !data_rec env t in
        let te = Cil.typeOf_array_elem ty in
        let ta = object_of te in
        let dq = data_index ta kp dp ki di in
        memory_offset env te dq off
    | TField(f,off) as offset ->
        (match dp with
          | Range _ | Set _ | List _ ->
              Datalib.Collector.add_warning
                ~reason:"field access over set of l-values"
                "Ignored offset '%a' in assign clause"
                !Ast_printer.d_term_offset offset ;
              ty, dp
          | dp ->
              let dq = data_field (kind_of_typ ty) dp f in
              memory_offset env f.ftype dq off )