method private postaction_lval lv =
    match lv with
      | Var _, NoOffset -> lv
      | Var _, _ ->
          assert false
      | Mem e, NoOffset ->
          begin match self#wrap_type_if_needed (typeOf e) with
            | Some newtyp ->
                let newfi = get_unique_field (pointed_type newtyp) in
                let newlv = Mem e, Field (newfi, NoOffsetin
                (* Check new left-value is well-typed. *)
(*                 begin try ignore (typeOfLval newlv) with _ -> assert false end; *)
                newlv
            | None -> lv
          end
      | Mem e, (Index(ie,_) as off) ->
          if is_last_offset off then
            match self#wrap_type_if_needed (typeOf e) with
              | Some newtyp ->
                  let newfi = get_unique_field (pointed_type newtyp) in
                  let newlv =
                    if is_array_reference_type newtyp then
                      lv
                    else
                      Mem(new_exp(BinOp(PlusPI,e,ie,newtyp))), NoOffset
                  in
                  let newlv = addOffsetLval (Field (newfi, NoOffset)) newlv in
(*                   begin try ignore (typeOfLval newlv) with _ -> assert false end; *)
                  newlv
              | None -> lv
          else lv
      | Mem _, Field _ -> lv