From 1c02e6c368337bea10a57eb345bd36edbff75f87 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Thu, 12 Mar 2020 21:04:00 +0100 Subject: [PATCH] Rustup to rustc 1.43.0-nightly (c20d7eecb 2020-03-11) --- build_sysroot/alloc_system/lib.rs | 14 ++++++++------ rust-toolchain | 2 +- src/constant.rs | 1 - src/intrinsics/mod.rs | 17 ++++++++++++++--- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/build_sysroot/alloc_system/lib.rs b/build_sysroot/alloc_system/lib.rs index abfcf301a53..8ad0a076d3d 100644 --- a/build_sysroot/alloc_system/lib.rs +++ b/build_sysroot/alloc_system/lib.rs @@ -72,14 +72,16 @@ pub struct System; #[unstable(feature = "allocator_api", issue = "32838")] unsafe impl AllocRef for System { #[inline] - unsafe fn alloc(&mut self, layout: Layout) -> Result<(NonNull, usize), AllocErr> { - NonNull::new(GlobalAlloc::alloc(self, layout)).ok_or(AllocErr).map(|p| (p, layout.size())) + fn alloc(&mut self, layout: Layout) -> Result<(NonNull, usize), AllocErr> { + NonNull::new(unsafe { GlobalAlloc::alloc(self, layout) }) + .ok_or(AllocErr) + .map(|p| (p, layout.size())) } #[inline] - unsafe fn alloc_zeroed(&mut self, layout: Layout) -> Result<(NonNull, usize), AllocErr> { - NonNull::new(GlobalAlloc::alloc_zeroed(self, layout)) - .ok_or(AllocErr) - .map(|p| (p, layout.size())) + fn alloc_zeroed(&mut self, layout: Layout) -> Result<(NonNull, usize), AllocErr> { + NonNull::new(unsafe { GlobalAlloc::alloc_zeroed(self, layout) }) + .ok_or(AllocErr) + .map(|p| (p, layout.size())) } #[inline] unsafe fn dealloc(&mut self, ptr: NonNull, layout: Layout) { diff --git a/rust-toolchain b/rust-toolchain index c1c2521f63d..7b70b332219 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -nightly-2020-03-10 +nightly-2020-03-12 diff --git a/src/constant.rs b/src/constant.rs index 79183d56093..e6093704c11 100644 --- a/src/constant.rs +++ b/src/constant.rs @@ -485,7 +485,6 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for TransPlaceInterpreter { fn assert_panic( _: &mut InterpCx<'mir, 'tcx, Self>, - _: Span, _: &mir::AssertKind>, _: Option, ) -> InterpResult<'tcx> { diff --git a/src/intrinsics/mod.rs b/src/intrinsics/mod.rs index 53c699ef8c6..61a96ac0fe8 100644 --- a/src/intrinsics/mod.rs +++ b/src/intrinsics/mod.rs @@ -813,9 +813,20 @@ pub fn codegen_intrinsic_call<'tcx>( let res = CValue::by_val(swap(&mut fx.bcx, arg), fx.layout_of(T)); ret.write_cvalue(fx, res); }; - panic_if_uninhabited, () { - if fx.layout_of(T).abi.is_uninhabited() { - crate::trap::trap_panic(fx, "[panic] Called intrinsic::panic_if_uninhabited for uninhabited type."); + panic_if_uninhabited | panic_if_zero_invalid | panic_if_any_invalid, () { + let layout = fx.layout_of(T); + if layout.abi.is_uninhabited() { + crate::trap::trap_panic(fx, &format!("attempted to instantiate uninhabited type `{}`", T)); + return; + } + + if intrinsic == "panic_if_zero_invalid" && !layout.might_permit_raw_init(fx, /*zero:*/ true).unwrap() { + crate::trap::trap_panic(fx, &format!("attempted to zero-initialize type `{}`, which is invalid", T)); + return; + } + + if intrinsic == "panic_if_any_invalid" && !layout.might_permit_raw_init(fx, /*zero:*/ false).unwrap() { + crate::trap::trap_panic(fx, &format!("attempted to leave type `{}` uninitialized, which is invalid", T)); return; } };