@@ -16,3 +16,39 @@ fn unitialized_zero_size_box() {
16
16
NonNull :: <MaybeUninit <String >>:: dangling( ) . as_ptr( ) ,
17
17
) ;
18
18
}
19
+
20
+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
21
+ struct Dummy {
22
+ _data : u8 ,
23
+ }
24
+
25
+ #[ test]
26
+ fn box_clone_and_clone_from_equivalence ( ) {
27
+ for size in ( 0 ..8 ) . map ( |i| 2usize . pow ( i) ) {
28
+ let control = vec ! [ Dummy { _data: 42 } ; size] . into_boxed_slice ( ) ;
29
+ let clone = control. clone ( ) ;
30
+ let mut copy = vec ! [ Dummy { _data: 84 } ; size] . into_boxed_slice ( ) ;
31
+ copy. clone_from ( & control) ;
32
+ assert_eq ! ( control, clone) ;
33
+ assert_eq ! ( control, copy) ;
34
+ }
35
+ }
36
+
37
+ #[ test]
38
+ fn box_clone_from_ptr_stability ( ) {
39
+ for size in ( 0 ..8 ) . map ( |i| 2usize . pow ( i) ) {
40
+ let control = vec ! [ Dummy { _data: 42 } ; size] . into_boxed_slice ( ) ;
41
+ let mut copy = vec ! [ Dummy { _data: 84 } ; size] . into_boxed_slice ( ) ;
42
+ let copy_raw = copy. as_ptr ( ) as usize ;
43
+ copy. clone_from ( & control) ;
44
+ assert_eq ! ( copy. as_ptr( ) as usize , copy_raw) ;
45
+ }
46
+
47
+ for size in ( 0 ..8 ) . map ( |i| 2usize . pow ( i) ) {
48
+ let control = vec ! [ Dummy { _data: 42 } ; size] . into_boxed_slice ( ) ;
49
+ let mut copy = vec ! [ Dummy { _data: 84 } ; size + 1 ] . into_boxed_slice ( ) ;
50
+ let copy_raw = copy. as_ptr ( ) as usize ;
51
+ copy. clone_from ( & control) ;
52
+ assert_ne ! ( copy. as_ptr( ) as usize , copy_raw) ;
53
+ }
54
+ }
0 commit comments