diff --git a/library/alloc/src/vec.rs b/library/alloc/src/vec.rs index ffd6f5b31d4..272ad748bc7 100644 --- a/library/alloc/src/vec.rs +++ b/library/alloc/src/vec.rs @@ -2108,7 +2108,13 @@ trait SpecFrom { fn from_iter(iter: I) -> Self; } -impl SpecFrom for Vec +// Another specialization trait for Vec::from_iter +// necessary to manually prioritize overlapping specializations +trait SpecFromNested { + fn from_iter(iter: I) -> Self; +} + +impl SpecFromNested for Vec where I: Iterator, { @@ -2137,6 +2143,28 @@ where } } +impl SpecFromNested for Vec +where + I: TrustedLen, +{ + fn from_iter(iterator: I) -> Self { + let mut vector = Vec::new(); + // must delegate to spec_extend() since extend() itself delegates + // to spec_from for empty Vecs + vector.spec_extend(iterator); + vector + } +} + +impl SpecFrom for Vec +where + I: Iterator, +{ + default fn from_iter(iterator: I) -> Self { + SpecFromNested::from_iter(iterator) + } +} + struct InPlaceDrop { inner: *mut T, dst: *mut T,