From 6a9c5fb4cc499bc828422e32689c8f098542f821 Mon Sep 17 00:00:00 2001 From: Bastian Kauschke Date: Wed, 22 Jul 2020 12:50:26 +0200 Subject: [PATCH 1/2] polymorphize GlobalAlloc::Function --- src/librustc_codegen_llvm/common.rs | 2 +- src/librustc_mir/monomorphize/collector.rs | 1 + src/test/ui/polymorphization/promoted-function.rs | 13 +++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/polymorphization/promoted-function.rs diff --git a/src/librustc_codegen_llvm/common.rs b/src/librustc_codegen_llvm/common.rs index 0e1cd8e493d9a..2a50d4a46d279 100644 --- a/src/librustc_codegen_llvm/common.rs +++ b/src/librustc_codegen_llvm/common.rs @@ -257,7 +257,7 @@ impl ConstMethods<'tcx> for CodegenCx<'ll, 'tcx> { (value, AddressSpace::DATA) } GlobalAlloc::Function(fn_instance) => ( - self.get_fn_addr(fn_instance), + self.get_fn_addr(fn_instance.polymorphize(self.tcx)), self.data_layout().instruction_address_space, ), GlobalAlloc::Static(def_id) => { diff --git a/src/librustc_mir/monomorphize/collector.rs b/src/librustc_mir/monomorphize/collector.rs index 0b5f27fc17a72..30d25270f03e5 100644 --- a/src/librustc_mir/monomorphize/collector.rs +++ b/src/librustc_mir/monomorphize/collector.rs @@ -1197,6 +1197,7 @@ fn collect_miri<'tcx>( } } GlobalAlloc::Function(fn_instance) => { + let fn_instance = fn_instance.polymorphize(tcx); if should_codegen_locally(tcx, &fn_instance) { trace!("collecting {:?} with {:#?}", alloc_id, fn_instance); output.push(create_fn_mono_item(tcx, fn_instance, DUMMY_SP)); diff --git a/src/test/ui/polymorphization/promoted-function.rs b/src/test/ui/polymorphization/promoted-function.rs new file mode 100644 index 0000000000000..0d3af7a89c2aa --- /dev/null +++ b/src/test/ui/polymorphization/promoted-function.rs @@ -0,0 +1,13 @@ +// run-pass +fn fop() {} + +fn bar() -> &'static fn() { + &(fop:: as fn()) +} +pub const FN: &'static fn() = &(fop:: as fn()); + +fn main() { + bar::(); + bar::(); + (FN)(); +} From 40b6bccd6431e5d3032279ec5f6d269cacc7fe9b Mon Sep 17 00:00:00 2001 From: Bastian Kauschke Date: Wed, 22 Jul 2020 13:01:55 +0200 Subject: [PATCH 2/2] no need to polymorphize --- src/librustc_mir/monomorphize/collector.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/librustc_mir/monomorphize/collector.rs b/src/librustc_mir/monomorphize/collector.rs index 30d25270f03e5..0b5f27fc17a72 100644 --- a/src/librustc_mir/monomorphize/collector.rs +++ b/src/librustc_mir/monomorphize/collector.rs @@ -1197,7 +1197,6 @@ fn collect_miri<'tcx>( } } GlobalAlloc::Function(fn_instance) => { - let fn_instance = fn_instance.polymorphize(tcx); if should_codegen_locally(tcx, &fn_instance) { trace!("collecting {:?} with {:#?}", alloc_id, fn_instance); output.push(create_fn_mono_item(tcx, fn_instance, DUMMY_SP));