diff options
| author | bors <bors@rust-lang.org> | 2019-01-05 14:58:57 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-01-05 14:58:57 +0000 |
| commit | 8c2d0f4a1da300cb34d77fbcdd9f7209cc556582 (patch) | |
| tree | 0401cf1c7bb2474333a26b2d22c5b28fe52d3dae /src/libcore | |
| parent | 68614265d312fc2cbe8a696f7dabb9416eb6f221 (diff) | |
| parent | c118b17953a8e29b850b8ed8fe0d3aaf2917a9da (diff) | |
| download | rust-8c2d0f4a1da300cb34d77fbcdd9f7209cc556582.tar.gz rust-8c2d0f4a1da300cb34d77fbcdd9f7209cc556582.zip | |
Auto merge of #57145 - RalfJung:panic-if-uninhabited, r=alexcrichton
panic when calling MaybeUninhabited::into_inner on uninhabited type I do this by adding an internal-only intrinsic `panic_if_uninhabited`. I have no idea what I am doing here, just mindlessly copying code around, so please review carefully!
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/intrinsics.rs | 5 | ||||
| -rw-r--r-- | src/libcore/mem.rs | 6 |
2 files changed, 11 insertions, 0 deletions
diff --git a/src/libcore/intrinsics.rs b/src/libcore/intrinsics.rs index 7508257f780..4f5310f5285 100644 --- a/src/libcore/intrinsics.rs +++ b/src/libcore/intrinsics.rs @@ -690,6 +690,11 @@ extern "rust-intrinsic" { /// crate it is invoked in. pub fn type_id<T: ?Sized + 'static>() -> u64; + /// A guard for unsafe functions that cannot ever be executed if `T` is uninhabited: + /// This will statically either panic, or do nothing. + #[cfg(not(stage0))] + pub fn panic_if_uninhabited<T>(); + /// Creates a value initialized to zero. /// /// `init` is unsafe because it returns a zeroed-out datum, diff --git a/src/libcore/mem.rs b/src/libcore/mem.rs index c024868714c..8fcbb73d9ce 100644 --- a/src/libcore/mem.rs +++ b/src/libcore/mem.rs @@ -492,6 +492,8 @@ pub const fn needs_drop<T>() -> bool { #[rustc_deprecated(since = "2.0.0", reason = "use `mem::MaybeUninit::zeroed` instead")] #[stable(feature = "rust1", since = "1.0.0")] pub unsafe fn zeroed<T>() -> T { + #[cfg(not(stage0))] + intrinsics::panic_if_uninhabited::<T>(); intrinsics::init() } @@ -624,6 +626,8 @@ pub unsafe fn zeroed<T>() -> T { #[rustc_deprecated(since = "2.0.0", reason = "use `mem::MaybeUninit::uninitialized` instead")] #[stable(feature = "rust1", since = "1.0.0")] pub unsafe fn uninitialized<T>() -> T { + #[cfg(not(stage0))] + intrinsics::panic_if_uninhabited::<T>(); intrinsics::uninit() } @@ -1128,6 +1132,8 @@ impl<T> MaybeUninit<T> { #[unstable(feature = "maybe_uninit", issue = "53491")] #[inline(always)] pub unsafe fn into_inner(self) -> T { + #[cfg(not(stage0))] + intrinsics::panic_if_uninhabited::<T>(); ManuallyDrop::into_inner(self.value) } |
