Skip to content

Commit a637e2a

Browse files
Rollup merge of rust-lang#106917 - compiler-errors:const-closure-foreign, r=tmiasko
Encode const mir for closures if they're const Fixes rust-lang#106913
2 parents 685c773 + 3a4fdcf commit a637e2a

File tree

3 files changed

+18
-11
lines changed

3 files changed

+18
-11
lines changed

compiler/rustc_metadata/src/rmeta/encoder.rs

+2-11
Original file line numberDiff line numberDiff line change
@@ -888,8 +888,8 @@ fn should_encode_mir(tcx: TyCtxt<'_>, def_id: LocalDefId) -> (bool, bool) {
888888
| DefKind::AssocConst
889889
| DefKind::Static(..)
890890
| DefKind::Const => (true, false),
891-
// Full-fledged functions
892-
DefKind::AssocFn | DefKind::Fn => {
891+
// Full-fledged functions + closures
892+
DefKind::AssocFn | DefKind::Fn | DefKind::Closure => {
893893
let generics = tcx.generics_of(def_id);
894894
let needs_inline = (generics.requires_monomorphization(tcx)
895895
|| tcx.codegen_fn_attrs(def_id).requests_inline())
@@ -900,15 +900,6 @@ fn should_encode_mir(tcx: TyCtxt<'_>, def_id: LocalDefId) -> (bool, bool) {
900900
let always_encode_mir = tcx.sess.opts.unstable_opts.always_encode_mir;
901901
(is_const_fn, needs_inline || always_encode_mir)
902902
}
903-
// Closures can't be const fn.
904-
DefKind::Closure => {
905-
let generics = tcx.generics_of(def_id);
906-
let needs_inline = (generics.requires_monomorphization(tcx)
907-
|| tcx.codegen_fn_attrs(def_id).requests_inline())
908-
&& tcx.sess.opts.output_types.should_codegen();
909-
let always_encode_mir = tcx.sess.opts.unstable_opts.always_encode_mir;
910-
(false, needs_inline || always_encode_mir)
911-
}
912903
// Generators require optimized MIR to compute layout.
913904
DefKind::Generator => (false, true),
914905
// The others don't have MIR.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#![crate_type = "lib"]
2+
#![feature(const_closures, const_trait_impl)]
3+
#![allow(incomplete_features)]
4+
5+
pub const fn test() {
6+
let cl = const || {};
7+
cl();
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// aux-build:closure-in-foreign-crate.rs
2+
// build-pass
3+
4+
extern crate closure_in_foreign_crate;
5+
6+
const _: () = closure_in_foreign_crate::test();
7+
8+
fn main() {}

0 commit comments

Comments
 (0)