diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2020-03-11 10:36:16 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-03-11 10:36:16 +0100 |
| commit | a7c2eef2aeb23f52efc4a4bfd240292d43a61798 (patch) | |
| tree | a794d20513cc74cde83c05adb18370dc879e629b /src/libcore | |
| parent | 15812785344d913d779d9738fe3cca8de56f71d5 (diff) | |
| parent | a09c33e36205991bb633a848d1e9c7604ae43ce8 (diff) | |
| download | rust-a7c2eef2aeb23f52efc4a4bfd240292d43a61798.tar.gz rust-a7c2eef2aeb23f52efc4a4bfd240292d43a61798.zip | |
Rollup merge of #66059 - RalfJung:panic-on-non-zero, r=eddyb
mem::zeroed/uninit: panic on types that do not permit zero-initialization r? @eddyb @oli-obk Cc https://github.com/rust-lang/rust/issues/62825 Also see [this summary comment](https://github.com/rust-lang/rust/pull/66059#issuecomment-586734747)
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/intrinsics.rs | 10 | ||||
| -rw-r--r-- | src/libcore/mem/mod.rs | 6 |
2 files changed, 16 insertions, 0 deletions
diff --git a/src/libcore/intrinsics.rs b/src/libcore/intrinsics.rs index a889eff75c0..721a2d26a71 100644 --- a/src/libcore/intrinsics.rs +++ b/src/libcore/intrinsics.rs @@ -1007,6 +1007,16 @@ extern "rust-intrinsic" { /// This will statically either panic, or do nothing. pub fn panic_if_uninhabited<T>(); + /// A guard for unsafe functions that cannot ever be executed if `T` does not permit + /// zero-initialization: This will statically either panic, or do nothing. + #[cfg(not(bootstrap))] + pub fn panic_if_zero_invalid<T>(); + + /// A guard for unsafe functions that cannot ever be executed if `T` has invalid + /// bit patterns: This will statically either panic, or do nothing. + #[cfg(not(bootstrap))] + pub fn panic_if_any_invalid<T>(); + /// Gets a reference to a static `Location` indicating where it was called. #[rustc_const_unstable(feature = "const_caller_location", issue = "47809")] pub fn caller_location() -> &'static crate::panic::Location<'static>; diff --git a/src/libcore/mem/mod.rs b/src/libcore/mem/mod.rs index 90144d11dc9..8add875dcbe 100644 --- a/src/libcore/mem/mod.rs +++ b/src/libcore/mem/mod.rs @@ -496,6 +496,9 @@ pub const fn needs_drop<T>() -> bool { #[allow(deprecated)] #[rustc_diagnostic_item = "mem_zeroed"] pub unsafe fn zeroed<T>() -> T { + #[cfg(not(bootstrap))] + intrinsics::panic_if_zero_invalid::<T>(); + #[cfg(bootstrap)] intrinsics::panic_if_uninhabited::<T>(); intrinsics::init() } @@ -529,6 +532,9 @@ pub unsafe fn zeroed<T>() -> T { #[allow(deprecated)] #[rustc_diagnostic_item = "mem_uninitialized"] pub unsafe fn uninitialized<T>() -> T { + #[cfg(not(bootstrap))] + intrinsics::panic_if_any_invalid::<T>(); + #[cfg(bootstrap)] intrinsics::panic_if_uninhabited::<T>(); intrinsics::uninit() } |
