Do not normalize closure signature when building FnOnce shim

This commit is contained in:
Michael Goulet
2024-01-19 20:04:14 +00:00
parent 3066253050
commit f700ee4e70
7 changed files with 20 additions and 18 deletions
@@ -682,7 +682,6 @@ fn is_fat_ptr<'tcx>(fx: &FunctionCx<'_, '_, 'tcx>, ty: Ty<'tcx>) -> bool {
args,
ty::ClosureKind::FnOnce,
)
.expect("failed to normalize and resolve closure during codegen")
.polymorphize(fx.tcx);
let func_ref = fx.get_function_ref(instance);
let func_addr = fx.bcx.ins().func_addr(fx.pointer_type, func_ref);
@@ -435,7 +435,6 @@ pub fn codegen_rvalue_operand(
args,
ty::ClosureKind::FnOnce,
)
.expect("failed to normalize and resolve closure during codegen")
.polymorphize(bx.cx().tcx());
OperandValue::Immediate(bx.cx().get_fn_addr(instance))
}
@@ -117,8 +117,7 @@ pub fn cast(
def_id,
args,
ty::ClosureKind::FnOnce,
)
.ok_or_else(|| err_inval!(TooGeneric))?;
);
let fn_ptr = self.fn_ptr(FnVal::Instance(instance));
self.write_pointer(fn_ptr, dest)?;
}
+8 -10
View File
@@ -528,12 +528,12 @@ pub fn resolve_closure(
def_id: DefId,
args: ty::GenericArgsRef<'tcx>,
requested_kind: ty::ClosureKind,
) -> Option<Instance<'tcx>> {
) -> Instance<'tcx> {
let actual_kind = args.as_closure().kind();
match needs_fn_once_adapter_shim(actual_kind, requested_kind) {
Ok(true) => Instance::fn_once_adapter_instance(tcx, def_id, args),
_ => Some(Instance::new(def_id, args)),
_ => Instance::new(def_id, args),
}
}
@@ -548,7 +548,7 @@ pub fn fn_once_adapter_instance(
tcx: TyCtxt<'tcx>,
closure_did: DefId,
args: ty::GenericArgsRef<'tcx>,
) -> Option<Instance<'tcx>> {
) -> Instance<'tcx> {
let fn_once = tcx.require_lang_item(LangItem::FnOnce, None);
let call_once = tcx
.associated_items(fn_once)
@@ -562,14 +562,12 @@ pub fn fn_once_adapter_instance(
let self_ty = Ty::new_closure(tcx, closure_did, args);
let sig = args.as_closure().sig();
let sig =
tcx.try_normalize_erasing_late_bound_regions(ty::ParamEnv::reveal_all(), sig).ok()?;
assert_eq!(sig.inputs().len(), 1);
let args = tcx.mk_args_trait(self_ty, [sig.inputs()[0].into()]);
let tupled_inputs_ty = args.as_closure().sig().map_bound(|sig| sig.inputs()[0]);
let tupled_inputs_ty = tcx.instantiate_bound_regions_with_erased(tupled_inputs_ty);
let args = tcx.mk_args_trait(self_ty, [tupled_inputs_ty.into()]);
debug!(?self_ty, ?sig);
Some(Instance { def, args })
debug!(?self_ty, args=?tupled_inputs_ty.tuple_fields());
Instance { def, args }
}
/// Depending on the kind of `InstanceDef`, the MIR body associated with an
+1 -2
View File
@@ -783,8 +783,7 @@ fn visit_rvalue(&mut self, rvalue: &mir::Rvalue<'tcx>, location: Location) {
def_id,
args,
ty::ClosureKind::FnOnce,
)
.expect("failed to normalize and resolve closure during codegen");
);
if should_codegen_locally(self.tcx, &instance) {
self.output.push(create_fn_mono_item(self.tcx, instance, span));
}
@@ -464,7 +464,10 @@ fn resolve_closure(
let def_id = def.0.internal(&mut *tables, tcx);
let args_ref = args.internal(&mut *tables, tcx);
let closure_kind = kind.internal(&mut *tables, tcx);
Instance::resolve_closure(tables.tcx, def_id, args_ref, closure_kind).stable(&mut *tables)
Some(
Instance::resolve_closure(tables.tcx, def_id, args_ref, closure_kind)
.stable(&mut *tables),
)
}
fn eval_instance(&self, def: InstanceDef, const_ty: Ty) -> Result<Allocation, Error> {
+6 -1
View File
@@ -322,7 +322,12 @@ fn resolve_associated_item<'tcx>(
match *rcvr_args.type_at(0).kind() {
ty::Closure(closure_def_id, args) => {
let trait_closure_kind = tcx.fn_trait_kind_from_def_id(trait_id).unwrap();
Instance::resolve_closure(tcx, closure_def_id, args, trait_closure_kind)
Some(Instance::resolve_closure(
tcx,
closure_def_id,
args,
trait_closure_kind,
))
}
ty::FnDef(..) | ty::FnPtr(..) => Some(Instance {
def: ty::InstanceDef::FnPtrShim(trait_item_id, rcvr_args.type_at(0)),