anchor.diff:  let type_of_well_typed_tot_or_gtot_term env t = type_of_well_typed_term env t
   
   let rec effect_of_well_typed_term (env:env) (t:term) : option<lident> =
  +  // if Env.debug env <| Options.Other "FastImplicits"
  +  // then BU.print1 "Computing effect of well-typed term: %s\n" (Print.term_to_string t);
  +
     match (SS.compress t).n with
     | Tm_delayed _ | Tm_bvar _ -> failwith "Impossible!"
     | Tm_name _ -> Const.effect_Tot_lid |> Some
  
positive.code:       args
        |> List.map fst
        |> List.map (effect_of_well_typed_term env) in
      let eff_hd_and_args = List.fold_left join_effects eff_hd eff_args in
      if eff_hd_and_args |> is_none then None
      else
        let t_hd = type_of_well_typed_term env hd in
        if t_hd = None then None
        else
          let Some t_hd = t_hd in
  
negative.code:     | Some k' ->
        if not (continue_fast_path k')
        then slow_path "k' has uvars" (Some k')
        else
          let eff_opt = effect_of_well_typed_tot_or_gtot_term env t in
          match eff_opt with
          | None -> slow_path "could not compute the effect" None
          | Some eff ->
            if not must_tot ||
               lid_equals eff Const.effect_Tot_lid ||
               N.non_info_norm env k
            then TcUtil.check_has_type env t k' k
            else raise_error (Errors.Fatal_UnexpectedImplictArgument,
                   (BU.format1 "Implicit argument %s is GTot, expected a Tot" (Print.term_to_string t)))
                   t.pos
          
  let check_type_and_effect_of_well_typed_tot_or_gtot_term env t k must_total = check_well_typed_term_is_tot_or_gtot_at_type env t k must_total false
  