@@ -16,7 +16,7 @@ use cell::RefCell;
16
16
use core:: panic:: { PanicInfo , Location } ;
17
17
use fmt;
18
18
use intrinsics;
19
- use mem;
19
+ use mem:: { self , ManuallyDrop } ;
20
20
use ptr;
21
21
use raw;
22
22
use sys:: stdio:: panic_output;
@@ -238,8 +238,8 @@ pub use realstd::rt::update_panic_count;
238
238
pub unsafe fn try < R , F : FnOnce ( ) -> R > ( f : F ) -> Result < R , Box < dyn Any + Send > > {
239
239
#[ allow( unions_with_drop_fields) ]
240
240
union Data < F , R > {
241
- f : F ,
242
- r : R ,
241
+ f : ManuallyDrop < F > ,
242
+ r : ManuallyDrop < R > ,
243
243
}
244
244
245
245
// We do some sketchy operations with ownership here for the sake of
@@ -270,7 +270,7 @@ pub unsafe fn try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>> {
270
270
let mut any_data = 0 ;
271
271
let mut any_vtable = 0 ;
272
272
let mut data = Data {
273
- f,
273
+ f : ManuallyDrop :: new ( f )
274
274
} ;
275
275
276
276
let r = __rust_maybe_catch_panic ( do_call :: < F , R > ,
@@ -280,7 +280,7 @@ pub unsafe fn try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>> {
280
280
281
281
return if r == 0 {
282
282
debug_assert ! ( update_panic_count( 0 ) == 0 ) ;
283
- Ok ( data. r )
283
+ Ok ( ManuallyDrop :: into_inner ( data. r ) )
284
284
} else {
285
285
update_panic_count ( -1 ) ;
286
286
debug_assert ! ( update_panic_count( 0 ) == 0 ) ;
@@ -293,8 +293,8 @@ pub unsafe fn try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>> {
293
293
fn do_call < F : FnOnce ( ) -> R , R > ( data : * mut u8 ) {
294
294
unsafe {
295
295
let data = data as * mut Data < F , R > ;
296
- let f = ptr:: read ( & mut ( * data) . f ) ;
297
- ptr:: write ( & mut ( * data) . r , f ( ) ) ;
296
+ let f = ptr:: read ( & mut * ( * data) . f ) ;
297
+ ptr:: write ( & mut * ( * data) . r , f ( ) ) ;
298
298
}
299
299
}
300
300
}
0 commit comments