anchor.diff:   * Called when typechecking a Tm_abs node
    *
    * t0 is the expected type in the environment for the Tm_abs node
  + *   and the use_eq bit (whether to use type equality)
    *)
  -and tc_abs_expected_function_typ env (bs:binders) t0 (body:term)
  +and tc_abs_expected_function_typ env (bs:binders) (t0:option<(typ * bool)>) (body:term)
   : (option<typ>        (* any remaining expected type to check against *)
   * binders             (* binders from the abstraction checked against the binders in the corresponding Typ_fun, if any *)
   * binders             (* let rec binders, suitably guarded with termination check, if any *)
  
positive.code: 
      let tac, _, g_tac = tc_tactic t_unit t_unit env tac in
  
      let t' = mk (Tm_ascribed (e, (asc, None), labopt)) top.pos in
      let t', c, g = tc_term env t' in
  
      (* Set the tac ascription on the elaborated term *)
      let t' =
        match (SS.compress t').n with
        | Tm_ascribed (e, (asc, None), labopt) ->
          mk (Tm_ascribed (e, (asc, Some tac), labopt)) t'.pos
        | _ ->
          failwith "impossible"
      in
  
negative.code:     in
      let (rdc, constrname, constructor), topt =
        match Env.expected_typ env with
        | Some (t, _) ->
          //first, prefer the expected type from the context, if any
          TcUtil.find_record_or_dc_from_typ env (Some t) uc top.pos, Some (Inl t)
  
  