@@ -12,7 +12,7 @@ use core::panic::{BoxMeUp, PanicInfo, Location};
12
12
use crate :: any:: Any ;
13
13
use crate :: fmt;
14
14
use crate :: intrinsics;
15
- use crate :: mem;
15
+ use crate :: mem:: { self , ManuallyDrop } ;
16
16
use crate :: ptr;
17
17
use crate :: raw;
18
18
use crate :: sync:: atomic:: { AtomicBool , Ordering } ;
@@ -227,10 +227,9 @@ pub use realstd::rt::update_panic_count;
227
227
228
228
/// Invoke a closure, capturing the cause of an unwinding panic if one occurs.
229
229
pub unsafe fn r#try < R , F : FnOnce ( ) -> R > ( f : F ) -> Result < R , Box < dyn Any + Send > > {
230
- #[ allow( unions_with_drop_fields) ]
231
230
union Data < F , R > {
232
- f : F ,
233
- r : R ,
231
+ f : ManuallyDrop < F > ,
232
+ r : ManuallyDrop < R > ,
234
233
}
235
234
236
235
// We do some sketchy operations with ownership here for the sake of
@@ -261,7 +260,7 @@ pub unsafe fn r#try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>>
261
260
let mut any_data = 0 ;
262
261
let mut any_vtable = 0 ;
263
262
let mut data = Data {
264
- f,
263
+ f : ManuallyDrop :: new ( f )
265
264
} ;
266
265
267
266
let r = __rust_maybe_catch_panic ( do_call :: < F , R > ,
@@ -271,7 +270,7 @@ pub unsafe fn r#try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>>
271
270
272
271
return if r == 0 {
273
272
debug_assert ! ( update_panic_count( 0 ) == 0 ) ;
274
- Ok ( data. r )
273
+ Ok ( ManuallyDrop :: into_inner ( data. r ) )
275
274
} else {
276
275
update_panic_count ( -1 ) ;
277
276
debug_assert ! ( update_panic_count( 0 ) == 0 ) ;
@@ -284,8 +283,8 @@ pub unsafe fn r#try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>>
284
283
fn do_call < F : FnOnce ( ) -> R , R > ( data : * mut u8 ) {
285
284
unsafe {
286
285
let data = data as * mut Data < F , R > ;
287
- let f = ptr:: read ( & mut ( * data) . f ) ;
288
- ptr:: write ( & mut ( * data) . r , f ( ) ) ;
286
+ let f = ptr:: read ( & mut * ( * data) . f ) ;
287
+ ptr:: write ( & mut * ( * data) . r , f ( ) ) ;
289
288
}
290
289
}
291
290
}
0 commit comments