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 ->
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"