From 35446b6f738861393afeb9fbb3c6d1580f068c20 Mon Sep 17 00:00:00 2001 From: Toby Lawrence Date: Mon, 14 Mar 2022 20:48:02 -0400 Subject: [PATCH 1/7] Stabilize const versions of ptr::slice_from_raw_parts and slice::from_raw_parts. --- .../example/issue-91827-extern-types.rs | 1 - library/core/src/ptr/mod.rs | 2 +- library/core/src/slice/raw.rs | 7 +++---- src/test/ui/consts/const-eval/issue-91827-extern-types.rs | 1 - 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/compiler/rustc_codegen_cranelift/example/issue-91827-extern-types.rs b/compiler/rustc_codegen_cranelift/example/issue-91827-extern-types.rs index cf8fada5320f9..2ecc8b8238b18 100644 --- a/compiler/rustc_codegen_cranelift/example/issue-91827-extern-types.rs +++ b/compiler/rustc_codegen_cranelift/example/issue-91827-extern-types.rs @@ -6,7 +6,6 @@ // Regression test for issue #91827. #![feature(const_ptr_offset_from)] -#![feature(const_slice_from_raw_parts)] #![feature(extern_types)] use std::ptr::addr_of; diff --git a/library/core/src/ptr/mod.rs b/library/core/src/ptr/mod.rs index 59b1b4c136752..5b74da103b434 100644 --- a/library/core/src/ptr/mod.rs +++ b/library/core/src/ptr/mod.rs @@ -255,7 +255,7 @@ pub const fn null_mut() -> *mut T { /// ``` #[inline] #[stable(feature = "slice_from_raw_parts", since = "1.42.0")] -#[rustc_const_unstable(feature = "const_slice_from_raw_parts", issue = "67456")] +#[rustc_const_stable(since = "1.61.0")] pub const fn slice_from_raw_parts(data: *const T, len: usize) -> *const [T] { from_raw_parts(data.cast(), len) } diff --git a/library/core/src/slice/raw.rs b/library/core/src/slice/raw.rs index 39c8d68e4bf34..a816a474bee4e 100644 --- a/library/core/src/slice/raw.rs +++ b/library/core/src/slice/raw.rs @@ -84,7 +84,7 @@ use crate::ptr; /// [`NonNull::dangling()`]: ptr::NonNull::dangling #[inline] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature = "const_slice_from_raw_parts", issue = "67456")] +#[rustc_const_stable(since = "1.61.0")] pub const unsafe fn from_raw_parts<'a, T>(data: *const T, len: usize) -> &'a [T] { debug_check_data_len(data, len); @@ -133,8 +133,7 @@ pub const unsafe fn from_raw_parts_mut<'a, T>(data: *mut T, len: usize) -> &'a m // In debug builds checks that `data` pointer is aligned and non-null and that slice with given `len` would cover less than half the address space #[cfg(debug_assertions)] -#[unstable(feature = "const_slice_from_raw_parts", issue = "67456")] -#[rustc_const_unstable(feature = "const_slice_from_raw_parts", issue = "67456")] +#[rustc_const_stable(since = "1.61.0")] const fn debug_check_data_len(data: *const T, len: usize) { fn rt_check(data: *const T) { use crate::intrinsics::is_aligned_and_not_null; @@ -147,7 +146,7 @@ const fn debug_check_data_len(data: *const T, len: usize) { // SAFETY: // // `rt_check` is just a debug assert to hint users that they are causing UB, - // it is not required for safety (the safety must be guatanteed by + // it is not required for safety (the safety must be guaranteed by // the `from_raw_parts[_mut]` caller). // // As per our safety precondition, we may assume that assertion above never fails. diff --git a/src/test/ui/consts/const-eval/issue-91827-extern-types.rs b/src/test/ui/consts/const-eval/issue-91827-extern-types.rs index d5576ebfd0296..e1f5e8ae1453c 100644 --- a/src/test/ui/consts/const-eval/issue-91827-extern-types.rs +++ b/src/test/ui/consts/const-eval/issue-91827-extern-types.rs @@ -4,7 +4,6 @@ // Regression test for issue #91827. #![feature(const_ptr_offset_from)] -#![feature(const_slice_from_raw_parts)] #![feature(extern_types)] use std::ptr::addr_of; From f5975e56fef4a861e8e06d3bc0f33e2281637917 Mon Sep 17 00:00:00 2001 From: Toby Lawrence Date: Mon, 14 Mar 2022 20:59:46 -0400 Subject: [PATCH 2/7] Fix incorrect usages of rustc_const_stable attribute. --- library/core/src/ptr/mod.rs | 2 +- library/core/src/slice/raw.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/core/src/ptr/mod.rs b/library/core/src/ptr/mod.rs index 5b74da103b434..9da125d333a63 100644 --- a/library/core/src/ptr/mod.rs +++ b/library/core/src/ptr/mod.rs @@ -255,7 +255,7 @@ pub const fn null_mut() -> *mut T { /// ``` #[inline] #[stable(feature = "slice_from_raw_parts", since = "1.42.0")] -#[rustc_const_stable(since = "1.61.0")] +#[rustc_const_stable(feature = "const_slice_from_raw_parts", since = "1.61.0")] pub const fn slice_from_raw_parts(data: *const T, len: usize) -> *const [T] { from_raw_parts(data.cast(), len) } diff --git a/library/core/src/slice/raw.rs b/library/core/src/slice/raw.rs index a816a474bee4e..099396d729cf4 100644 --- a/library/core/src/slice/raw.rs +++ b/library/core/src/slice/raw.rs @@ -84,7 +84,7 @@ use crate::ptr; /// [`NonNull::dangling()`]: ptr::NonNull::dangling #[inline] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_stable(since = "1.61.0")] +#[rustc_const_stable(feature = "const_slice_from_raw_parts", since = "1.61.0")] pub const unsafe fn from_raw_parts<'a, T>(data: *const T, len: usize) -> &'a [T] { debug_check_data_len(data, len); From 78a8268f304e505d7c456651ac946d5bc58e2880 Mon Sep 17 00:00:00 2001 From: Toby Lawrence Date: Sat, 26 Mar 2022 22:04:51 -0400 Subject: [PATCH 3/7] mark dependent const fn as stable as well --- library/core/src/ptr/metadata.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/core/src/ptr/metadata.rs b/library/core/src/ptr/metadata.rs index 287ae69acd198..b17d8efebe364 100644 --- a/library/core/src/ptr/metadata.rs +++ b/library/core/src/ptr/metadata.rs @@ -105,7 +105,7 @@ pub const fn metadata(ptr: *const T) -> ::Metadata { /// /// [`slice::from_raw_parts`]: crate::slice::from_raw_parts #[unstable(feature = "ptr_metadata", issue = "81513")] -#[rustc_const_unstable(feature = "ptr_metadata", issue = "81513")] +#[rustc_const_stable(feature = "ptr_metadata", since = "1.61.0")] #[inline] pub const fn from_raw_parts( data_address: *const (), From 96951c90434917d4456bb226fb607b8844eff32f Mon Sep 17 00:00:00 2001 From: Toby Lawrence Date: Sat, 26 Mar 2022 22:12:38 -0400 Subject: [PATCH 4/7] add missing feature field to const stable attribute --- library/core/src/slice/raw.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/core/src/slice/raw.rs b/library/core/src/slice/raw.rs index cb788c2bbcd8f..d9e7256c4c8a3 100644 --- a/library/core/src/slice/raw.rs +++ b/library/core/src/slice/raw.rs @@ -135,7 +135,7 @@ pub const unsafe fn from_raw_parts_mut<'a, T>(data: *mut T, len: usize) -> &'a m // In debug builds checks that `data` pointer is aligned and non-null and that slice with given `len` would cover less than half the address space #[cfg(debug_assertions)] -#[rustc_const_stable(since = "1.61.0")] +#[rustc_const_stable(feature = "const_slice_from_raw_parts", since = "1.61.0")] const fn debug_check_data_len(data: *const T, len: usize) { fn rt_check(data: *const T) { use crate::intrinsics::is_aligned_and_not_null; From 19e1e4dffaafa8fb2a7d2d1fba1042112cf49685 Mon Sep 17 00:00:00 2001 From: Toby Lawrence Date: Sat, 7 May 2022 20:47:29 -0400 Subject: [PATCH 5/7] mark intrinsics::const_eval_select as const stable Signed-off-by: Toby Lawrence --- library/core/src/intrinsics.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/core/src/intrinsics.rs b/library/core/src/intrinsics.rs index 22c6c1cd86861..9682116c60aab 100644 --- a/library/core/src/intrinsics.rs +++ b/library/core/src/intrinsics.rs @@ -2350,7 +2350,7 @@ pub const unsafe fn write_bytes(dst: *mut T, val: u8, count: usize) { issue = "none", reason = "const_eval_select will never be stable" )] -#[rustc_const_unstable(feature = "const_eval_select", issue = "none")] +#[rustc_const_stable(feature = "const_eval_select", since = "1.61.0")] #[lang = "const_eval_select"] #[rustc_do_not_const_check] #[cfg_attr(not(bootstrap), allow(drop_bounds))] // FIXME remove `~const Drop` and this attr when bumping From d4a95abb4eb4c038b69d9d031a988505761ddc7c Mon Sep 17 00:00:00 2001 From: Toby Lawrence Date: Sat, 7 May 2022 21:13:08 -0400 Subject: [PATCH 6/7] bisect immut/mut const slicing to make CI happy Signed-off-by: Toby Lawrence --- library/core/src/lib.rs | 2 +- library/core/src/ptr/mod.rs | 2 +- library/core/src/slice/raw.rs | 2 +- library/core/tests/lib.rs | 1 - src/test/ui/consts/const-size_of_val-align_of_val.rs | 1 - 5 files changed, 3 insertions(+), 5 deletions(-) diff --git a/library/core/src/lib.rs b/library/core/src/lib.rs index 1612aa582ad17..b11d69c2adc3b 100644 --- a/library/core/src/lib.rs +++ b/library/core/src/lib.rs @@ -134,7 +134,7 @@ #![feature(const_ptr_write)] #![feature(const_raw_ptr_comparison)] #![feature(const_size_of_val)] -#![feature(const_slice_from_raw_parts)] +#![feature(const_slice_from_raw_parts_mut)] #![feature(const_slice_ptr_len)] #![feature(const_str_from_utf8_unchecked_mut)] #![feature(const_swap)] diff --git a/library/core/src/ptr/mod.rs b/library/core/src/ptr/mod.rs index f240bb5766e27..7e4136efdc6ed 100644 --- a/library/core/src/ptr/mod.rs +++ b/library/core/src/ptr/mod.rs @@ -711,7 +711,7 @@ pub const fn slice_from_raw_parts(data: *const T, len: usize) -> *const [T] { /// ``` #[inline] #[stable(feature = "slice_from_raw_parts", since = "1.42.0")] -#[rustc_const_unstable(feature = "const_slice_from_raw_parts", issue = "67456")] +#[rustc_const_unstable(feature = "const_slice_from_raw_parts_mut", issue = "67456")] pub const fn slice_from_raw_parts_mut(data: *mut T, len: usize) -> *mut [T] { from_raw_parts_mut(data.cast(), len) } diff --git a/library/core/src/slice/raw.rs b/library/core/src/slice/raw.rs index d6c48a325b52d..733da835bc4c9 100644 --- a/library/core/src/slice/raw.rs +++ b/library/core/src/slice/raw.rs @@ -129,7 +129,7 @@ pub const unsafe fn from_raw_parts<'a, T>(data: *const T, len: usize) -> &'a [T] /// [`NonNull::dangling()`]: ptr::NonNull::dangling #[inline] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature = "const_slice_from_raw_parts", issue = "67456")] +#[rustc_const_unstable(feature = "const_slice_from_raw_parts_mut", issue = "67456")] #[must_use] pub const unsafe fn from_raw_parts_mut<'a, T>(data: *mut T, len: usize) -> &'a mut [T] { // SAFETY: the caller must uphold the safety contract for `from_raw_parts_mut`. diff --git a/library/core/tests/lib.rs b/library/core/tests/lib.rs index 31b764a6e2d52..2dec819afc7e8 100644 --- a/library/core/tests/lib.rs +++ b/library/core/tests/lib.rs @@ -72,7 +72,6 @@ #![feature(iterator_try_reduce)] #![feature(const_mut_refs)] #![feature(const_pin)] -#![feature(const_slice_from_raw_parts)] #![feature(never_type)] #![feature(unwrap_infallible)] #![feature(result_into_ok_or_err)] diff --git a/src/test/ui/consts/const-size_of_val-align_of_val.rs b/src/test/ui/consts/const-size_of_val-align_of_val.rs index 5a78313c48350..c3de6dc2075f8 100644 --- a/src/test/ui/consts/const-size_of_val-align_of_val.rs +++ b/src/test/ui/consts/const-size_of_val-align_of_val.rs @@ -2,7 +2,6 @@ #![feature(const_size_of_val, const_align_of_val)] #![feature(const_size_of_val_raw, const_align_of_val_raw, layout_for_ptr)] -#![feature(const_slice_from_raw_parts)] use std::{mem, ptr}; From 658a36add00a4296e4317c6f07f1a67a3db5d164 Mon Sep 17 00:00:00 2001 From: Toby Lawrence Date: Sat, 7 May 2022 21:18:05 -0400 Subject: [PATCH 7/7] set theright since version Signed-off-by: Toby Lawrence --- library/core/src/ptr/metadata.rs | 2 +- library/core/src/ptr/mod.rs | 2 +- library/core/src/slice/raw.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/library/core/src/ptr/metadata.rs b/library/core/src/ptr/metadata.rs index b17d8efebe364..c791832d05e59 100644 --- a/library/core/src/ptr/metadata.rs +++ b/library/core/src/ptr/metadata.rs @@ -105,7 +105,7 @@ pub const fn metadata(ptr: *const T) -> ::Metadata { /// /// [`slice::from_raw_parts`]: crate::slice::from_raw_parts #[unstable(feature = "ptr_metadata", issue = "81513")] -#[rustc_const_stable(feature = "ptr_metadata", since = "1.61.0")] +#[rustc_const_stable(feature = "ptr_metadata", since = "1.62.0")] #[inline] pub const fn from_raw_parts( data_address: *const (), diff --git a/library/core/src/ptr/mod.rs b/library/core/src/ptr/mod.rs index 7e4136efdc6ed..23abfe21db6c9 100644 --- a/library/core/src/ptr/mod.rs +++ b/library/core/src/ptr/mod.rs @@ -679,7 +679,7 @@ where /// ``` #[inline] #[stable(feature = "slice_from_raw_parts", since = "1.42.0")] -#[rustc_const_stable(feature = "const_slice_from_raw_parts", since = "1.61.0")] +#[rustc_const_stable(feature = "const_slice_from_raw_parts", since = "1.62.0")] pub const fn slice_from_raw_parts(data: *const T, len: usize) -> *const [T] { from_raw_parts(data.cast(), len) } diff --git a/library/core/src/slice/raw.rs b/library/core/src/slice/raw.rs index 733da835bc4c9..fbb838f791cb4 100644 --- a/library/core/src/slice/raw.rs +++ b/library/core/src/slice/raw.rs @@ -85,7 +85,7 @@ use crate::ptr; /// [`NonNull::dangling()`]: ptr::NonNull::dangling #[inline] #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_stable(feature = "const_slice_from_raw_parts", since = "1.61.0")] +#[rustc_const_stable(feature = "const_slice_from_raw_parts", since = "1.62.0")] #[must_use] pub const unsafe fn from_raw_parts<'a, T>(data: *const T, len: usize) -> &'a [T] { // SAFETY: the caller must uphold the safety contract for `from_raw_parts`.