diff options
| author | bors <bors@rust-lang.org> | 2014-11-10 16:12:03 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-11-10 16:12:03 +0000 |
| commit | a30b72bb1420620d5b36dbd221a81374d3668271 (patch) | |
| tree | 9eed1e1ce2426fbfe1de4f953696ada3603307f8 /src | |
| parent | f18757305afb77c731979e6541dcf26b36a280a4 (diff) | |
| parent | c0a7d557dbea830ae581ecb3f77f08b7e4daad4a (diff) | |
| download | rust-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.rs | 4 | ||||
| -rw-r--r-- | src/test/run-pass/unboxed-closures-move-mutable.rs | 12 |
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); + } } |
