diff --git a/src/libcore/char.rs b/src/libcore/char.rs index 2f56238a4638..4420eff06ed2 100644 --- a/src/libcore/char.rs +++ b/src/libcore/char.rs @@ -905,7 +905,12 @@ impl> Iterator for DecodeUtf8 { #[inline] fn size_hint(&self) -> (usize, Option) { - self.0.size_hint() + let len = self.iter.len(); + + // A code point is at most 4 bytes long. + let min_code_points = len / 4; + + (min_code_points, Some(len)) } } diff --git a/src/libcore/iter/traits.rs b/src/libcore/iter/traits.rs index 5e4622f804af..c3aebc4fb23c 100644 --- a/src/libcore/iter/traits.rs +++ b/src/libcore/iter/traits.rs @@ -903,7 +903,12 @@ impl Iterator for ResultShunt } fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() + if self.error.is_some() { + (0, Some(0)) + } else { + let (_, upper) = self.iter.size_hint(); + (0, upper) + } } }