From e62e7c15aa59c11383bda850385461b596f0c66e Mon Sep 17 00:00:00 2001 From: Charlie Tonneslan Date: Sun, 17 May 2026 13:13:47 -0400 Subject: [PATCH] PeekNth: don't panic on peek_nth(usize::MAX) n + 1 overflowed when n was usize::MAX, panicking in debug builds. We can't peek at index usize::MAX anyway (would need usize::MAX+1 buffered items), so just return None up front via checked_add. Closes #1067. Signed-off-by: Charlie Tonneslan --- src/peek_nth.rs | 4 ++-- tests/test_std.rs | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/peek_nth.rs b/src/peek_nth.rs index b03a3ef5f..d56fdb0b2 100644 --- a/src/peek_nth.rs +++ b/src/peek_nth.rs @@ -69,7 +69,7 @@ where /// assert_eq!(iter.peek_nth(1), None); /// ``` pub fn peek_nth(&mut self, n: usize) -> Option<&I::Item> { - let unbuffered_items = (n + 1).saturating_sub(self.buf.len()); + let unbuffered_items = n.checked_add(1)?.saturating_sub(self.buf.len()); self.buf.extend(self.iter.by_ref().take(unbuffered_items)); @@ -110,7 +110,7 @@ where /// assert_eq!(iter.peek_nth_mut(1), None); /// ``` pub fn peek_nth_mut(&mut self, n: usize) -> Option<&mut I::Item> { - let unbuffered_items = (n + 1).saturating_sub(self.buf.len()); + let unbuffered_items = n.checked_add(1)?.saturating_sub(self.buf.len()); self.buf.extend(self.iter.by_ref().take(unbuffered_items)); diff --git a/tests/test_std.rs b/tests/test_std.rs index e1bd8cbbc..7793592b5 100644 --- a/tests/test_std.rs +++ b/tests/test_std.rs @@ -829,6 +829,12 @@ fn test_peek_nth() { assert_eq!(iter.peek_nth(0), None); assert_eq!(iter.peek_nth(1), None); + + // Issue #1067: peek_nth(usize::MAX) used to panic in debug builds + // because of the n + 1 overflow. Should just return None now. + let mut iter = peek_nth(nums.iter().copied()); + assert_eq!(iter.peek_nth(usize::MAX), None); + assert_eq!(iter.peek_nth_mut(usize::MAX), None); } #[test]