@@ -14,6 +14,32 @@ pub async fn foo(x: &u32, y: u32) -> u32 {
14
14
* x + y + * a
15
15
}
16
16
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
+
17
43
fn raw_waker_clone ( _this : * const ( ) ) -> RawWaker {
18
44
panic ! ( "unimplemented" ) ;
19
45
}
@@ -38,4 +64,14 @@ fn main() {
38
64
let waker = unsafe { Waker :: from_raw ( RawWaker :: new ( ptr:: null ( ) , & RAW_WAKER ) ) } ;
39
65
let mut context = Context :: from_waker ( & waker) ;
40
66
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 ) ) ;
41
77
}
0 commit comments