From b00a3c0956c0cd3437cf9d52e70c8e9112a8f73f Mon Sep 17 00:00:00 2001 From: Sergey Prytkov Date: Sat, 11 Feb 2023 22:32:17 +0300 Subject: [PATCH 1/3] Erase late bound regions while resolving drop_in_place --- compiler/rustc_middle/src/ty/instance.rs | 13 +++++++++++-- tests/run-make/issue-107205/Makefile | 4 ++++ tests/run-make/issue-107205/main.rs | 16 ++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 tests/run-make/issue-107205/Makefile create mode 100644 tests/run-make/issue-107205/main.rs 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)); +} From 2826efcf9e93e96904b602127377a3fa370708e6 Mon Sep 17 00:00:00 2001 From: Sergey Prytkov Date: Tue, 14 Feb 2023 08:58:12 +0000 Subject: [PATCH 2/3] fix imports after merge --- compiler/rustc_middle/src/ty/instance.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/rustc_middle/src/ty/instance.rs b/compiler/rustc_middle/src/ty/instance.rs index 0afdbe4948514..f160f6053a36c 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, Binder, Ty, TyCtxt, TyKind, TypeFoldable, TypeSuperFoldable, TypeVisitable}; +use crate::ty::{self, Binder, Ty, TyCtxt, TyKind, TypeFoldable, TypeSuperFoldable}; use crate::ty::{EarlyBinder, InternalSubsts, SubstsRef}; use rustc_errors::ErrorGuaranteed; use rustc_hir::def::Namespace; From 6c7bcb501535b597caae54a2e5c4a6723d412259 Mon Sep 17 00:00:00 2001 From: Sergey Prytkov Date: Fri, 17 Feb 2023 18:27:07 +0000 Subject: [PATCH 3/3] move test from run-make to ui/coercion --- tests/run-make/issue-107205/Makefile | 4 ---- .../issue-107205/main.rs => ui/coercion/issue-107205.rs} | 2 ++ 2 files changed, 2 insertions(+), 4 deletions(-) delete mode 100644 tests/run-make/issue-107205/Makefile rename tests/{run-make/issue-107205/main.rs => ui/coercion/issue-107205.rs} (95%) diff --git a/tests/run-make/issue-107205/Makefile b/tests/run-make/issue-107205/Makefile deleted file mode 100644 index 9b761597e5287..0000000000000 --- a/tests/run-make/issue-107205/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -include ../../run-make-fulldeps/tools.mk - -all: - $(RUSTC) main.rs diff --git a/tests/run-make/issue-107205/main.rs b/tests/ui/coercion/issue-107205.rs similarity index 95% rename from tests/run-make/issue-107205/main.rs rename to tests/ui/coercion/issue-107205.rs index e172f887ff646..dc1d400a31be4 100644 --- a/tests/run-make/issue-107205/main.rs +++ b/tests/ui/coercion/issue-107205.rs @@ -1,3 +1,5 @@ +// build-pass + use std::fmt; pub struct Wrapper(fn(val: &()));