method vinst vi =
    (* assigned left values are checked for valid access *)
    match vi with
      | Set (lval,_,_) ->
          if self#is_DoMemAccess () then
            self#queue_assertion (get_lval_assertion lval)
          ;
          DoChildren
      | Call (ret_opt,funcexp,argl,_) -> (
          if not(self#is_DoCalledPrecond ()) then
            DoChildren
          else
            match funcexp.enode with
              | Lval (Var vinfo,NoOffset->
                  let kf =  Globals.Functions.get vinfo in
                  let formals = Kernel_function.get_formals kf in
                    if (List.length formals <> List.length argl) then (
                      rte_warn
                        "(%a) function call with # actuals <> # formals: not treated"
                        d_stmt (Extlib.the (self#current_stmt))
                      ;
                      DoChildren
                    ) else (
                      let formals_actuals_terms =
                        List.rev_map2
                          (fun formal arg_exp ->
                             (formal,
                              Logic_utils.expr_to_term ~cast:true arg_exp)
                          )
                          formals argl in
                      let contract_stmt =
                        self#make_stmt_contract kf formals_actuals_terms ret_opt
                      in
                        self#queue_stmt_spec contract_stmt
                        ;
                        DoChildren
                    )
              | Lval (Mem _,NoOffset->
                  rte_warn "(%a) function called through a pointer: not treated"
                    d_stmt (Extlib.the (self#current_stmt))
                  ;
                  DoChildren
              | _ -> assert false
        )
      | _ -> DoChildren