about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBrian Koropoff <bkoropoff@gmail.com>2014-10-25 21:39:34 -0700
committerBrian Koropoff <bkoropoff@gmail.com>2014-10-25 21:39:34 -0700
commit2877e47ea7409ff4ea820b0a6668111baf441377 (patch)
tree83e573a2ce8a9eb0461ebd352b50117a4665601d /src
parentf168c12c5629afd45c9b3ed250350bf830b99642 (diff)
downloadrust-2877e47ea7409ff4ea820b0a6668111baf441377.tar.gz
rust-2877e47ea7409ff4ea820b0a6668111baf441377.zip
Ensure unboxed closure upvars are marked as used mutably
Closes #18336
Diffstat (limited to 'src')
-rw-r--r--src/librustc/middle/borrowck/check_loans.rs10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/librustc/middle/borrowck/check_loans.rs b/src/librustc/middle/borrowck/check_loans.rs
index 5f09cafb5e2..5d984168a31 100644
--- a/src/librustc/middle/borrowck/check_loans.rs
+++ b/src/librustc/middle/borrowck/check_loans.rs
@@ -825,12 +825,20 @@ impl<'a, 'tcx> CheckLoanCtxt<'a, 'tcx> {
                     mc::cat_rvalue(..) |
                     mc::cat_static_item |
                     mc::cat_deref(_, _, mc::UnsafePtr(..)) |
-                    mc::cat_deref(_, _, mc::BorrowedPtr(..)) |
                     mc::cat_deref(_, _, mc::Implicit(..)) => {
                         assert_eq!(cmt.mutbl, mc::McDeclared);
                         return;
                     }
 
+                    mc::cat_deref(_, _, mc::BorrowedPtr(..)) => {
+                        assert_eq!(cmt.mutbl, mc::McDeclared);
+                        // We need to drill down to upvar if applicable
+                        match cmt.upvar() {
+                            Some(b) => cmt = b,
+                            None => return
+                        }
+                    }
+
                     mc::cat_discr(b, _) |
                     mc::cat_deref(b, _, mc::OwnedPtr) => {
                         assert_eq!(cmt.mutbl, mc::McInherited);