| From 40d3f2d7ef5835317fe9df9ecc01f4c363def4fd Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <sebastian@centricular.com> |
| Date: Thu, 4 Feb 2021 10:23:01 +0200 |
| Subject: [PATCH] Increment `self.index` before calling |
| `Iterator::self.a.__iterator_get_unchecked` in `Zip` `TrustedRandomAccess` |
| specialization |
| |
| Otherwise if `Iterator::self.a.__iterator_get_unchecked` panics the |
| index would not have been incremented yet and another call to |
| `Iterator::next` would read from the same index again, which is not |
| allowed according to the API contract of `TrustedRandomAccess` for |
| `!Clone`. |
| |
| Fixes https://github.com/rust-lang/rust/issues/81740 |
| |
| (cherry picked from commit 86a4b27475aab52b998c15f5758540697cc9cff0) |
| --- |
| library/core/src/iter/adapters/zip.rs | 7 ++++--- |
| 1 file changed, 4 insertions(+), 3 deletions(-) |
| |
| diff --git a/library/core/src/iter/adapters/zip.rs b/library/core/src/iter/adapters/zip.rs |
| index 98b8dca96140..9f9835345200 100644 |
| --- a/library/core/src/iter/adapters/zip.rs |
| +++ b/library/core/src/iter/adapters/zip.rs |
| @@ -198,12 +198,13 @@ fn next(&mut self) -> Option<(A::Item, B::Item)> { |
| Some((self.a.__iterator_get_unchecked(i), self.b.__iterator_get_unchecked(i))) |
| } |
| } else if A::may_have_side_effect() && self.index < self.a.size() { |
| + let i = self.index; |
| + self.index += 1; |
| // match the base implementation's potential side effects |
| - // SAFETY: we just checked that `self.index` < `self.a.len()` |
| + // SAFETY: we just checked that `i` < `self.a.len()` |
| unsafe { |
| - self.a.__iterator_get_unchecked(self.index); |
| + self.a.__iterator_get_unchecked(i); |
| } |
| - self.index += 1; |
| None |
| } else { |
| None |
| -- |
| 2.31.1 |
| |