Rollup merge of #130972 - RalfJung:const_cell_into_inner, r=dtolnay
stabilize const_cell_into_inner This const-stabilizes - `UnsafeCell::into_inner` - `Cell::into_inner` - `RefCell::into_inner` - `OnceCell::into_inner` `@rust-lang/wg-const-eval` this uses `rustc_allow_const_fn_unstable(const_precise_live_drops)`, so we'd be comitting to always finding *some* way to accept this code. IMO that's fine -- what these functions do is to move out the only field of a struct, and that struct has no destructor itself. The field's destructor does not get run as it gets returned to the caller. `@rust-lang/libs-api` this was FCP'd already [years ago](https://github.com/rust-lang/rust/issues/78729#issuecomment-811409860), except that `OnceCell::into_inner` was added to the same feature gate since then (Cc `@tgross35).` Does that mean we have to re-run the FCP? If yes, I'd honestly prefer to move `OnceCell` into its own feature gate to not risk missing the next release. (That's why it's not great to add new functions to an already FCP'd feature gate.) OTOH if this needs an FCP either way since the previous FCP was so long ago, then we might as well do it all at once.
This commit is contained in:
commit
a061e566a6
@ -82,19 +82,6 @@ index d9de37e..8293fce 100644
|
||||
#[cfg(target_has_atomic_load_store = "ptr")]
|
||||
macro_rules! atomic_int_ptr_sized {
|
||||
( $($target_pointer_width:literal $align:literal)* ) => { $(
|
||||
diff --git a/library/core/src/cell.rs b/library/core/src/cell.rs
|
||||
index 58b9ba4..91bbd0a 100644
|
||||
--- a/library/core/src/cell.rs
|
||||
+++ b/library/core/src/cell.rs
|
||||
@@ -2246,8 +2246,6 @@ unsafe_cell_primitive_into_inner! {
|
||||
u32 "32"
|
||||
i64 "64"
|
||||
u64 "64"
|
||||
- i128 "128"
|
||||
- u128 "128"
|
||||
isize "ptr"
|
||||
usize "ptr"
|
||||
}
|
||||
--
|
||||
2.26.2.7.g19db9cfb68
|
||||
|
||||
|
@ -514,7 +514,8 @@ pub fn replace(&self, val: T) -> T {
|
||||
/// assert_eq!(five, 5);
|
||||
/// ```
|
||||
#[stable(feature = "move_cell", since = "1.17.0")]
|
||||
#[rustc_const_unstable(feature = "const_cell_into_inner", issue = "78729")]
|
||||
#[rustc_const_stable(feature = "const_cell_into_inner", since = "CURRENT_RUSTC_VERSION")]
|
||||
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
||||
pub const fn into_inner(self) -> T {
|
||||
self.value.into_inner()
|
||||
}
|
||||
@ -857,7 +858,8 @@ pub const fn new(value: T) -> RefCell<T> {
|
||||
/// let five = c.into_inner();
|
||||
/// ```
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "const_cell_into_inner", issue = "78729")]
|
||||
#[rustc_const_stable(feature = "const_cell_into_inner", since = "CURRENT_RUSTC_VERSION")]
|
||||
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
||||
#[inline]
|
||||
pub const fn into_inner(self) -> T {
|
||||
// Since this function takes `self` (the `RefCell`) by value, the
|
||||
@ -2100,8 +2102,8 @@ pub const fn new(value: T) -> UnsafeCell<T> {
|
||||
/// ```
|
||||
#[inline(always)]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
// When this is const stabilized, please remove `primitive_into_inner` below.
|
||||
#[rustc_const_unstable(feature = "const_cell_into_inner", issue = "78729")]
|
||||
#[rustc_const_stable(feature = "const_cell_into_inner", since = "CURRENT_RUSTC_VERSION")]
|
||||
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
||||
pub const fn into_inner(self) -> T {
|
||||
self.value
|
||||
}
|
||||
@ -2247,47 +2249,6 @@ impl<T: CoerceUnsized<U>, U> CoerceUnsized<UnsafeCell<U>> for UnsafeCell<T> {}
|
||||
#[unstable(feature = "dispatch_from_dyn", issue = "none")]
|
||||
impl<T: DispatchFromDyn<U>, U> DispatchFromDyn<UnsafeCell<U>> for UnsafeCell<T> {}
|
||||
|
||||
// Special cases of UnsafeCell::into_inner where T is a primitive. These are
|
||||
// used by Atomic*::into_inner.
|
||||
//
|
||||
// The real UnsafeCell::into_inner cannot be used yet in a stable const function.
|
||||
// That is blocked on a "precise drop analysis" unstable const feature.
|
||||
// https://github.com/rust-lang/rust/issues/73255
|
||||
macro_rules! unsafe_cell_primitive_into_inner {
|
||||
($($primitive:ident $atomic:literal)*) => {
|
||||
$(
|
||||
#[cfg(target_has_atomic_load_store = $atomic)]
|
||||
impl UnsafeCell<$primitive> {
|
||||
pub(crate) const fn primitive_into_inner(self) -> $primitive {
|
||||
self.value
|
||||
}
|
||||
}
|
||||
)*
|
||||
};
|
||||
}
|
||||
|
||||
unsafe_cell_primitive_into_inner! {
|
||||
i8 "8"
|
||||
u8 "8"
|
||||
i16 "16"
|
||||
u16 "16"
|
||||
i32 "32"
|
||||
u32 "32"
|
||||
i64 "64"
|
||||
u64 "64"
|
||||
i128 "128"
|
||||
u128 "128"
|
||||
isize "ptr"
|
||||
usize "ptr"
|
||||
}
|
||||
|
||||
#[cfg(target_has_atomic_load_store = "ptr")]
|
||||
impl<T> UnsafeCell<*mut T> {
|
||||
pub(crate) const fn primitive_into_inner(self) -> *mut T {
|
||||
self.value
|
||||
}
|
||||
}
|
||||
|
||||
/// [`UnsafeCell`], but [`Sync`].
|
||||
///
|
||||
/// This is just an `UnsafeCell`, except it implements `Sync`
|
||||
|
@ -309,7 +309,8 @@ fn try_init<F, E>(&self, f: F) -> Result<&T, E>
|
||||
/// ```
|
||||
#[inline]
|
||||
#[stable(feature = "once_cell", since = "1.70.0")]
|
||||
#[rustc_const_unstable(feature = "const_cell_into_inner", issue = "78729")]
|
||||
#[rustc_const_stable(feature = "const_cell_into_inner", since = "CURRENT_RUSTC_VERSION")]
|
||||
#[rustc_allow_const_fn_unstable(const_precise_live_drops)]
|
||||
pub const fn into_inner(self) -> Option<T> {
|
||||
// Because `into_inner` takes `self` by value, the compiler statically verifies
|
||||
// that it is not currently borrowed. So it is safe to move out `Option<T>`.
|
||||
|
@ -118,7 +118,6 @@
|
||||
#![feature(const_array_into_iter_constructors)]
|
||||
#![feature(const_bigint_helper_methods)]
|
||||
#![feature(const_black_box)]
|
||||
#![feature(const_cell_into_inner)]
|
||||
#![feature(const_char_encode_utf16)]
|
||||
#![feature(const_char_encode_utf8)]
|
||||
#![feature(const_eval_select)]
|
||||
|
@ -596,7 +596,7 @@ pub fn from_mut_slice(v: &mut [bool]) -> &mut [Self] {
|
||||
#[stable(feature = "atomic_access", since = "1.15.0")]
|
||||
#[rustc_const_stable(feature = "const_atomic_into_inner", since = "1.79.0")]
|
||||
pub const fn into_inner(self) -> bool {
|
||||
self.v.primitive_into_inner() != 0
|
||||
self.v.into_inner() != 0
|
||||
}
|
||||
|
||||
/// Loads a value from the bool.
|
||||
@ -1413,7 +1413,7 @@ pub fn from_mut_slice(v: &mut [*mut T]) -> &mut [Self] {
|
||||
#[stable(feature = "atomic_access", since = "1.15.0")]
|
||||
#[rustc_const_stable(feature = "const_atomic_into_inner", since = "1.79.0")]
|
||||
pub const fn into_inner(self) -> *mut T {
|
||||
self.p.primitive_into_inner()
|
||||
self.p.into_inner()
|
||||
}
|
||||
|
||||
/// Loads a value from the pointer.
|
||||
@ -2408,7 +2408,7 @@ pub fn from_mut_slice(v: &mut [$int_type]) -> &mut [Self] {
|
||||
#[$stable_access]
|
||||
#[rustc_const_stable(feature = "const_atomic_into_inner", since = "1.79.0")]
|
||||
pub const fn into_inner(self) -> $int_type {
|
||||
self.v.primitive_into_inner()
|
||||
self.v.into_inner()
|
||||
}
|
||||
|
||||
/// Loads a value from the atomic integer.
|
||||
|
@ -18,7 +18,6 @@
|
||||
#![feature(const_align_offset)]
|
||||
#![feature(const_array_from_ref)]
|
||||
#![feature(const_black_box)]
|
||||
#![feature(const_cell_into_inner)]
|
||||
#![feature(const_hash)]
|
||||
#![feature(const_heap)]
|
||||
#![feature(const_ip)]
|
||||
|
Loading…
Reference in New Issue
Block a user