Add test for drop order in async functions.
This tests that async functions drop parameters in the same order as regular functions.
This commit is contained in:
parent
9224be5fa3
commit
8b57be1bb3
1 changed files with 89 additions and 0 deletions
89
src/test/run-pass/issue-54716.rs
Normal file
89
src/test/run-pass/issue-54716.rs
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
// aux-build:arc_wake.rs
|
||||||
|
// edition:2018
|
||||||
|
// run-pass
|
||||||
|
|
||||||
|
#![allow(unused_variables)]
|
||||||
|
#![feature(async_await, await_macro, futures_api)]
|
||||||
|
|
||||||
|
extern crate arc_wake;
|
||||||
|
|
||||||
|
use arc_wake::ArcWake;
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use std::future::Future;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::task::Context;
|
||||||
|
|
||||||
|
struct EmptyWaker;
|
||||||
|
|
||||||
|
impl ArcWake for EmptyWaker {
|
||||||
|
fn wake(self: Arc<Self>) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Eq, PartialEq)]
|
||||||
|
enum DropOrder {
|
||||||
|
Function,
|
||||||
|
Val(&'static str),
|
||||||
|
}
|
||||||
|
|
||||||
|
struct D(&'static str, Arc<RefCell<Vec<DropOrder>>>);
|
||||||
|
|
||||||
|
impl Drop for D {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
self.1.borrow_mut().push(DropOrder::Val(self.0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn foo(x: D, _y: D) {
|
||||||
|
x.1.borrow_mut().push(DropOrder::Function);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn bar(x: D, _: D) {
|
||||||
|
x.1.borrow_mut().push(DropOrder::Function);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn baz((x, _): (D, D)) {
|
||||||
|
x.1.borrow_mut().push(DropOrder::Function);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn foobar(x: D, (a, _, _c): (D, D, D), _: D, _y: D) {
|
||||||
|
x.1.borrow_mut().push(DropOrder::Function);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let empty = Arc::new(EmptyWaker);
|
||||||
|
let waker = ArcWake::into_waker(empty);
|
||||||
|
let mut cx = Context::from_waker(&waker);
|
||||||
|
|
||||||
|
use DropOrder::*;
|
||||||
|
|
||||||
|
// Currently, the `bar` and `foobar` tests do not output the same order as the equivalent
|
||||||
|
// non-async functions. This is because the drop order of captured variables doesn't match the
|
||||||
|
// drop order of arguments in a function.
|
||||||
|
|
||||||
|
let af = Arc::new(RefCell::new(Vec::new()));
|
||||||
|
let mut fut = Box::pin(foo(D("x", af.clone()), D("_y", af.clone())));
|
||||||
|
let _ = fut.as_mut().poll(&mut cx);
|
||||||
|
assert_eq!(*af.borrow(), &[Function, Val("_y"), Val("x")]);
|
||||||
|
|
||||||
|
let af = Arc::new(RefCell::new(Vec::new()));
|
||||||
|
let mut fut = Box::pin(bar(D("x", af.clone()), D("_", af.clone())));
|
||||||
|
let _ = fut.as_mut().poll(&mut cx);
|
||||||
|
assert_eq!(*af.borrow(), &[Function, Val("x"), Val("_")]);
|
||||||
|
|
||||||
|
let af = Arc::new(RefCell::new(Vec::new()));
|
||||||
|
let mut fut = Box::pin(baz((D("x", af.clone()), D("_", af.clone()))));
|
||||||
|
let _ = fut.as_mut().poll(&mut cx);
|
||||||
|
assert_eq!(*af.borrow(), &[Function, Val("x"), Val("_")]);
|
||||||
|
|
||||||
|
let af = Arc::new(RefCell::new(Vec::new()));
|
||||||
|
let mut fut = Box::pin(foobar(
|
||||||
|
D("x", af.clone()),
|
||||||
|
(D("a", af.clone()), D("_", af.clone()), D("_c", af.clone())),
|
||||||
|
D("_", af.clone()),
|
||||||
|
D("_y", af.clone()),
|
||||||
|
));
|
||||||
|
let _ = fut.as_mut().poll(&mut cx);
|
||||||
|
assert_eq!(*af.borrow(), &[
|
||||||
|
Function, Val("_y"), Val("_c"), Val("a"), Val("x"), Val("_"), Val("_"),
|
||||||
|
]);
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue