6
6
fn main ( ) {
7
7
error_buffer_wrapper ( ) ;
8
8
error_retry_closure ( ) ;
9
+ error_retry_closure_uninit ( ) ;
9
10
error_retry_indirect_closure ( ) ;
10
11
error_empty_slice ( ) ;
11
12
error_array_by_value ( ) ;
@@ -40,8 +41,8 @@ fn error_retry_closure() {
40
41
use rustix:: io;
41
42
use rustix:: io:: retry_on_intr;
42
43
43
- fn b < B : Buffer < u8 > > ( _ : B ) -> io:: Result < ( ) > {
44
- Ok ( ( ) )
44
+ fn b < B : Buffer < u8 > > ( b : B ) -> io:: Result < B :: Output > {
45
+ unsafe { Ok ( b . assume_init ( 0 ) ) }
45
46
}
46
47
47
48
let mut event_buf = [ 0 ; 4 ] ;
@@ -58,6 +59,33 @@ fn error_retry_closure() {
58
59
retry_on_intr ( || b ( & mut * event_buf_slice) ) . unwrap ( ) ;
59
60
}
60
61
62
+ fn error_retry_closure_uninit ( ) {
63
+ use rustix:: buffer:: Buffer ;
64
+ use rustix:: io;
65
+ use std:: mem:: MaybeUninit ;
66
+
67
+ fn b < B : Buffer < u8 > > ( b : B ) -> io:: Result < B :: Output > {
68
+ unsafe { Ok ( b. assume_init ( 0 ) ) }
69
+ }
70
+
71
+ let mut event_buf = [ MaybeUninit :: < u8 > :: uninit ( ) ; 4 ] ;
72
+
73
+ // Ideally we'd write this, but it gets:
74
+ // "captured variable cannot escape `FnMut` closure body".
75
+ /*
76
+ rustix::io::retry_on_intr(|| b(&mut event_buf)).unwrap();
77
+ */
78
+
79
+ // The fix: Don't use `retry_on_intr`, unfortunately.
80
+ loop {
81
+ match b ( & mut event_buf) {
82
+ Ok ( ( _init, _unini) ) => break ,
83
+ Err ( io:: Errno :: INTR ) => continue ,
84
+ Err ( err) => Err ( err) . unwrap ( ) ,
85
+ }
86
+ }
87
+ }
88
+
61
89
fn error_retry_indirect_closure ( ) {
62
90
use rustix:: buffer:: Buffer ;
63
91
use rustix:: io;
0 commit comments