mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-30 02:33:55 +00:00
Revert "Rollup merge of #62150 - alex:mem-uninit-refactor, r=RalfJung"
This reverts commit1d45156866
, reversing changes made to0f92eb8a4a
.
This commit is contained in:
parent
c326c2e0f1
commit
2358e3eff6
@ -707,11 +707,26 @@ extern "rust-intrinsic" {
|
||||
they should be used through stabilized interfaces \
|
||||
in the rest of the standard library",
|
||||
issue = "0")]
|
||||
#[rustc_deprecated(reason = "no longer used by rustc, will be removed - use MaybeUninit \
|
||||
instead",
|
||||
#[rustc_deprecated(reason = "superseded by MaybeUninit, removal planned",
|
||||
since = "1.38.0")]
|
||||
pub fn init<T>() -> T;
|
||||
|
||||
/// Creates an uninitialized value.
|
||||
///
|
||||
/// `uninit` is unsafe because there is no guarantee of what its
|
||||
/// contents are. In particular its drop-flag may be set to any
|
||||
/// state, which means it may claim either dropped or
|
||||
/// undropped. In the general case one must use `ptr::write` to
|
||||
/// initialize memory previous set to the result of `uninit`.
|
||||
#[unstable(feature = "core_intrinsics",
|
||||
reason = "intrinsics are unlikely to ever be stabilized, instead \
|
||||
they should be used through stabilized interfaces \
|
||||
in the rest of the standard library",
|
||||
issue = "0")]
|
||||
#[rustc_deprecated(reason = "superseded by MaybeUninit, removal planned",
|
||||
since = "1.38.0")]
|
||||
pub fn uninit<T>() -> T;
|
||||
|
||||
/// Moves a value out of scope without running drop glue.
|
||||
pub fn forget<T: ?Sized>(_: T);
|
||||
|
||||
|
@ -452,8 +452,11 @@ pub const fn needs_drop<T>() -> bool {
|
||||
/// ```
|
||||
#[inline]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[cfg_attr(bootstrap, allow(deprecated_in_future))]
|
||||
#[allow(deprecated)]
|
||||
pub unsafe fn zeroed<T>() -> T {
|
||||
MaybeUninit::zeroed().assume_init()
|
||||
intrinsics::panic_if_uninhabited::<T>();
|
||||
intrinsics::init()
|
||||
}
|
||||
|
||||
/// Bypasses Rust's normal memory-initialization checks by pretending to
|
||||
@ -477,8 +480,11 @@ pub unsafe fn zeroed<T>() -> T {
|
||||
#[inline]
|
||||
#[rustc_deprecated(since = "1.39.0", reason = "use `mem::MaybeUninit` instead")]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[cfg_attr(bootstrap, allow(deprecated_in_future))]
|
||||
#[allow(deprecated)]
|
||||
pub unsafe fn uninitialized<T>() -> T {
|
||||
MaybeUninit::uninit().assume_init()
|
||||
intrinsics::panic_if_uninhabited::<T>();
|
||||
intrinsics::uninit()
|
||||
}
|
||||
|
||||
/// Swaps the values at two mutable locations, without deinitializing either one.
|
||||
|
@ -232,7 +232,7 @@ impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> {
|
||||
return;
|
||||
}
|
||||
// Effectively no-ops
|
||||
"forget" => {
|
||||
"uninit" | "forget" => {
|
||||
return;
|
||||
}
|
||||
"needs_drop" => {
|
||||
|
@ -145,6 +145,7 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem) {
|
||||
"rustc_peek" => (1, vec![param(0)], param(0)),
|
||||
"panic_if_uninhabited" => (1, Vec::new(), tcx.mk_unit()),
|
||||
"init" => (1, Vec::new(), param(0)),
|
||||
"uninit" => (1, Vec::new(), param(0)),
|
||||
"forget" => (1, vec![param(0)], tcx.mk_unit()),
|
||||
"transmute" => (2, vec![ param(0) ], param(1)),
|
||||
"move_val_init" => {
|
||||
|
13
src/test/ui/intrinsics/intrinsic-uninit.rs
Normal file
13
src/test/ui/intrinsics/intrinsic-uninit.rs
Normal file
@ -0,0 +1,13 @@
|
||||
// run-pass
|
||||
// pretty-expanded FIXME #23616
|
||||
|
||||
#![feature(intrinsics)]
|
||||
|
||||
mod rusti {
|
||||
extern "rust-intrinsic" {
|
||||
pub fn uninit<T>() -> T;
|
||||
}
|
||||
}
|
||||
pub fn main() {
|
||||
let _a : isize = unsafe {rusti::uninit()};
|
||||
}
|
Loading…
Reference in New Issue
Block a user