lib: replace some mem::forget's with ManuallyDrop · model-checking/verify-rust-std@f15715f (original) (raw)

`@@ -259,7 +259,7 @@ use core::intrinsics::abort;

`

259

259

`#[cfg(not(no_global_oom_handling))]

`

260

260

`use core::iter;

`

261

261

`use core:📑:{PhantomData, Unsize};

`

262

``

`-

use core::mem::{self, align_of_val_raw, forget, ManuallyDrop};

`

``

262

`+

use core::mem::{self, align_of_val_raw, ManuallyDrop};

`

263

263

`use core::ops::{CoerceUnsized, Deref, DerefMut, DerefPure, DispatchFromDyn, Receiver};

`

264

264

`use core::panic::{RefUnwindSafe, UnwindSafe};

`

265

265

`#[cfg(not(no_global_oom_handling))]

`

`@@ -908,19 +908,18 @@ impl<T, A: Allocator> Rc<T, A> {

`

908

908

`#[stable(feature = "rc_unique", since = "1.4.0")]

`

909

909

`pub fn try_unwrap(this: Self) -> Result<T, Self> {

`

910

910

`if Rc::strong_count(&this) == 1 {

`

911

``

`-

unsafe {

`

912

``

`-

let val = ptr::read(&*this); // copy the contained object

`

913

``

`-

let alloc = ptr::read(&this.alloc); // copy the allocator

`

914

``

-

915

``

`-

// Indicate to Weaks that they can't be promoted by decrementing

`

916

``

`-

// the strong count, and then remove the implicit "strong weak"

`

917

``

`-

// pointer while also handling drop logic by just crafting a

`

918

``

`-

// fake Weak.

`

919

``

`-

this.inner().dec_strong();

`

920

``

`-

let _weak = Weak { ptr: this.ptr, alloc };

`

921

``

`-

forget(this);

`

922

``

`-

Ok(val)

`

923

``

`-

}

`

``

911

`+

let this = ManuallyDrop::new(this);

`

``

912

+

``

913

`+

let val: T = unsafe { ptr::read(&**this) }; // copy the contained object

`

``

914

`+

let alloc: A = unsafe { ptr::read(&this.alloc) }; // copy the allocator

`

``

915

+

``

916

`+

// Indicate to Weaks that they can't be promoted by decrementing

`

``

917

`+

// the strong count, and then remove the implicit "strong weak"

`

``

918

`+

// pointer while also handling drop logic by just crafting a

`

``

919

`+

// fake Weak.

`

``

920

`+

this.inner().dec_strong();

`

``

921

`+

let _weak = Weak { ptr: this.ptr, alloc };

`

``

922

`+

Ok(val)

`

924

923

`} else {

`

925

924

`Err(this)

`

926

925

`}

`

`@@ -1354,9 +1353,8 @@ impl<T: ?Sized, A: Allocator> Rc<T, A> {

`

1354

1353

`#[stable(feature = "rc_raw", since = "1.17.0")]

`

1355

1354

`#[rustc_never_returns_null_ptr]

`

1356

1355

`pub fn into_raw(this: Self) -> *const T {

`

1357

``

`-

let ptr = Self::as_ptr(&this);

`

1358

``

`-

mem::forget(this);

`

1359

``

`-

ptr

`

``

1356

`+

let this = ManuallyDrop::new(this);

`

``

1357

`+

Self::as_ptr(&*this)

`

1360

1358

`}

`

1361

1359

``

1362

1360

`` /// Consumes the Rc, returning the wrapped pointer and allocator.

``

`@@ -2127,7 +2125,7 @@ impl Rc<[T]> {

`

2127

2125

`}

`

2128

2126

``

2129

2127

`// All clear. Forget the guard so it doesn't free the new RcBox.

`

2130

``

`-

forget(guard);

`

``

2128

`+

mem::forget(guard);

`

2131

2129

``

2132

2130

`Self::from_ptr(ptr)

`

2133

2131

`}

`

`@@ -3080,9 +3078,7 @@ impl<T: ?Sized, A: Allocator> Weak<T, A> {

`

3080

3078

`#[must_use = "losing the pointer will leak memory"]

`

3081

3079

`#[stable(feature = "weak_into_raw", since = "1.45.0")]

`

3082

3080

`pub fn into_raw(self) -> *const T {

`

3083

``

`-

let result = self.as_ptr();

`

3084

``

`-

mem::forget(self);

`

3085

``

`-

result

`

``

3081

`+

mem::ManuallyDrop::new(self).as_ptr()

`

3086

3082

`}

`

3087

3083

``

3088

3084

`` /// Consumes the Weak<T>, returning the wrapped pointer and allocator.

``

`@@ -3762,10 +3758,11 @@ impl<T: ?Sized, A: Allocator> UniqueRcUninit<T, A> {

`

3762

3758

`/// # Safety

`

3763

3759

`///

`

3764

3760

`` /// The data must have been initialized (by writing to [Self::data_ptr()]).

``

3765

``

`-

unsafe fn into_rc(mut self) -> Rc<T, A> {

`

3766

``

`-

let ptr = self.ptr;

`

3767

``

`-

let alloc = self.alloc.take().unwrap();

`

3768

``

`-

mem::forget(self);

`

``

3761

`+

unsafe fn into_rc(self) -> Rc<T, A> {

`

``

3762

`+

let mut this = ManuallyDrop::new(self);

`

``

3763

`+

let ptr = this.ptr;

`

``

3764

`+

let alloc = this.alloc.take().unwrap();

`

``

3765

+

3769

3766

`` // SAFETY: The pointer is valid as per UniqueRcUninit::new, and the caller is responsible

``

3770

3767

`// for having initialized the data.

`

3771

3768

`unsafe { Rc::from_ptr_in(ptr.as_ptr(), alloc) }

`