Stabilize const_mem_zeroed
Make `core::mem::zeroed` const stable. Newly stable API: // core::mem pub const unsafe fn zeroed<T>() -> T; This is stabilized with `const_maybe_uninit_zeroed` since it is a simple wrapper. In order to make this possible, intrinsics `assert_zero_valid` was made const stable under `const_assert_type2`. `assert_mem_uninitialized_valid` was also made const stable since it is under the same gate.
This commit is contained in:
parent
f6ce646d3f
commit
5e5f3341e3
@ -1072,7 +1072,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
|||||||
/// zero-initialization: This will statically either panic, or do nothing.
|
/// zero-initialization: This will statically either panic, or do nothing.
|
||||||
///
|
///
|
||||||
/// This intrinsic does not have a stable counterpart.
|
/// This intrinsic does not have a stable counterpart.
|
||||||
#[rustc_const_unstable(feature = "const_assert_type2", issue = "none")]
|
#[rustc_const_stable(feature = "const_assert_type2", since = "CURRENT_RUSTC_VERSION")]
|
||||||
#[rustc_safe_intrinsic]
|
#[rustc_safe_intrinsic]
|
||||||
#[rustc_nounwind]
|
#[rustc_nounwind]
|
||||||
pub fn assert_zero_valid<T>();
|
pub fn assert_zero_valid<T>();
|
||||||
@ -1080,7 +1080,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
|||||||
/// A guard for `std::mem::uninitialized`. This will statically either panic, or do nothing.
|
/// A guard for `std::mem::uninitialized`. This will statically either panic, or do nothing.
|
||||||
///
|
///
|
||||||
/// This intrinsic does not have a stable counterpart.
|
/// This intrinsic does not have a stable counterpart.
|
||||||
#[rustc_const_unstable(feature = "const_assert_type2", issue = "none")]
|
#[rustc_const_stable(feature = "const_assert_type2", since = "CURRENT_RUSTC_VERSION")]
|
||||||
#[rustc_safe_intrinsic]
|
#[rustc_safe_intrinsic]
|
||||||
#[rustc_nounwind]
|
#[rustc_nounwind]
|
||||||
pub fn assert_mem_uninitialized_valid<T>();
|
pub fn assert_mem_uninitialized_valid<T>();
|
||||||
|
@ -647,7 +647,8 @@ pub const fn needs_drop<T: ?Sized>() -> bool {
|
|||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
#[rustc_diagnostic_item = "mem_zeroed"]
|
#[rustc_diagnostic_item = "mem_zeroed"]
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
pub unsafe fn zeroed<T>() -> T {
|
#[rustc_const_stable(feature = "const_mem_zeroed", since = "CURRENT_RUSTC_VERSION")]
|
||||||
|
pub const unsafe fn zeroed<T>() -> T {
|
||||||
// SAFETY: the caller must guarantee that an all-zero value is valid for `T`.
|
// SAFETY: the caller must guarantee that an all-zero value is valid for `T`.
|
||||||
unsafe {
|
unsafe {
|
||||||
intrinsics::assert_zero_valid::<T>();
|
intrinsics::assert_zero_valid::<T>();
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
#![feature(never_type)]
|
#![feature(never_type)]
|
||||||
#![feature(const_assert_type2)]
|
|
||||||
#![feature(core_intrinsics)]
|
#![feature(core_intrinsics)]
|
||||||
|
|
||||||
use std::intrinsics;
|
use std::intrinsics;
|
||||||
|
@ -1,20 +1,20 @@
|
|||||||
error[E0080]: evaluation of constant value failed
|
error[E0080]: evaluation of constant value failed
|
||||||
--> $DIR/assert-type-intrinsics.rs:12:9
|
--> $DIR/assert-type-intrinsics.rs:11:9
|
||||||
|
|
|
|
||||||
LL | MaybeUninit::<!>::uninit().assume_init();
|
LL | MaybeUninit::<!>::uninit().assume_init();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'aborted execution: attempted to instantiate uninhabited type `!`', $DIR/assert-type-intrinsics.rs:12:36
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'aborted execution: attempted to instantiate uninhabited type `!`', $DIR/assert-type-intrinsics.rs:11:36
|
||||||
|
|
||||||
error[E0080]: evaluation of constant value failed
|
error[E0080]: evaluation of constant value failed
|
||||||
--> $DIR/assert-type-intrinsics.rs:16:9
|
--> $DIR/assert-type-intrinsics.rs:15:9
|
||||||
|
|
|
|
||||||
LL | intrinsics::assert_mem_uninitialized_valid::<&'static i32>();
|
LL | intrinsics::assert_mem_uninitialized_valid::<&'static i32>();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'aborted execution: attempted to leave type `&i32` uninitialized, which is invalid', $DIR/assert-type-intrinsics.rs:16:9
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'aborted execution: attempted to leave type `&i32` uninitialized, which is invalid', $DIR/assert-type-intrinsics.rs:15:9
|
||||||
|
|
||||||
error[E0080]: evaluation of constant value failed
|
error[E0080]: evaluation of constant value failed
|
||||||
--> $DIR/assert-type-intrinsics.rs:20:9
|
--> $DIR/assert-type-intrinsics.rs:19:9
|
||||||
|
|
|
|
||||||
LL | intrinsics::assert_zero_valid::<&'static i32>();
|
LL | intrinsics::assert_zero_valid::<&'static i32>();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'aborted execution: attempted to zero-initialize type `&i32`, which is invalid', $DIR/assert-type-intrinsics.rs:20:9
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'aborted execution: attempted to zero-initialize type `&i32`, which is invalid', $DIR/assert-type-intrinsics.rs:19:9
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user