From fbfaab2cb745e98ab0f01631803319fd4cce2709 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 18 Apr 2021 19:02:33 +0200 Subject: [PATCH] separate feature flag for unsizing casts in const fn --- compiler/rustc_feature/src/active.rs | 3 ++ .../src/transform/check_consts/ops.rs | 31 ++++++------------- compiler/rustc_span/src/symbol.rs | 1 + library/alloc/src/lib.rs | 2 +- library/core/src/lib.rs | 2 +- .../consts/min_const_fn/min_const_fn.stderr | 20 ++++++------ .../min_const_fn/min_const_fn_dyn.stderr | 9 +++--- .../ui/consts/unsizing-cast-non-null.stderr | 8 ++--- 8 files changed, 33 insertions(+), 43 deletions(-) diff --git a/compiler/rustc_feature/src/active.rs b/compiler/rustc_feature/src/active.rs index d04c89aa13c23..590d16e9a5de7 100644 --- a/compiler/rustc_feature/src/active.rs +++ b/compiler/rustc_feature/src/active.rs @@ -579,6 +579,9 @@ declare_features! ( /// Allows trait bounds in `const fn`. (active, const_fn_trait_bound, "1.53.0", Some(57563), None), + /// Allows unsizing coercions in `const fn`. + (active, const_fn_unsize, "1.53.0", Some(64992), None), + /// Allows to use the `#[cmse_nonsecure_entry]` attribute. (active, cmse_nonsecure_entry, "1.48.0", Some(75835), None), diff --git a/compiler/rustc_mir/src/transform/check_consts/ops.rs b/compiler/rustc_mir/src/transform/check_consts/ops.rs index c215ae11cf8d8..0aa342f0efb8a 100644 --- a/compiler/rustc_mir/src/transform/check_consts/ops.rs +++ b/compiler/rustc_mir/src/transform/check_consts/ops.rs @@ -540,14 +540,19 @@ impl NonConstOp for UnionAccess { pub struct UnsizingCast; impl NonConstOp for UnsizingCast { fn status_in_item(&self, ccx: &ConstCx<'_, '_>) -> Status { - mcf_status_in_item(ccx) + if ccx.const_kind() != hir::ConstContext::ConstFn { + Status::Allowed + } else { + Status::Unstable(sym::const_fn_unsize) + } } fn build_error(&self, ccx: &ConstCx<'_, 'tcx>, span: Span) -> DiagnosticBuilder<'tcx> { - mcf_build_error( - ccx, + feature_err( + &ccx.tcx.sess.parse_sess, + sym::const_fn_unsize, span, - "unsizing casts to types besides slices are not allowed in const fn", + "unsizing casts to types besides slices are not allowed in const fn" ) } } @@ -677,21 +682,3 @@ pub mod ty { } } } - -fn mcf_status_in_item(ccx: &ConstCx<'_, '_>) -> Status { - if ccx.const_kind() != hir::ConstContext::ConstFn { - Status::Allowed - } else { - Status::Unstable(sym::const_fn) - } -} - -fn mcf_build_error(ccx: &ConstCx<'_, 'tcx>, span: Span, msg: &str) -> DiagnosticBuilder<'tcx> { - let mut err = struct_span_err!(ccx.tcx.sess, span, E0723, "{}", msg); - err.note( - "see issue #57563 \ - for more information", - ); - err.help("add `#![feature(const_fn)]` to the crate attributes to enable"); - err -} diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs index 6acf77a8e6ed8..6456e96fa6a11 100644 --- a/compiler/rustc_span/src/symbol.rs +++ b/compiler/rustc_span/src/symbol.rs @@ -385,6 +385,7 @@ symbols! { const_fn_trait_bound, const_fn_transmute, const_fn_union, + const_fn_unsize, const_generic_defaults, const_generics, const_generics_defaults, diff --git a/library/alloc/src/lib.rs b/library/alloc/src/lib.rs index 70ff78d564e0b..3a5dcec668ff6 100644 --- a/library/alloc/src/lib.rs +++ b/library/alloc/src/lib.rs @@ -89,7 +89,7 @@ #![feature(cfg_target_has_atomic)] #![feature(coerce_unsized)] #![feature(const_btree_new)] -#![feature(const_fn)] +#![cfg_attr(bootstrap, feature(const_fn))] #![cfg_attr(not(bootstrap), feature(const_fn_trait_bound))] #![feature(cow_is_borrowed)] #![feature(const_cow_is_borrowed)] diff --git a/library/core/src/lib.rs b/library/core/src/lib.rs index 495edc70f38de..af06ea00f19b5 100644 --- a/library/core/src/lib.rs +++ b/library/core/src/lib.rs @@ -81,7 +81,7 @@ #![feature(const_refs_to_cell)] #![feature(const_panic)] #![feature(const_pin)] -#![feature(const_fn)] +#![cfg_attr(bootstrap, feature(const_fn))] #![feature(const_fn_union)] #![feature(const_impl_trait)] #![feature(const_fn_floating_point_arithmetic)] diff --git a/src/test/ui/consts/min_const_fn/min_const_fn.stderr b/src/test/ui/consts/min_const_fn/min_const_fn.stderr index b629955eb2bfe..e6ce7e12520f5 100644 --- a/src/test/ui/consts/min_const_fn/min_const_fn.stderr +++ b/src/test/ui/consts/min_const_fn/min_const_fn.stderr @@ -288,32 +288,32 @@ LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() } = note: see issue #57563 for more information = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable -error[E0723]: unsizing casts to types besides slices are not allowed in const fn +error[E0658]: unsizing casts to types besides slices are not allowed in const fn --> $DIR/min_const_fn.rs:134:63 | LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() } | ^^^ | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn)]` to the crate attributes to enable + = note: see issue #64992 for more information + = help: add `#![feature(const_fn_unsize)]` to the crate attributes to enable -error[E0723]: unsizing casts to types besides slices are not allowed in const fn +error[E0658]: unsizing casts to types besides slices are not allowed in const fn --> $DIR/min_const_fn.rs:134:63 | LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() } | ^^^ | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn)]` to the crate attributes to enable + = note: see issue #64992 for more information + = help: add `#![feature(const_fn_unsize)]` to the crate attributes to enable -error[E0723]: unsizing casts to types besides slices are not allowed in const fn +error[E0658]: unsizing casts to types besides slices are not allowed in const fn --> $DIR/min_const_fn.rs:141:42 | LL | const fn really_no_traits_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1 } | ^^^ | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn)]` to the crate attributes to enable + = note: see issue #64992 for more information + = help: add `#![feature(const_fn_unsize)]` to the crate attributes to enable error[E0658]: function pointers cannot appear in constant functions --> $DIR/min_const_fn.rs:144:21 @@ -344,5 +344,5 @@ LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo } error: aborting due to 39 previous errors -Some errors have detailed explanations: E0013, E0493, E0658, E0723. +Some errors have detailed explanations: E0013, E0493, E0658. For more information about an error, try `rustc --explain E0013`. diff --git a/src/test/ui/consts/min_const_fn/min_const_fn_dyn.stderr b/src/test/ui/consts/min_const_fn/min_const_fn_dyn.stderr index 11bb82639a340..cf635d656996e 100644 --- a/src/test/ui/consts/min_const_fn/min_const_fn_dyn.stderr +++ b/src/test/ui/consts/min_const_fn/min_const_fn_dyn.stderr @@ -7,16 +7,15 @@ LL | x.0.field; = note: see issue #57563 for more information = help: add `#![feature(const_fn_trait_bound)]` to the crate attributes to enable -error[E0723]: unsizing casts to types besides slices are not allowed in const fn +error[E0658]: unsizing casts to types besides slices are not allowed in const fn --> $DIR/min_const_fn_dyn.rs:12:66 | LL | const fn no_inner_dyn_trait_ret() -> Hide { Hide(HasDyn { field: &0 }) } | ^^ | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn)]` to the crate attributes to enable + = note: see issue #64992 for more information + = help: add `#![feature(const_fn_unsize)]` to the crate attributes to enable error: aborting due to 2 previous errors -Some errors have detailed explanations: E0658, E0723. -For more information about an error, try `rustc --explain E0658`. +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/consts/unsizing-cast-non-null.stderr b/src/test/ui/consts/unsizing-cast-non-null.stderr index dc08ccd02b646..79691cddfb403 100644 --- a/src/test/ui/consts/unsizing-cast-non-null.stderr +++ b/src/test/ui/consts/unsizing-cast-non-null.stderr @@ -1,12 +1,12 @@ -error[E0723]: unsizing casts to types besides slices are not allowed in const fn +error[E0658]: unsizing casts to types besides slices are not allowed in const fn --> $DIR/unsizing-cast-non-null.rs:6:5 | LL | NonNull::<[T; 0]>::dangling() | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: see issue #57563 for more information - = help: add `#![feature(const_fn)]` to the crate attributes to enable + = note: see issue #64992 for more information + = help: add `#![feature(const_fn_unsize)]` to the crate attributes to enable error: aborting due to previous error -For more information about this error, try `rustc --explain E0723`. +For more information about this error, try `rustc --explain E0658`.