diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-01-15 11:28:28 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-01-15 11:28:28 +0100 |
| commit | 539175c026c70e32150ca8c5ed2e0bacd3bb12e6 (patch) | |
| tree | ff0a003ba0175b321403bff0885636893e33b818 | |
| parent | 784e4ba9a4bcbda44021c6ca8345819c91b45066 (diff) | |
| parent | b9a3c32f31d4aff6988c678036c563c4b425f0bc (diff) | |
| download | rust-539175c026c70e32150ca8c5ed2e0bacd3bb12e6.tar.gz rust-539175c026c70e32150ca8c5ed2e0bacd3bb12e6.zip | |
Rollup merge of #92892 - compiler-errors:const-param-env-for-const-block, r=fee1-dead
Do not fail evaluation in const blocks Evaluate const blocks with a const param-env, so we properly check `~const` trait bounds. Fixes #92713 (I will fix the poor diagnostics in #92713 and #92712 in a separate PR) cc `@nbdd0121` who wrote the code this PR touches in #89561
| -rw-r--r-- | compiler/rustc_typeck/src/check/expr.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/consts/const-block-const-bound.rs | 17 | ||||
| -rw-r--r-- | src/test/ui/consts/const-block-const-bound.stderr | 21 |
3 files changed, 39 insertions, 1 deletions
diff --git a/compiler/rustc_typeck/src/check/expr.rs b/compiler/rustc_typeck/src/check/expr.rs index 14180526d84..faf3ef1e543 100644 --- a/compiler/rustc_typeck/src/check/expr.rs +++ b/compiler/rustc_typeck/src/check/expr.rs @@ -1226,7 +1226,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let body = self.tcx.hir().body(anon_const.body); // Create a new function context. - let fcx = FnCtxt::new(self, self.param_env, body.value.hir_id); + let fcx = FnCtxt::new(self, self.param_env.with_const(), body.value.hir_id); crate::check::GatherLocalsVisitor::new(&fcx).visit_body(body); let ty = fcx.check_expr_with_expectation(&body.value, expected); diff --git a/src/test/ui/consts/const-block-const-bound.rs b/src/test/ui/consts/const-block-const-bound.rs new file mode 100644 index 00000000000..3bfc759a9ae --- /dev/null +++ b/src/test/ui/consts/const-block-const-bound.rs @@ -0,0 +1,17 @@ +#![allow(unused)] +#![feature(const_fn_trait_bound, const_trait_impl, inline_const)] + +const fn f<T: ~const Drop>(x: T) {} + +struct UnconstDrop; + +impl Drop for UnconstDrop { + fn drop(&mut self) {} +} + +fn main() { + const { + f(UnconstDrop); + //~^ ERROR the trait bound `UnconstDrop: Drop` is not satisfied + } +} diff --git a/src/test/ui/consts/const-block-const-bound.stderr b/src/test/ui/consts/const-block-const-bound.stderr new file mode 100644 index 00000000000..0e6e426e7c2 --- /dev/null +++ b/src/test/ui/consts/const-block-const-bound.stderr @@ -0,0 +1,21 @@ +error[E0277]: the trait bound `UnconstDrop: Drop` is not satisfied + --> $DIR/const-block-const-bound.rs:14:11 + | +LL | f(UnconstDrop); + | - ^^^^^^^^^^^ the trait `Drop` is not implemented for `UnconstDrop` + | | + | required by a bound introduced by this call + | +note: required by a bound in `f` + --> $DIR/const-block-const-bound.rs:4:15 + | +LL | const fn f<T: ~const Drop>(x: T) {} + | ^^^^^^^^^^^ required by this bound in `f` +help: consider introducing a `where` bound, but there might be an alternative better way to express this requirement + | +LL | fn main() where UnconstDrop: Drop { + | +++++++++++++++++++++++ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. |
