about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2017-12-06 18:30:15 +0000
committerbors <bors@rust-lang.org>2017-12-06 18:30:15 +0000
commitcf30759a8409bee031ac252ee207452ab4804467 (patch)
tree2365481701689ab3b4fe5065389c553ee0139271 /src/libcore
parent833785b090c30d4a359d901fb41bfafbe1607ce9 (diff)
parent9d3558725b9110beaa6740e88847e3addc9c2d0d (diff)
downloadrust-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.rs6
-rw-r--r--src/libcore/iter/mod.rs18
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),
+            }
         }
     }