let init_value env lv typ e_opt wp =
    on_context env "init_value" wp Keep_opened Keep_assigns
      (fun env _assigns p ->
         try
           let mem = L.mem_at env Clabels.Here in
           let obj = Ctypes.object_of typ in
           let loc = compute_init_loc mem lv in
           let loaded = WpModel.logic_of_value (WpModel.load mem obj loc) in
           match e_opt with
             | None ->
                 begin 
                   match WpModel.symb_is_init obj with 
                     | Some p_name -> F.p_implies (F.p_app1 p_name loaded) p
                     | None -> p
                 end

             | Some vexp ->
                 let value =
                   WpModel.logic_of_value (compute_init_value mem vexp)
                 in
                 F.p_implies (WpModel.equal obj loaded value) p

         with SkipInit -> p)