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);
+}