Skip to content

Commit

Permalink
Make forget intrinsic safe
Browse files Browse the repository at this point in the history
  • Loading branch information
tmiasko committed Dec 29, 2020
1 parent 158f8d0 commit 5718cc2
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 17 deletions.
1 change: 1 addition & 0 deletions compiler/rustc_typeck/src/check/intrinsic.rs
Expand Up @@ -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,
}
Expand Down
7 changes: 6 additions & 1 deletion library/core/src/mem/mod.rs
Expand Up @@ -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.
Expand Down
24 changes: 9 additions & 15 deletions src/test/mir-opt/lower_intrinsics.forget.LowerIntrinsics.diff
Expand Up @@ -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
}

Expand Down
2 changes: 1 addition & 1 deletion src/test/mir-opt/lower_intrinsics.rs
Expand Up @@ -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
Expand Down

0 comments on commit 5718cc2

Please sign in to comment.