File tree 1 file changed +13
-3
lines changed
1 file changed +13
-3
lines changed Original file line number Diff line number Diff line change
1
+ use alloc:: boxed:: Box ;
1
2
use std:: borrow:: Cow ;
2
3
use std:: cell:: Cell ;
3
4
use std:: collections:: TryReserveError :: * ;
@@ -1056,14 +1057,14 @@ fn test_from_iter_specialization_panic_during_drop_leaks() {
1056
1057
1057
1058
#[ derive( Debug ) ]
1058
1059
enum Droppable {
1059
- DroppedTwice ( Box < i32 > ) ,
1060
+ DroppedTwice ,
1060
1061
PanicOnDrop ,
1061
1062
}
1062
1063
1063
1064
impl Drop for Droppable {
1064
1065
fn drop ( & mut self ) {
1065
1066
match self {
1066
- Droppable :: DroppedTwice ( _ ) => {
1067
+ Droppable :: DroppedTwice => {
1067
1068
unsafe {
1068
1069
DROP_COUNTER += 1 ;
1069
1070
}
@@ -1078,12 +1079,21 @@ fn test_from_iter_specialization_panic_during_drop_leaks() {
1078
1079
}
1079
1080
}
1080
1081
1082
+ let mut to_free: * mut Droppable = core:: ptr:: null_mut ( ) ;
1083
+ let mut cap = 0 ;
1084
+
1081
1085
let _ = std:: panic:: catch_unwind ( AssertUnwindSafe ( || {
1082
- let v = vec ! [ Droppable :: DroppedTwice ( Box :: new( 123 ) ) , Droppable :: PanicOnDrop ] ;
1086
+ let mut v = vec ! [ Droppable :: DroppedTwice , Droppable :: PanicOnDrop ] ;
1087
+ to_free = v. as_mut_ptr ( ) ;
1088
+ cap = v. capacity ( ) ;
1083
1089
let _ = v. into_iter ( ) . take ( 0 ) . collect :: < Vec < _ > > ( ) ;
1084
1090
} ) ) ;
1085
1091
1086
1092
assert_eq ! ( unsafe { DROP_COUNTER } , 1 ) ;
1093
+ // clean up the leak to keep miri happy
1094
+ unsafe {
1095
+ Vec :: from_raw_parts ( to_free, 0 , cap) ;
1096
+ }
1087
1097
}
1088
1098
1089
1099
#[ test]
You can’t perform that action at this time.
0 commit comments