@@ -16,3 +16,39 @@ fn unitialized_zero_size_box() {
1616 NonNull :: <MaybeUninit <String >>:: dangling( ) . as_ptr( ) ,
1717 ) ;
1818}
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