Rollup merge of #106917 - compiler-errors:const-closure-foreign, r=tmiasko
Encode const mir for closures if they're const Fixes #106913
This commit is contained in:
commit
a637e2a950
@ -888,8 +888,8 @@ fn should_encode_mir(tcx: TyCtxt<'_>, def_id: LocalDefId) -> (bool, bool) {
|
|||||||
| DefKind::AssocConst
|
| DefKind::AssocConst
|
||||||
| DefKind::Static(..)
|
| DefKind::Static(..)
|
||||||
| DefKind::Const => (true, false),
|
| DefKind::Const => (true, false),
|
||||||
// Full-fledged functions
|
// Full-fledged functions + closures
|
||||||
DefKind::AssocFn | DefKind::Fn => {
|
DefKind::AssocFn | DefKind::Fn | DefKind::Closure => {
|
||||||
let generics = tcx.generics_of(def_id);
|
let generics = tcx.generics_of(def_id);
|
||||||
let needs_inline = (generics.requires_monomorphization(tcx)
|
let needs_inline = (generics.requires_monomorphization(tcx)
|
||||||
|| tcx.codegen_fn_attrs(def_id).requests_inline())
|
|| tcx.codegen_fn_attrs(def_id).requests_inline())
|
||||||
@ -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;
|
let always_encode_mir = tcx.sess.opts.unstable_opts.always_encode_mir;
|
||||||
(is_const_fn, needs_inline || 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.
|
// Generators require optimized MIR to compute layout.
|
||||||
DefKind::Generator => (false, true),
|
DefKind::Generator => (false, true),
|
||||||
// The others don't have MIR.
|
// The others don't have MIR.
|
||||||
|
8
tests/ui/consts/auxiliary/closure-in-foreign-crate.rs
Normal file
8
tests/ui/consts/auxiliary/closure-in-foreign-crate.rs
Normal file
@ -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
tests/ui/consts/closure-in-foreign-crate.rs
Normal file
8
tests/ui/consts/closure-in-foreign-crate.rs
Normal file
@ -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() {}
|
Loading…
x
Reference in New Issue
Block a user