Make forget intrinsic safe
This commit is contained in:
parent
158f8d034b
commit
5718cc2f9b
@ -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,
|
||||
}
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user