Skip to content

Commit

Permalink
Rollup merge of #106917 - compiler-errors:const-closure-foreign, r=tm…
Browse files Browse the repository at this point in the history
…iasko

Encode const mir for closures if they're const

Fixes #106913
  • Loading branch information
compiler-errors authored Jan 18, 2023
2 parents 685c773 + 3a4fdcf commit a637e2a
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 11 deletions.
13 changes: 2 additions & 11 deletions compiler/rustc_metadata/src/rmeta/encoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -888,8 +888,8 @@ fn should_encode_mir(tcx: TyCtxt<'_>, def_id: LocalDefId) -> (bool, bool) {
| DefKind::AssocConst
| DefKind::Static(..)
| DefKind::Const => (true, false),
// Full-fledged functions
DefKind::AssocFn | DefKind::Fn => {
// Full-fledged functions + closures
DefKind::AssocFn | DefKind::Fn | DefKind::Closure => {
let generics = tcx.generics_of(def_id);
let needs_inline = (generics.requires_monomorphization(tcx)
|| tcx.codegen_fn_attrs(def_id).requests_inline())
Expand All @@ -900,15 +900,6 @@ fn should_encode_mir(tcx: TyCtxt<'_>, def_id: LocalDefId) -> (bool, bool) {
let always_encode_mir = tcx.sess.opts.unstable_opts.always_encode_mir;
(is_const_fn, needs_inline || always_encode_mir)
}
// Closures can't be const fn.
DefKind::Closure => {
let generics = tcx.generics_of(def_id);
let needs_inline = (generics.requires_monomorphization(tcx)
|| tcx.codegen_fn_attrs(def_id).requests_inline())
&& tcx.sess.opts.output_types.should_codegen();
let always_encode_mir = tcx.sess.opts.unstable_opts.always_encode_mir;
(false, needs_inline || always_encode_mir)
}
// Generators require optimized MIR to compute layout.
DefKind::Generator => (false, true),
// The others don't have MIR.
Expand Down
8 changes: 8 additions & 0 deletions tests/ui/consts/auxiliary/closure-in-foreign-crate.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#![crate_type = "lib"]
#![feature(const_closures, const_trait_impl)]
#![allow(incomplete_features)]

pub const fn test() {
let cl = const || {};
cl();
}
8 changes: 8 additions & 0 deletions tests/ui/consts/closure-in-foreign-crate.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// aux-build:closure-in-foreign-crate.rs
// build-pass

extern crate closure_in_foreign_crate;

const _: () = closure_in_foreign_crate::test();

fn main() {}

0 comments on commit a637e2a

Please sign in to comment.