Skip to content

Commit 43b27c0

Browse files
committed
Use ManuallyDrop instead of mem::forget-in-disguise
This fixes stacked borrows violation violations. See tokio-rs/bytes#458 for more.
1 parent 6e022e4 commit 43b27c0

File tree

1 file changed

+9
-12
lines changed

1 file changed

+9
-12
lines changed

futures-task/src/future_obj.rs

+9-12
Original file line numberDiff line numberDiff line change
@@ -252,10 +252,9 @@ mod if_alloc {
252252
where
253253
F: Future<Output = T> + 'a,
254254
{
255-
fn into_raw(mut self) -> *mut (dyn Future<Output = T> + 'a) {
256-
let ptr = unsafe { self.as_mut().get_unchecked_mut() as *mut _ };
257-
mem::forget(self);
258-
ptr
255+
fn into_raw(self) -> *mut (dyn Future<Output = T> + 'a) {
256+
let mut this = mem::ManuallyDrop::new(self);
257+
unsafe { this.as_mut().get_unchecked_mut() as *mut _ }
259258
}
260259

261260
unsafe fn drop(ptr: *mut (dyn Future<Output = T> + 'a)) {
@@ -264,10 +263,9 @@ mod if_alloc {
264263
}
265264

266265
unsafe impl<'a, T: 'a> UnsafeFutureObj<'a, T> for Pin<Box<dyn Future<Output = T> + 'a>> {
267-
fn into_raw(mut self) -> *mut (dyn Future<Output = T> + 'a) {
268-
let ptr = unsafe { self.as_mut().get_unchecked_mut() as *mut _ };
269-
mem::forget(self);
270-
ptr
266+
fn into_raw(self) -> *mut (dyn Future<Output = T> + 'a) {
267+
let mut this = mem::ManuallyDrop::new(self);
268+
unsafe { this.as_mut().get_unchecked_mut() as *mut _ }
271269
}
272270

273271
unsafe fn drop(ptr: *mut (dyn Future<Output = T> + 'a)) {
@@ -276,10 +274,9 @@ mod if_alloc {
276274
}
277275

278276
unsafe impl<'a, T: 'a> UnsafeFutureObj<'a, T> for Pin<Box<dyn Future<Output = T> + Send + 'a>> {
279-
fn into_raw(mut self) -> *mut (dyn Future<Output = T> + 'a) {
280-
let ptr = unsafe { self.as_mut().get_unchecked_mut() as *mut _ };
281-
mem::forget(self);
282-
ptr
277+
fn into_raw(self) -> *mut (dyn Future<Output = T> + 'a) {
278+
let mut this = mem::ManuallyDrop::new(self);
279+
unsafe { this.as_mut().get_unchecked_mut() as *mut _ }
283280
}
284281

285282
unsafe fn drop(ptr: *mut (dyn Future<Output = T> + 'a)) {

0 commit comments

Comments
 (0)