let rec build_mu texpr lv exp = match lv with
  | Var vi, off -> 
      let v = MT.mk_cvar vi in
      let t = Ctype vi.vtype in
        vi, MV.mk_offset_update texpr None v t exp off
  | Mem ptr, off -> (* ( *p ).off *)
      match texpr ptr, ptr.enode with 
        | Some ptr1, Lval lv ->
            let x = M.access ptr1 in
            let tx = Types.ctype_ptr_subtype (Cil.typeOf ptr) in
            let tx = Ctype tx in
            let exp = MV.mk_offset_update texpr None x tx exp off in
            let exp = match exp with None -> None 
              | Some exp -> Some (M.mk_ptr_update ptr1 exp)
            in
            let v, exp = build_mu texpr lv exp in
             v, exp
        | _ -> 
            Wp_parameters.warning "don't know how to assign in *(%a)"
              !Ast_printer.d_exp ptr;
            abort "indirect assign to expression"