diff --git a/src/libcollections/vec.rs b/src/libcollections/vec.rs index 54fd19dbe30..4a727adb797 100644 --- a/src/libcollections/vec.rs +++ b/src/libcollections/vec.rs @@ -1571,7 +1571,24 @@ impl Vec { #[stable(feature = "extend_ref", since = "1.2.0")] impl<'a, T: 'a + Copy> Extend<&'a T> for Vec { fn extend>(&mut self, iter: I) { - self.extend(iter.into_iter().cloned()); + >::extend_vec(iter, self); + } +} + +// helper trait for specialization of Vec's Extend impl +trait SpecExtendVec { + fn extend_vec(self, vec: &mut Vec); +} + +impl <'a, T: 'a + Copy, I: IntoIterator> SpecExtendVec for I { + default fn extend_vec(self, vec: &mut Vec) { + vec.extend(self.into_iter().cloned()); + } +} + +impl<'a, T: Copy> SpecExtendVec for &'a [T] { + fn extend_vec(self, vec: &mut Vec) { + vec.extend_from_slice(self); } }