From 8d6472a76c6615ad56c693b706e1232e07537b71 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Tue, 20 Nov 2018 12:51:55 +0100 Subject: [PATCH 1/2] test self-referential generator --- ...generator_control_flow.rs => generator.rs} | 40 ++++++++++++------- 1 file changed, 26 insertions(+), 14 deletions(-) rename tests/run-pass/{generator_control_flow.rs => generator.rs} (65%) diff --git a/tests/run-pass/generator_control_flow.rs b/tests/run-pass/generator.rs similarity index 65% rename from tests/run-pass/generator_control_flow.rs rename to tests/run-pass/generator.rs index 900ff0e3490..603093a037c 100644 --- a/tests/run-pass/generator_control_flow.rs +++ b/tests/run-pass/generator.rs @@ -13,11 +13,11 @@ use std::ops::{GeneratorState, Generator}; fn finish(mut amt: usize, mut t: T) -> T::Return - where T: Generator + where T: Generator { loop { match unsafe { t.resume() } { - GeneratorState::Yielded(()) => amt -= 1, + GeneratorState::Yielded(y) => amt -= y, GeneratorState::Complete(ret) => { assert_eq!(amt, 0); return ret @@ -28,38 +28,50 @@ fn finish(mut amt: usize, mut t: T) -> T::Return } fn main() { - finish(1, || yield); + finish(1, || yield 1); finish(3, || { let mut x = 0; - yield; + yield 1; x += 1; - yield; + yield 1; x += 1; - yield; + yield 1; assert_eq!(x, 2); }); - finish(8, || { - for _ in 0..8 { - yield; + finish(7*8/2, || { + for i in 0..8 { + yield i; } }); finish(1, || { if true { - yield; + yield 1; } else { } }); finish(1, || { if false { } else { - yield; + yield 1; } }); finish(2, || { - if { yield; false } { - yield; + if { yield 1; false } { + yield 1; panic!() } - yield + yield 1; }); + // also test a self-referential generator + assert_eq!( + finish(5, || { + let mut x = Box::new(5); + let y = &mut *x; + *y = 5; + yield *y; + *y = 10; + *x + }), + 10 + ); } From 7fe24a2b86bd355b20bc772e4613554ea5105ec0 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Tue, 20 Nov 2018 16:09:06 +0100 Subject: [PATCH 2/2] also add an async fn test --- tests/run-pass-fullmir/async-fn.rs | 35 ++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 tests/run-pass-fullmir/async-fn.rs diff --git a/tests/run-pass-fullmir/async-fn.rs b/tests/run-pass-fullmir/async-fn.rs new file mode 100644 index 00000000000..7c32b026df6 --- /dev/null +++ b/tests/run-pass-fullmir/async-fn.rs @@ -0,0 +1,35 @@ +#![feature( + async_await, + await_macro, + futures_api, + pin, +)] + +use std::{future::Future, pin::Pin, task::Poll}; + +// See if we can run a basic `async fn` +pub async fn foo(x: &u32, y: u32) -> u32 { + let y = &y; + let z = 9; + let z = &z; + let y = await!(async { *y + *z }); + let a = 10; + let a = &a; + *x + y + *a +} + +fn main() { + use std::{sync::Arc, task::{Wake, local_waker}}; + + struct NoWake; + impl Wake for NoWake { + fn wake(_arc_self: &Arc) { + panic!(); + } + } + + let lw = unsafe { local_waker(Arc::new(NoWake)) }; + let x = 5; + let mut fut = foo(&x, 7); + assert_eq!(unsafe { Pin::new_unchecked(&mut fut) }.poll(&lw), Poll::Ready(31)); +}