From b19fda0ceb820af57f00976951dba95a3c0419aa Mon Sep 17 00:00:00 2001 From: Ulrik Sverdrup Date: Fri, 13 Feb 2015 21:20:16 +0100 Subject: [PATCH] Remove ExactSizeIterator from 64-bit ranges. Fixes #22047 Range and Range may be longer than usize::MAX on 32-bit platforms, and thus they cannot fulfill the protocol for ExactSizeIterator. We don't want a nonobvious platform dependency in basic iterator traits, so the trait impl is removed. The logic of this change assumes that usize is at least 32-bit. This is technically a breaking change; note that Range and Range are always ExactSizeIterators. [breaking-change] --- src/libcore/iter.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libcore/iter.rs b/src/libcore/iter.rs index 7740cd6867cbd..06aba2cb08ef3 100644 --- a/src/libcore/iter.rs +++ b/src/libcore/iter.rs @@ -2676,9 +2676,9 @@ impl Iterator for ::ops::Range { } } +// Ranges of u64 and i64 are excluded because they cannot guarantee having +// a length <= usize::MAX, which is required by ExactSizeIterator. range_exact_iter_impl!(usize u8 u16 u32 isize i8 i16 i32); -#[cfg(target_pointer_width = "64")] -range_exact_iter_impl!(u64 i64); #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for ::ops::Range {