diff options
| author | bors <bors@rust-lang.org> | 2017-12-06 18:30:15 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-12-06 18:30:15 +0000 |
| commit | cf30759a8409bee031ac252ee207452ab4804467 (patch) | |
| tree | 2365481701689ab3b4fe5065389c553ee0139271 /src/libcore | |
| parent | 833785b090c30d4a359d901fb41bfafbe1607ce9 (diff) | |
| parent | 9d3558725b9110beaa6740e88847e3addc9c2d0d (diff) | |
| download | rust-cf30759a8409bee031ac252ee207452ab4804467.tar.gz rust-cf30759a8409bee031ac252ee207452ab4804467.zip | |
Auto merge of #46268 - arielb1:union-borrow, r=nikomatsakis
MIR borrowck: implement union-and-array-compatible semantics Fixes #44831. Fixes #44834. Fixes #45537. Fixes #45696 (by implementing DerefPure semantics, which is what we want going forward). r? @nikomatsakis
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/cell.rs | 6 | ||||
| -rw-r--r-- | src/libcore/iter/mod.rs | 18 |
2 files changed, 16 insertions, 8 deletions
diff --git a/src/libcore/cell.rs b/src/libcore/cell.rs index d4cd3f6264e..93cfc845b1f 100644 --- a/src/libcore/cell.rs +++ b/src/libcore/cell.rs @@ -1084,9 +1084,11 @@ impl<'b, T: ?Sized> RefMut<'b, T> { pub fn map<U: ?Sized, F>(orig: RefMut<'b, T>, f: F) -> RefMut<'b, U> where F: FnOnce(&mut T) -> &mut U { + // FIXME(nll-rfc#40): fix borrow-check + let RefMut { value, borrow } = orig; RefMut { - value: f(orig.value), - borrow: orig.borrow, + value: f(value), + borrow: borrow, } } } diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs index e173f43b5e6..06c29b47bf9 100644 --- a/src/libcore/iter/mod.rs +++ b/src/libcore/iter/mod.rs @@ -1776,12 +1776,18 @@ impl<I: Iterator> Iterator for Peekable<I> { #[inline] fn nth(&mut self, n: usize) -> Option<I::Item> { - match self.peeked.take() { - // the .take() below is just to avoid "move into pattern guard" - Some(ref mut v) if n == 0 => v.take(), - Some(None) => None, - Some(Some(_)) => self.iter.nth(n - 1), - None => self.iter.nth(n), + // FIXME(#6393): merge these when borrow-checking gets better. + if n == 0 { + match self.peeked.take() { + Some(v) => v, + None => self.iter.nth(n), + } + } else { + match self.peeked.take() { + Some(None) => None, + Some(Some(_)) => self.iter.nth(n - 1), + None => self.iter.nth(n), + } } } |
