Forbid implementing Freeze
even if the trait is stabilized
This commit is contained in:
parent
f030d49536
commit
7849230740
@ -8,6 +8,7 @@
|
||||
rustc_attrs,
|
||||
transparent_unions,
|
||||
auto_traits,
|
||||
freeze_impls,
|
||||
thread_local
|
||||
)]
|
||||
#![no_core]
|
||||
|
@ -1,6 +1,6 @@
|
||||
#![feature(
|
||||
no_core, lang_items, intrinsics, unboxed_closures, type_ascription, extern_types,
|
||||
decl_macro, rustc_attrs, transparent_unions, auto_traits,
|
||||
decl_macro, rustc_attrs, transparent_unions, auto_traits, freeze_impls,
|
||||
thread_local
|
||||
)]
|
||||
#![no_core]
|
||||
|
@ -469,6 +469,8 @@ pub fn internal(&self, feature: Symbol) -> bool {
|
||||
(unstable, fn_align, "1.53.0", Some(82232)),
|
||||
/// Support delegating implementation of functions to other already implemented functions.
|
||||
(incomplete, fn_delegation, "1.76.0", Some(118212)),
|
||||
/// Allows impls for the Freeze trait.
|
||||
(internal, freeze_impls, "CURRENT_RUSTC_VERSION", Some(121675)),
|
||||
/// Allows defining gen blocks and `gen fn`.
|
||||
(unstable, gen_blocks, "1.75.0", Some(117078)),
|
||||
/// Infer generic args for both consts and types.
|
||||
|
@ -10,6 +10,7 @@
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_middle::query::Providers;
|
||||
use rustc_middle::ty::{self, TyCtxt, TypeVisitableExt};
|
||||
use rustc_session::parse::feature_err;
|
||||
use rustc_span::{sym, ErrorGuaranteed};
|
||||
use rustc_trait_selection::traits;
|
||||
|
||||
@ -49,6 +50,19 @@ fn enforce_trait_manually_implementable(
|
||||
) -> Result<(), ErrorGuaranteed> {
|
||||
let impl_header_span = tcx.def_span(impl_def_id);
|
||||
|
||||
if tcx.lang_items().freeze_trait() == Some(trait_def_id) {
|
||||
if !tcx.features().freeze_impls {
|
||||
feature_err(
|
||||
&tcx.sess,
|
||||
sym::freeze_impls,
|
||||
impl_header_span,
|
||||
"explicit impls for the `Freeze` trait are not permitted",
|
||||
)
|
||||
.with_span_label(impl_header_span, format!("impl of `Freeze` not allowed"))
|
||||
.emit();
|
||||
}
|
||||
}
|
||||
|
||||
// Disallow *all* explicit impls of traits marked `#[rustc_deny_explicit_impl]`
|
||||
if trait_def.deny_explicit_impl {
|
||||
let trait_name = tcx.item_name(trait_def_id);
|
||||
|
@ -841,6 +841,7 @@
|
||||
format_placeholder,
|
||||
format_unsafe_arg,
|
||||
freeze,
|
||||
freeze_impls,
|
||||
freg,
|
||||
frem_algebraic,
|
||||
frem_fast,
|
||||
|
@ -203,6 +203,7 @@
|
||||
// Language features:
|
||||
// tidy-alphabetical-start
|
||||
#![cfg_attr(bootstrap, feature(platform_intrinsics))]
|
||||
#![cfg_attr(not(bootstrap), feature(freeze_impls))]
|
||||
#![feature(abi_unadjusted)]
|
||||
#![feature(adt_const_params)]
|
||||
#![feature(allow_internal_unsafe)]
|
||||
|
@ -818,13 +818,13 @@ pub trait DiscriminantKind {
|
||||
/// will not contain interior mutability, and subsequently allow
|
||||
/// placing the constant behind references.
|
||||
#[lang = "freeze"]
|
||||
#[unstable(feature = "freeze", issue = "60715")]
|
||||
#[unstable(feature = "freeze", issue = "121675")]
|
||||
pub unsafe auto trait Freeze {}
|
||||
|
||||
#[unstable(feature = "freeze", issue = "60715")]
|
||||
#[unstable(feature = "freeze", issue = "121675")]
|
||||
impl<T: ?Sized> !Freeze for UnsafeCell<T> {}
|
||||
marker_impls! {
|
||||
#[unstable(feature = "freeze", issue = "60715")]
|
||||
#[unstable(feature = "freeze", issue = "121675")]
|
||||
unsafe Freeze for
|
||||
{T: ?Sized} PhantomData<T>,
|
||||
{T: ?Sized} *const T,
|
||||
|
@ -1,4 +1,4 @@
|
||||
#![feature(no_core, lang_items)]
|
||||
#![feature(no_core, lang_items, freeze_impls)]
|
||||
#![crate_type = "rlib"]
|
||||
#![no_core]
|
||||
|
||||
|
15
tests/ui/feature-gates/feature-gate-freeze-impls.rs
Normal file
15
tests/ui/feature-gates/feature-gate-freeze-impls.rs
Normal file
@ -0,0 +1,15 @@
|
||||
#![feature(freeze, negative_impls)]
|
||||
|
||||
use std::marker::Freeze;
|
||||
|
||||
struct Foo;
|
||||
|
||||
unsafe impl Freeze for Foo {}
|
||||
//~^ explicit impls for the `Freeze` trait are not permitted
|
||||
|
||||
struct Bar;
|
||||
|
||||
impl !Freeze for Bar {}
|
||||
//~^ explicit impls for the `Freeze` trait are not permitted
|
||||
|
||||
fn main() {}
|
23
tests/ui/feature-gates/feature-gate-freeze-impls.stderr
Normal file
23
tests/ui/feature-gates/feature-gate-freeze-impls.stderr
Normal file
@ -0,0 +1,23 @@
|
||||
error[E0658]: explicit impls for the `Freeze` trait are not permitted
|
||||
--> $DIR/feature-gate-freeze-impls.rs:7:1
|
||||
|
|
||||
LL | unsafe impl Freeze for Foo {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ impl of `Freeze` not allowed
|
||||
|
|
||||
= note: see issue #121675 <https://github.com/rust-lang/rust/issues/121675> for more information
|
||||
= help: add `#![feature(freeze_impls)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
|
||||
error[E0658]: explicit impls for the `Freeze` trait are not permitted
|
||||
--> $DIR/feature-gate-freeze-impls.rs:12:1
|
||||
|
|
||||
LL | impl !Freeze for Bar {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^ impl of `Freeze` not allowed
|
||||
|
|
||||
= note: see issue #121675 <https://github.com/rust-lang/rust/issues/121675> for more information
|
||||
= help: add `#![feature(freeze_impls)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
Loading…
Reference in New Issue
Block a user