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

`}

`