diff --git a/library/core/src/iter/adapters/zip.rs b/library/core/src/iter/adapters/zip.rs index c5e199c30821d..e515572b4a7aa 100644 --- a/library/core/src/iter/adapters/zip.rs +++ b/library/core/src/iter/adapters/zip.rs @@ -1,7 +1,7 @@ use crate::cmp; use crate::fmt::{self, Debug}; use crate::iter::{ - FusedIterator, InPlaceIterable, SourceIter, TrustedFused, TrustedLen, UncheckedIterator, + FusedIterator, InPlaceIterable, Repeat, SourceIter, TrustedFused, TrustedLen, UncheckedIterator, }; use crate::num::NonZero; @@ -413,6 +413,22 @@ where { } +#[stable(feature = "exact_size_zip_repeat", since = "CURRENT_RUSTC_VERSION")] +impl ExactSizeIterator for Zip> +where + A: ExactSizeIterator, + B: Clone, +{ +} + +#[stable(feature = "exact_size_zip_repeat", since = "CURRENT_RUSTC_VERSION")] +impl ExactSizeIterator for Zip, B> +where + A: Clone, + B: ExactSizeIterator, +{ +} + #[doc(hidden)] #[unstable(feature = "trusted_random_access", issue = "none")] unsafe impl TrustedRandomAccess for Zip diff --git a/library/coretests/tests/iter/adapters/zip.rs b/library/coretests/tests/iter/adapters/zip.rs index 063e226a61ce0..4a51ee9847c29 100644 --- a/library/coretests/tests/iter/adapters/zip.rs +++ b/library/coretests/tests/iter/adapters/zip.rs @@ -370,3 +370,18 @@ fn test_issue_82291() { zip.next(); assert_eq!(called.get(), 1); } + +#[test] +fn zip_repeat_bounds() { + let iter = [1, 2, 3].into_iter().zip(repeat(2)); + let (lower, upper) = iter.size_hint(); + assert_eq!(lower, 3); + assert_eq!(upper, Some(3)); + assert_eq!(iter.len(), 3); + + let iter = repeat(2).zip([1, 2, 3].into_iter()); + let (lower, upper) = iter.size_hint(); + assert_eq!(lower, 3); + assert_eq!(upper, Some(3)); + assert_eq!(iter.len(), 3); +}