Skip to content

Commit 882d660

Browse files
Rollup merge of #131177 - workingjubilee:stabilize-const-mut-referees, r=tgross35
Stabilize 5 `const_mut_refs`-dependent API Since `const_mut_refs` and `const_refs_to_cell` have been stabilized, we now may create mutable references inside our library API. Thus we now stabilize the `const fn` version of these public library APIs which required such in their implementation: - const `NonNull::as_mut` #91822 (comment) - const `slice::{first,last}_mut`: #83570 (comment) - const `str::as_{mut_ptr,bytes_mut}`: #130086 (comment) - const `str::from_utf8_unchecked_mut`: #91005 (comment) - const `UnsafeCell::get_mut`: #88836 (comment)
2 parents 1462815 + ac53f1f commit 882d660

File tree

7 files changed

+21
-14
lines changed

7 files changed

+21
-14
lines changed

library/core/src/cell.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -2175,7 +2175,8 @@ impl<T: ?Sized> UnsafeCell<T> {
21752175
/// ```
21762176
#[inline(always)]
21772177
#[stable(feature = "unsafe_cell_get_mut", since = "1.50.0")]
2178-
#[rustc_const_unstable(feature = "const_unsafecell_get_mut", issue = "88836")]
2178+
#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
2179+
#[rustc_const_stable(feature = "const_unsafecell_get_mut", since = "CURRENT_RUSTC_VERSION")]
21792180
pub const fn get_mut(&mut self) -> &mut T {
21802181
&mut self.value
21812182
}

library/core/src/lib.rs

-4
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,6 @@
138138
#![feature(const_option_ext)]
139139
#![feature(const_pin)]
140140
#![feature(const_pointer_is_aligned)]
141-
#![feature(const_ptr_as_ref)]
142141
#![feature(const_ptr_is_null)]
143142
#![feature(const_ptr_sub_ptr)]
144143
#![feature(const_ptr_write)]
@@ -149,8 +148,6 @@
149148
#![feature(const_slice_from_raw_parts_mut)]
150149
#![feature(const_slice_from_ref)]
151150
#![feature(const_slice_split_at_mut)]
152-
#![feature(const_str_as_mut)]
153-
#![feature(const_str_from_utf8_unchecked_mut)]
154151
#![feature(const_strict_overflow_ops)]
155152
#![feature(const_swap)]
156153
#![feature(const_try)]
@@ -159,7 +156,6 @@
159156
#![feature(const_typed_swap)]
160157
#![feature(const_ub_checks)]
161158
#![feature(const_unicode_case_lookup)]
162-
#![feature(const_unsafecell_get_mut)]
163159
#![feature(coverage_attribute)]
164160
#![feature(do_not_recommend)]
165161
#![feature(duration_consts_float)]

library/core/src/ptr/non_null.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,8 @@ impl<T: ?Sized> NonNull<T> {
394394
///
395395
/// [the module documentation]: crate::ptr#safety
396396
#[stable(feature = "nonnull", since = "1.25.0")]
397-
#[rustc_const_unstable(feature = "const_ptr_as_ref", issue = "91822")]
397+
#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
398+
#[rustc_const_stable(feature = "const_ptr_as_ref", since = "CURRENT_RUSTC_VERSION")]
398399
#[must_use]
399400
#[inline(always)]
400401
pub const unsafe fn as_mut<'a>(&mut self) -> &'a mut T {

library/core/src/slice/mod.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,8 @@ impl<T> [T] {
171171
/// assert_eq!(None, y.first_mut());
172172
/// ```
173173
#[stable(feature = "rust1", since = "1.0.0")]
174-
#[rustc_const_unstable(feature = "const_slice_first_last", issue = "83570")]
174+
#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
175+
#[rustc_const_stable(feature = "const_slice_first_last", since = "CURRENT_RUSTC_VERSION")]
175176
#[inline]
176177
#[must_use]
177178
pub const fn first_mut(&mut self) -> Option<&mut T> {
@@ -213,7 +214,8 @@ impl<T> [T] {
213214
/// assert_eq!(x, &[3, 4, 5]);
214215
/// ```
215216
#[stable(feature = "slice_splits", since = "1.5.0")]
216-
#[rustc_const_unstable(feature = "const_slice_first_last", issue = "83570")]
217+
#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
218+
#[rustc_const_stable(feature = "const_slice_first_last", since = "CURRENT_RUSTC_VERSION")]
217219
#[inline]
218220
#[must_use]
219221
pub const fn split_first_mut(&mut self) -> Option<(&mut T, &mut [T])> {
@@ -255,7 +257,8 @@ impl<T> [T] {
255257
/// assert_eq!(x, &[4, 5, 3]);
256258
/// ```
257259
#[stable(feature = "slice_splits", since = "1.5.0")]
258-
#[rustc_const_unstable(feature = "const_slice_first_last", issue = "83570")]
260+
#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
261+
#[rustc_const_stable(feature = "const_slice_first_last", since = "CURRENT_RUSTC_VERSION")]
259262
#[inline]
260263
#[must_use]
261264
pub const fn split_last_mut(&mut self) -> Option<(&mut T, &mut [T])> {
@@ -297,7 +300,8 @@ impl<T> [T] {
297300
/// assert_eq!(None, y.last_mut());
298301
/// ```
299302
#[stable(feature = "rust1", since = "1.0.0")]
300-
#[rustc_const_unstable(feature = "const_slice_first_last", issue = "83570")]
303+
#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
304+
#[rustc_const_stable(feature = "const_slice_first_last", since = "CURRENT_RUSTC_VERSION")]
301305
#[inline]
302306
#[must_use]
303307
pub const fn last_mut(&mut self) -> Option<&mut T> {

library/core/src/str/converts.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,11 @@ pub const unsafe fn from_utf8_unchecked(v: &[u8]) -> &str {
195195
#[inline]
196196
#[must_use]
197197
#[stable(feature = "str_mut_extras", since = "1.20.0")]
198-
#[rustc_const_unstable(feature = "const_str_from_utf8_unchecked_mut", issue = "91005")]
198+
#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
199+
#[rustc_const_stable(
200+
feature = "const_str_from_utf8_unchecked_mut",
201+
since = "CURRENT_RUSTC_VERSION"
202+
)]
199203
#[rustc_diagnostic_item = "str_from_utf8_unchecked_mut"]
200204
pub const unsafe fn from_utf8_unchecked_mut(v: &mut [u8]) -> &mut str {
201205
// SAFETY: the caller must guarantee that the bytes `v`

library/core/src/str/mod.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,8 @@ impl str {
339339
/// assert_eq!("🍔∈🌏", s);
340340
/// ```
341341
#[stable(feature = "str_mut_extras", since = "1.20.0")]
342-
#[rustc_const_unstable(feature = "const_str_as_mut", issue = "130086")]
342+
#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
343+
#[rustc_const_stable(feature = "const_str_as_mut", since = "CURRENT_RUSTC_VERSION")]
343344
#[must_use]
344345
#[inline(always)]
345346
pub const unsafe fn as_bytes_mut(&mut self) -> &mut [u8] {
@@ -385,7 +386,8 @@ impl str {
385386
/// It is your responsibility to make sure that the string slice only gets
386387
/// modified in a way that it remains valid UTF-8.
387388
#[stable(feature = "str_as_mut_ptr", since = "1.36.0")]
388-
#[rustc_const_unstable(feature = "const_str_as_mut", issue = "130086")]
389+
#[cfg_attr(bootstrap, rustc_allow_const_fn_unstable(const_mut_refs))]
390+
#[rustc_const_stable(feature = "const_str_as_mut", since = "CURRENT_RUSTC_VERSION")]
389391
#[rustc_never_returns_null_ptr]
390392
#[must_use]
391393
#[inline(always)]

library/core/tests/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
#![feature(const_option_ext)]
3030
#![feature(const_pin)]
3131
#![feature(const_pointer_is_aligned)]
32-
#![feature(const_ptr_as_ref)]
3332
#![feature(const_ptr_write)]
3433
#![feature(const_result)]
3534
#![feature(const_slice_from_ref)]

0 commit comments

Comments
 (0)