55#![ stable( feature = "core_array" , since = "1.35.0" ) ]
66
77use crate :: borrow:: { Borrow , BorrowMut } ;
8+ use crate :: clone:: TrivialClone ;
89use crate :: cmp:: Ordering ;
910use crate :: convert:: Infallible ;
1011use crate :: error:: Error ;
11- use crate :: fmt;
1212use crate :: hash:: { self , Hash } ;
1313use crate :: intrinsics:: transmute_unchecked;
1414use crate :: iter:: { UncheckedIterator , repeat_n} ;
@@ -18,6 +18,7 @@ use crate::ops::{
1818} ;
1919use crate :: ptr:: { null, null_mut} ;
2020use crate :: slice:: { Iter , IterMut } ;
21+ use crate :: { fmt, ptr} ;
2122
2223mod ascii;
2324mod drain;
@@ -451,6 +452,9 @@ impl<T: Clone, const N: usize> Clone for [T; N] {
451452 }
452453}
453454
455+ #[ unstable( feature = "trivial_clone" , issue = "none" ) ]
456+ unsafe impl < T : TrivialClone , const N : usize > TrivialClone for [ T ; N ] { }
457+
454458trait SpecArrayClone : Clone {
455459 fn clone < const N : usize > ( array : & [ Self ; N ] ) -> [ Self ; N ] ;
456460}
@@ -462,10 +466,12 @@ impl<T: Clone> SpecArrayClone for T {
462466 }
463467}
464468
465- impl < T : Copy > SpecArrayClone for T {
469+ impl < T : TrivialClone > SpecArrayClone for T {
466470 #[ inline]
467471 fn clone < const N : usize > ( array : & [ T ; N ] ) -> [ T ; N ] {
468- * array
472+ // SAFETY: `TrivialClone` implies that this is equivalent to calling
473+ // `Clone` on every element.
474+ unsafe { ptr:: read ( array) }
469475 }
470476}
471477
0 commit comments