Auto merge of #127706 - workingjubilee:rollup-d07ij30, r=workingjubilee · model-checking/verify-rust-std@e122949

@@ -3,7 +3,7 @@ use crate::fmt;

33

use crate::io::{

44

self, ErrorKind, IntoInnerError, IoSlice, Seek, SeekFrom, Write, DEFAULT_BUF_SIZE,

55

};

6-

use crate::mem;

6+

use crate::mem::{self, ManuallyDrop};

77

use crate::ptr;

8899

/// Wraps a writer and buffers its output.

@@ -164,13 +164,13 @@ impl<W: Write> BufWriter<W> {

164164

/// assert_eq!(&buffered_data.unwrap(), b"ata");

165165

/// ```

166166

#[stable(feature = "bufwriter_into_parts", since = "1.56.0")]

167-

pub fn into_parts(mut self) -> (W, Result<Vec<u8>, WriterPanicked>) {

168-

let buf = mem::take(&mut self.buf);

169-

let buf = if !self.panicked { Ok(buf) } else { Err(WriterPanicked { buf }) };

167+

pub fn into_parts(self) -> (W, Result<Vec<u8>, WriterPanicked>) {

168+

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

169+

let buf = mem::take(&mut this.buf);

170+

let buf = if !this.panicked { Ok(buf) } else { Err(WriterPanicked { buf }) };

170171171-

// SAFETY: forget(self) prevents double dropping inner

172-

let inner = unsafe { ptr::read(&self.inner) };

173-

mem::forget(self);

172+

// SAFETY: double-drops are prevented by putting `this` in a ManuallyDrop that is never dropped

173+

let inner = unsafe { ptr::read(&this.inner) };

174174175175

(inner, buf)

176176

}