diff --git a/compiler/rustc_middle/src/hir/map.rs b/compiler/rustc_middle/src/hir/map.rs index 37273928d7d1f..bda9b3a47849e 100644 --- a/compiler/rustc_middle/src/hir/map.rs +++ b/compiler/rustc_middle/src/hir/map.rs @@ -317,11 +317,9 @@ impl<'tcx> TyCtxt<'tcx> { BodyOwnerKind::Static(mutability) => ConstContext::Static(mutability), BodyOwnerKind::Fn if self.is_constructor(def_id) => return None, - // Const closures use their parent's const context - BodyOwnerKind::Closure if self.is_const_fn(def_id) => { - return self.hir_body_const_context(self.local_parent(local_def_id)); + BodyOwnerKind::Fn | BodyOwnerKind::Closure if self.is_const_fn(def_id) => { + ConstContext::ConstFn } - BodyOwnerKind::Fn if self.is_const_fn(def_id) => ConstContext::ConstFn, BodyOwnerKind::Fn | BodyOwnerKind::Closure | BodyOwnerKind::GlobalAsm => return None, }; diff --git a/tests/ui/traits/const-traits/call-const-closure.next.stderr b/tests/ui/traits/const-traits/call-const-closure.next.stderr index 16b936d58aaf6..9a851a97f186a 100644 --- a/tests/ui/traits/const-traits/call-const-closure.next.stderr +++ b/tests/ui/traits/const-traits/call-const-closure.next.stderr @@ -1,4 +1,4 @@ -error[E0277]: the trait bound `(): const Bar` is not satisfied +error[E0277]: the trait bound `(): [const] Bar` is not satisfied --> $DIR/call-const-closure.rs:16:18 | LL | (const || ().foo())(); diff --git a/tests/ui/traits/const-traits/call-const-closure.old.stderr b/tests/ui/traits/const-traits/call-const-closure.old.stderr index 16b936d58aaf6..9a851a97f186a 100644 --- a/tests/ui/traits/const-traits/call-const-closure.old.stderr +++ b/tests/ui/traits/const-traits/call-const-closure.old.stderr @@ -1,4 +1,4 @@ -error[E0277]: the trait bound `(): const Bar` is not satisfied +error[E0277]: the trait bound `(): [const] Bar` is not satisfied --> $DIR/call-const-closure.rs:16:18 | LL | (const || ().foo())(); diff --git a/tests/ui/traits/const-traits/call-const-closure.rs b/tests/ui/traits/const-traits/call-const-closure.rs index 2cf561ae6db14..5a5369a075358 100644 --- a/tests/ui/traits/const-traits/call-const-closure.rs +++ b/tests/ui/traits/const-traits/call-const-closure.rs @@ -14,7 +14,7 @@ impl Bar for () { const FOO: () = { (const || ().foo())(); - //~^ ERROR the trait bound `(): const Bar` is not satisfied + //~^ ERROR the trait bound `(): [const] Bar` is not satisfied }; fn main() {} diff --git a/tests/ui/traits/const-traits/const-closure-fn-ptr-const-item.rs b/tests/ui/traits/const-traits/const-closure-fn-ptr-const-item.rs new file mode 100644 index 0000000000000..1c24112883708 --- /dev/null +++ b/tests/ui/traits/const-traits/const-closure-fn-ptr-const-item.rs @@ -0,0 +1,11 @@ +//@ run-pass + +// Regression test for https://github.com/rust-lang/rust/issues/155803 + +#![feature(const_closures, const_trait_impl)] + +const F: fn() -> i32 = const || 42; + +fn main() { + assert_eq!(F(), 42); +} diff --git a/tests/ui/traits/const-traits/const-closure-link-dead-code.rs b/tests/ui/traits/const-traits/const-closure-link-dead-code.rs new file mode 100644 index 0000000000000..b28234c355eec --- /dev/null +++ b/tests/ui/traits/const-traits/const-closure-link-dead-code.rs @@ -0,0 +1,12 @@ +//@ build-pass +//@ compile-flags: -Clink-dead-code=true + +// Regression test for https://github.com/rust-lang/rust/issues/155803 + +#![feature(const_closures, const_trait_impl)] + +const _: () = { + assert!((const || true)()); +}; + +fn main() {}