+ let closure_def_id = closure_data.closure_def_id;
+ let trait_closure_kind = tcx.lang_items.fn_trait_kind(trait_id).unwrap();
+ let actual_closure_kind = tcx.closure_kind(closure_def_id);
+
+ let needs_fn_once_adapter_shim =
+ match needs_fn_once_adapter_shim(actual_closure_kind,
+ trait_closure_kind) {
+ Ok(true) => true,
+ _ => false,
+ };
+
+ let fn_once_adjustment = if needs_fn_once_adapter_shim {
+ Some(tcx.mk_closure_from_closure_substs(closure_def_id,
+ closure_data.substs))
+ } else {
+ None
+ };
+
+ StaticDispatchResult::Dispatched {
+ def_id: closure_def_id,
+ substs: closure_data.substs.substs,
+ fn_once_adjustment: fn_once_adjustment,
+ }