Make forget intrinsic safe

This commit is contained in:
Tomasz Miąsko 2020-12-29 00:00:00 +00:00
parent 158f8d034b
commit 5718cc2f9b
4 changed files with 17 additions and 17 deletions

View File

@ -92,6 +92,7 @@ pub fn intrinsic_operation_unsafety(intrinsic: Symbol) -> hir::Unsafety {
| sym::rustc_peek
| sym::maxnumf64
| sym::type_name
| sym::forget
| sym::variant_count => hir::Unsafety::Normal,
_ => hir::Unsafety::Unsafe,
}

View File

@ -151,9 +151,14 @@ pub const fn forget<T>(t: T) {
#[inline]
#[unstable(feature = "forget_unsized", issue = "none")]
pub fn forget_unsized<T: ?Sized>(t: T) {
#[cfg(bootstrap)]
// SAFETY: the forget intrinsic could be safe, but there's no point in making it safe since
// we'll be implementing this function soon via `ManuallyDrop`
unsafe { intrinsics::forget(t) }
unsafe {
intrinsics::forget(t)
}
#[cfg(not(bootstrap))]
intrinsics::forget(t)
}
/// Returns the size of a type in bytes.

View File

@ -4,27 +4,21 @@
fn forget(_1: T) -> () {
debug t => _1; // in scope 0 at $DIR/lower_intrinsics.rs:18:18: 18:19
let mut _0: (); // return place in scope 0 at $DIR/lower_intrinsics.rs:18:24: 18:24
let _2: (); // in scope 0 at $DIR/lower_intrinsics.rs:19:14: 19:41
let mut _3: T; // in scope 0 at $DIR/lower_intrinsics.rs:19:39: 19:40
scope 1 {
}
let mut _2: T; // in scope 0 at $DIR/lower_intrinsics.rs:19:30: 19:31
bb0: {
StorageLive(_2); // scope 0 at $DIR/lower_intrinsics.rs:19:5: 19:43
StorageLive(_3); // scope 1 at $DIR/lower_intrinsics.rs:19:39: 19:40
_3 = move _1; // scope 1 at $DIR/lower_intrinsics.rs:19:39: 19:40
- _2 = std::intrinsics::forget::<T>(move _3) -> bb1; // scope 1 at $DIR/lower_intrinsics.rs:19:14: 19:41
StorageLive(_2); // scope 0 at $DIR/lower_intrinsics.rs:19:30: 19:31
_2 = move _1; // scope 0 at $DIR/lower_intrinsics.rs:19:30: 19:31
- _0 = std::intrinsics::forget::<T>(move _2) -> bb1; // scope 0 at $DIR/lower_intrinsics.rs:19:5: 19:32
- // mir::Constant
- // + span: $DIR/lower_intrinsics.rs:19:14: 19:38
- // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(T) {std::intrinsics::forget::<T>}, val: Value(Scalar(<ZST>)) }
+ _2 = const (); // scope 1 at $DIR/lower_intrinsics.rs:19:14: 19:41
+ goto -> bb1; // scope 1 at $DIR/lower_intrinsics.rs:19:14: 19:41
- // + span: $DIR/lower_intrinsics.rs:19:5: 19:29
- // + literal: Const { ty: extern "rust-intrinsic" fn(T) {std::intrinsics::forget::<T>}, val: Value(Scalar(<ZST>)) }
+ _0 = const (); // scope 0 at $DIR/lower_intrinsics.rs:19:5: 19:32
+ goto -> bb1; // scope 0 at $DIR/lower_intrinsics.rs:19:5: 19:32
}
bb1: {
StorageDead(_3); // scope 1 at $DIR/lower_intrinsics.rs:19:40: 19:41
StorageDead(_2); // scope 0 at $DIR/lower_intrinsics.rs:19:43: 19:44
_0 = const (); // scope 0 at $DIR/lower_intrinsics.rs:18:24: 20:2
StorageDead(_2); // scope 0 at $DIR/lower_intrinsics.rs:19:31: 19:32
goto -> bb2; // scope 0 at $DIR/lower_intrinsics.rs:20:1: 20:2
}

View File

@ -16,7 +16,7 @@ pub fn size_of<T>() -> usize {
// EMIT_MIR lower_intrinsics.forget.LowerIntrinsics.diff
pub fn forget<T>(t: T) {
unsafe { core::intrinsics::forget(t) };
core::intrinsics::forget(t)
}
// EMIT_MIR lower_intrinsics.unreachable.LowerIntrinsics.diff