Auto merge of #63343 - ishitatsuyuki:revert-62150, r=RalfJung

Back out #62150

Ref: #62825

cc @RalfJung
This commit is contained in:
bors
2019-08-11 09:58:01 +00:00
5 changed files with 40 additions and 5 deletions

View File

@@ -707,11 +707,26 @@ extern "rust-intrinsic" {
they should be used through stabilized interfaces \ they should be used through stabilized interfaces \
in the rest of the standard library", in the rest of the standard library",
issue = "0")] issue = "0")]
#[rustc_deprecated(reason = "no longer used by rustc, will be removed - use MaybeUninit \ #[rustc_deprecated(reason = "superseded by MaybeUninit, removal planned",
instead",
since = "1.38.0")] since = "1.38.0")]
pub fn init<T>() -> T; 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. /// Moves a value out of scope without running drop glue.
pub fn forget<T: ?Sized>(_: T); pub fn forget<T: ?Sized>(_: T);

View File

@@ -452,8 +452,11 @@ pub const fn needs_drop<T>() -> bool {
/// ``` /// ```
#[inline] #[inline]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[cfg_attr(bootstrap, allow(deprecated_in_future))]
#[allow(deprecated)]
pub unsafe fn zeroed<T>() -> T { 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 /// Bypasses Rust's normal memory-initialization checks by pretending to
@@ -477,8 +480,11 @@ pub unsafe fn zeroed<T>() -> T {
#[inline] #[inline]
#[rustc_deprecated(since = "1.39.0", reason = "use `mem::MaybeUninit` instead")] #[rustc_deprecated(since = "1.39.0", reason = "use `mem::MaybeUninit` instead")]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[cfg_attr(bootstrap, allow(deprecated_in_future))]
#[allow(deprecated)]
pub unsafe fn uninitialized<T>() -> T { 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. /// Swaps the values at two mutable locations, without deinitializing either one.

View File

@@ -232,7 +232,7 @@ impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> {
return; return;
} }
// Effectively no-ops // Effectively no-ops
"forget" => { "uninit" | "forget" => {
return; return;
} }
"needs_drop" => { "needs_drop" => {

View File

@@ -145,6 +145,7 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem) {
"rustc_peek" => (1, vec![param(0)], param(0)), "rustc_peek" => (1, vec![param(0)], param(0)),
"panic_if_uninhabited" => (1, Vec::new(), tcx.mk_unit()), "panic_if_uninhabited" => (1, Vec::new(), tcx.mk_unit()),
"init" => (1, Vec::new(), param(0)), "init" => (1, Vec::new(), param(0)),
"uninit" => (1, Vec::new(), param(0)),
"forget" => (1, vec![param(0)], tcx.mk_unit()), "forget" => (1, vec![param(0)], tcx.mk_unit()),
"transmute" => (2, vec![ param(0) ], param(1)), "transmute" => (2, vec![ param(0) ], param(1)),
"move_val_init" => { "move_val_init" => {

View 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()};
}