Auto merge of #127706 - workingjubilee:rollup-d07ij30, r=workingjubilee · model-checking/verify-rust-std@e122949 (original) (raw)
`@@ -3,7 +3,7 @@ use crate::fmt;
`
3
3
`use crate::io::{
`
4
4
`self, ErrorKind, IntoInnerError, IoSlice, Seek, SeekFrom, Write, DEFAULT_BUF_SIZE,
`
5
5
`};
`
6
``
`-
use crate::mem;
`
``
6
`+
use crate::mem::{self, ManuallyDrop};
`
7
7
`use crate::ptr;
`
8
8
``
9
9
`/// Wraps a writer and buffers its output.
`
`@@ -164,13 +164,13 @@ impl<W: Write> BufWriter {
`
164
164
`/// assert_eq!(&buffered_data.unwrap(), b"ata");
`
165
165
```` /// ```
````
166
166
`#[stable(feature = "bufwriter_into_parts", since = "1.56.0")]
`
167
``
`-
pub fn into_parts(mut self) -> (W, Result<Vec, 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, 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 }) };
`
170
171
``
171
``
`-
// 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) };
`
174
174
``
175
175
`(inner, buf)
`
176
176
`}
`