about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-11-10 16:12:03 +0000
committerbors <bors@rust-lang.org>2014-11-10 16:12:03 +0000
commita30b72bb1420620d5b36dbd221a81374d3668271 (patch)
tree9eed1e1ce2426fbfe1de4f953696ada3603307f8 /src
parentf18757305afb77c731979e6541dcf26b36a280a4 (diff)
parentc0a7d557dbea830ae581ecb3f77f08b7e4daad4a (diff)
downloadrust-a30b72bb1420620d5b36dbd221a81374d3668271.tar.gz
rust-a30b72bb1420620d5b36dbd221a81374d3668271.zip
auto merge of #18802 : bkoropoff/rust/issue-18769, r=luqmana
Drill down the loan path for `McDeclared` references as well since it might lead to an upvar.  Closes #18769
Diffstat (limited to 'src')
-rw-r--r--src/librustc/middle/borrowck/gather_loans/mod.rs4
-rw-r--r--src/test/run-pass/unboxed-closures-move-mutable.rs12
2 files changed, 13 insertions, 3 deletions
diff --git a/src/librustc/middle/borrowck/gather_loans/mod.rs b/src/librustc/middle/borrowck/gather_loans/mod.rs
index 1a12828922c..7d893a0533a 100644
--- a/src/librustc/middle/borrowck/gather_loans/mod.rs
+++ b/src/librustc/middle/borrowck/gather_loans/mod.rs
@@ -395,10 +395,10 @@ impl<'a, 'tcx> GatherLoanCtxt<'a, 'tcx> {
             LpUpvar(ty::UpvarId{ var_id: local_id, closure_expr_id: _ }) => {
                 self.tcx().used_mut_nodes.borrow_mut().insert(local_id);
             }
-            LpExtend(ref base, mc::McInherited, _) => {
+            LpExtend(ref base, mc::McInherited, _) |
+            LpExtend(ref base, mc::McDeclared, _) => {
                 self.mark_loan_path_as_mutated(&**base);
             }
-            LpExtend(_, mc::McDeclared, _) |
             LpExtend(_, mc::McImmutable, _) => {
                 // Nothing to do.
             }
diff --git a/src/test/run-pass/unboxed-closures-move-mutable.rs b/src/test/run-pass/unboxed-closures-move-mutable.rs
index f7e1e46e54d..43a44eca2d0 100644
--- a/src/test/run-pass/unboxed-closures-move-mutable.rs
+++ b/src/test/run-pass/unboxed-closures-move-mutable.rs
@@ -14,7 +14,9 @@
 // Test that mutating a mutable upvar in a capture-by-value unboxed
 // closure does not ice (issue #18238) and marks the upvar as used
 // mutably so we do not get a spurious warning about it not needing to
-// be declared mutable (issue #18336).
+// be declared mutable (issue #18336 and #18769)
+
+fn set(x: &mut uint) { *x = 42; }
 
 fn main() {
     {
@@ -25,4 +27,12 @@ fn main() {
         let mut x = 0u;
         move |:| x += 1;
     }
+    {
+        let mut x = 0u;
+        move |&mut:| set(&mut x);
+    }
+    {
+        let mut x = 0u;
+        move |:| set(&mut x);
+    }
 }