diff --git a/compiler/rustc_middle/src/ty/instance.rs b/compiler/rustc_middle/src/ty/instance.rs index 55f2395e531a5..0afdbe4948514 100644 --- a/compiler/rustc_middle/src/ty/instance.rs +++ b/compiler/rustc_middle/src/ty/instance.rs @@ -1,6 +1,6 @@ use crate::middle::codegen_fn_attrs::CodegenFnAttrFlags; use crate::ty::print::{FmtPrinter, Printer}; -use crate::ty::{self, Ty, TyCtxt, TypeFoldable, TypeSuperFoldable}; +use crate::ty::{self, Binder, Ty, TyCtxt, TyKind, TypeFoldable, TypeSuperFoldable, TypeVisitable}; use crate::ty::{EarlyBinder, InternalSubsts, SubstsRef}; use rustc_errors::ErrorGuaranteed; use rustc_hir::def::Namespace; @@ -539,8 +539,17 @@ impl<'tcx> Instance<'tcx> { } pub fn resolve_drop_in_place(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> ty::Instance<'tcx> { + let ty_erased = + if let (true, TyKind::FnPtr(poly_fn_sig)) = (ty.has_late_bound_regions(), ty.kind()) { + let re_erased = tcx.erase_late_bound_regions(*poly_fn_sig); + let rebound = Binder::dummy(re_erased); + let reassembled = tcx.mk_fn_ptr(rebound); + reassembled + } else { + ty + }; let def_id = tcx.require_lang_item(LangItem::DropInPlace, None); - let substs = tcx.intern_substs(&[ty.into()]); + let substs = tcx.intern_substs(&[ty_erased.into()]); Instance::expect_resolve(tcx, ty::ParamEnv::reveal_all(), def_id, substs) } diff --git a/tests/run-make/issue-107205/Makefile b/tests/run-make/issue-107205/Makefile new file mode 100644 index 0000000000000..9b761597e5287 --- /dev/null +++ b/tests/run-make/issue-107205/Makefile @@ -0,0 +1,4 @@ +include ../../run-make-fulldeps/tools.mk + +all: + $(RUSTC) main.rs diff --git a/tests/run-make/issue-107205/main.rs b/tests/run-make/issue-107205/main.rs new file mode 100644 index 0000000000000..e172f887ff646 --- /dev/null +++ b/tests/run-make/issue-107205/main.rs @@ -0,0 +1,16 @@ +use std::fmt; + +pub struct Wrapper(fn(val: &())); + +impl fmt::Debug for Wrapper { + fn fmt<'a>(&'a self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("Wrapper").field(&self.0 as &fn(&'a ())).finish() + } +} + +fn useful(_: &()) { +} + +fn main() { + println!("{:?}", Wrapper(useful)); +}