about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTim Vermeulen <tvermeulen@me.com>2022-07-18 21:10:47 +0200
committerTim Vermeulen <tvermeulen@me.com>2022-07-18 21:10:47 +0200
commit50c612faef43799497aa33fa6a92bb3a7f5a9401 (patch)
tree0c2e1b6ebdd3d287ec7f8c1ef05a861e32b71e3d
parent144227dae949fb98896a2ba077d8fe7f36c3238e (diff)
downloadrust-50c612faef43799497aa33fa6a92bb3a7f5a9401.tar.gz
rust-50c612faef43799497aa33fa6a92bb3a7f5a9401.zip
Fix `Skip::next` for non-fused inner iterators
-rw-r--r--library/core/src/iter/adapters/skip.rs2
-rw-r--r--library/core/tests/iter/adapters/skip.rs8
2 files changed, 9 insertions, 1 deletions
diff --git a/library/core/src/iter/adapters/skip.rs b/library/core/src/iter/adapters/skip.rs
index ea1da8ba434..2c283100f07 100644
--- a/library/core/src/iter/adapters/skip.rs
+++ b/library/core/src/iter/adapters/skip.rs
@@ -33,7 +33,7 @@ where
     #[inline]
     fn next(&mut self) -> Option<I::Item> {
         if unlikely(self.n > 0) {
-            self.iter.nth(crate::mem::take(&mut self.n) - 1);
+            self.iter.nth(crate::mem::take(&mut self.n) - 1)?;
         }
         self.iter.next()
     }
diff --git a/library/core/tests/iter/adapters/skip.rs b/library/core/tests/iter/adapters/skip.rs
index 0c464bdd03a..a73d9861dfb 100644
--- a/library/core/tests/iter/adapters/skip.rs
+++ b/library/core/tests/iter/adapters/skip.rs
@@ -1,5 +1,7 @@
 use core::iter::*;
 
+use super::Unfuse;
+
 #[test]
 fn test_iterator_skip() {
     let xs = [0, 1, 2, 3, 5, 13, 15, 16, 17, 19, 20, 30];
@@ -190,3 +192,9 @@ fn test_skip_nth_back() {
     it.by_ref().skip(2).nth_back(10);
     assert_eq!(it.next_back(), Some(&1));
 }
+
+#[test]
+fn test_skip_non_fused() {
+    let non_fused = Unfuse::new(0..10);
+    let _ = non_fused.skip(20).next();
+}