diff --git a/src/libcore/array.rs b/src/libcore/array.rs index c986914440de0..40c8250d73e81 100644 --- a/src/libcore/array.rs +++ b/src/libcore/array.rs @@ -27,7 +27,7 @@ use default::Default; use fmt; use hash::{Hash, self}; use iter::IntoIterator; -use marker::{Copy, Sized, Unsize}; +use marker::{Sized, Unsize}; use option::Option; use slice::{Iter, IterMut, SliceExt}; @@ -94,13 +94,6 @@ macro_rules! array_impls { } } - #[stable(feature = "rust1", since = "1.0.0")] - impl Clone for [T; $N] { - fn clone(&self) -> [T; $N] { - *self - } - } - #[stable(feature = "rust1", since = "1.0.0")] impl Hash for [T; $N] { fn hash(&self, state: &mut H) { @@ -210,3 +203,30 @@ macro_rules! array_impl_default { } array_impl_default!{32, T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T} + +macro_rules! array_impl_clone { + {$n:expr, $i:expr, $($idx:expr,)*} => { + #[stable(feature = "rust1", since = "1.0.0")] + impl Clone for [T; $n] { + fn clone(&self) -> [T; $n] { + [self[$i-$i].clone(), $(self[$i-$idx].clone()),*] + } + } + array_impl_clone!{$i, $($idx,)*} + }; + {$n:expr,} => { + #[stable(feature = "rust1", since = "1.0.0")] + impl Clone for [T; 0] { + fn clone(&self) -> [T; 0] { + [] + } + } + }; +} + +array_impl_clone! { + 32, 31, 30, + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, + 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, +} diff --git a/src/librustc/middle/traits/select.rs b/src/librustc/middle/traits/select.rs index 0b0f6c0b998fc..3e7e1caac7914 100644 --- a/src/librustc/middle/traits/select.rs +++ b/src/librustc/middle/traits/select.rs @@ -1720,9 +1720,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { } } - ty::TyArray(element_ty, _) => { + ty::TyArray(element_ty, n) => { // [T; n] match bound { + ty::BoundCopy if n == 0 => ok_if(Vec::new()), ty::BoundCopy => ok_if(vec![element_ty]), ty::BoundSized => ok_if(Vec::new()), ty::BoundSync | ty::BoundSend => {