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
                match self#make_stmt_contract kf formals_actuals_terms ret_opt with
                  | None -> DoChildren
                  | Some contract_stmt ->
                    self#queue_stmt_spec kf 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