@@ -14,6 +14,32 @@ pub async fn foo(x: &u32, y: u32) -> u32 {
1414 * x + y + * a
1515}
1616
17+ async fn add ( x : u32 , y : u32 ) -> u32 {
18+ async { x + y } . await
19+ }
20+
21+ async fn build_aggregate ( a : u32 , b : u32 , c : u32 , d : u32 ) -> u32 {
22+ let x = ( add ( a, b) . await , add ( c, d) . await ) ;
23+ x. 0 + x. 1
24+ }
25+
26+ enum Never { }
27+ fn never ( ) -> Never {
28+ panic ! ( )
29+ }
30+
31+ async fn includes_never ( crash : bool , x : u32 ) -> u32 {
32+ let mut result = async { x * x } . await ;
33+ if !crash {
34+ return result;
35+ }
36+ #[ allow( unused) ]
37+ let bad = never ( ) ;
38+ result *= async { x + x } . await ;
39+ drop ( bad) ;
40+ result
41+ }
42+
1743fn raw_waker_clone ( _this : * const ( ) ) -> RawWaker {
1844 panic ! ( "unimplemented" ) ;
1945}
@@ -38,4 +64,14 @@ fn main() {
3864 let waker = unsafe { Waker :: from_raw ( RawWaker :: new ( ptr:: null ( ) , & RAW_WAKER ) ) } ;
3965 let mut context = Context :: from_waker ( & waker) ;
4066 assert_eq ! ( unsafe { Pin :: new_unchecked( & mut fut) } . poll( & mut context) , Poll :: Ready ( 31 ) ) ;
67+
68+ let mut fut = build_aggregate ( 1 , 2 , 3 , 4 ) ;
69+ let waker = unsafe { Waker :: from_raw ( RawWaker :: new ( ptr:: null ( ) , & RAW_WAKER ) ) } ;
70+ let mut context = Context :: from_waker ( & waker) ;
71+ assert_eq ! ( unsafe { Pin :: new_unchecked( & mut fut) } . poll( & mut context) , Poll :: Ready ( 10 ) ) ;
72+
73+ let mut fut = includes_never ( false , 4 ) ;
74+ let waker = unsafe { Waker :: from_raw ( RawWaker :: new ( ptr:: null ( ) , & RAW_WAKER ) ) } ;
75+ let mut context = Context :: from_waker ( & waker) ;
76+ assert_eq ! ( unsafe { Pin :: new_unchecked( & mut fut) } . poll( & mut context) , Poll :: Ready ( 16 ) ) ;
4177}
0 commit comments