Auto merge of #127706 - workingjubilee:rollup-d07ij30, r=workingjubilee · model-checking/verify-rust-std@e122949
@@ -3,7 +3,7 @@ use crate::fmt;
33use crate::io::{
44self, ErrorKind, IntoInnerError, IoSlice, Seek, SeekFrom, Write, DEFAULT_BUF_SIZE,
55};
6-use crate::mem;
6+use crate::mem::{self, ManuallyDrop};
77use 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}