From ccb18f47e25daee22f151f3d21774eec38abdbe3 Mon Sep 17 00:00:00 2001
From: Patrick Walton <pcwalton@mimiga.net>
Date: Sat, 21 Dec 2013 17:28:21 -0800
Subject: [PATCH] librustc: De-`@mut` the `used_mut_nodes` table in the type
 context

---
 src/librustc/middle/borrowck/check_loans.rs      | 5 ++++-
 src/librustc/middle/borrowck/gather_loans/mod.rs | 5 ++++-
 src/librustc/middle/lint.rs                      | 3 ++-
 src/librustc/middle/ty.rs                        | 4 ++--
 4 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/src/librustc/middle/borrowck/check_loans.rs b/src/librustc/middle/borrowck/check_loans.rs
index f2a6336f3b8..6176f5601c1 100644
--- a/src/librustc/middle/borrowck/check_loans.rs
+++ b/src/librustc/middle/borrowck/check_loans.rs
@@ -357,7 +357,10 @@ impl<'a> CheckLoanCtxt<'a> {
                     mc::cat_local(id) |
                     mc::cat_arg(id) |
                     mc::cat_self(id) => {
-                        this.tcx().used_mut_nodes.insert(id);
+                        let mut used_mut_nodes = this.tcx()
+                                                     .used_mut_nodes
+                                                     .borrow_mut();
+                        used_mut_nodes.get().insert(id);
                         return;
                     }
 
diff --git a/src/librustc/middle/borrowck/gather_loans/mod.rs b/src/librustc/middle/borrowck/gather_loans/mod.rs
index 8476b27ddb6..fa0af8526cf 100644
--- a/src/librustc/middle/borrowck/gather_loans/mod.rs
+++ b/src/librustc/middle/borrowck/gather_loans/mod.rs
@@ -607,7 +607,10 @@ impl<'a> GatherLoanCtxt<'a> {
 
         match *loan_path {
             LpVar(local_id) => {
-                self.tcx().used_mut_nodes.insert(local_id);
+                let mut used_mut_nodes = self.tcx()
+                                             .used_mut_nodes
+                                             .borrow_mut();
+                used_mut_nodes.get().insert(local_id);
             }
             LpExtend(base, mc::McInherited, _) => {
                 self.mark_loan_path_as_mutated(base);
diff --git a/src/librustc/middle/lint.rs b/src/librustc/middle/lint.rs
index fd4b97aca18..abba8872532 100644
--- a/src/librustc/middle/lint.rs
+++ b/src/librustc/middle/lint.rs
@@ -1038,7 +1038,8 @@ fn check_unused_mut_pat(cx: &Context, p: &ast::Pat) {
                 }
             };
 
-            if !initial_underscore && !cx.tcx.used_mut_nodes.contains(&p.id) {
+            let used_mut_nodes = cx.tcx.used_mut_nodes.borrow();
+            if !initial_underscore && !used_mut_nodes.get().contains(&p.id) {
                 cx.span_lint(unused_mut, p.span,
                              "variable does not need to be mutable");
             }
diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs
index 4e6020164b3..2a2245cfe26 100644
--- a/src/librustc/middle/ty.rs
+++ b/src/librustc/middle/ty.rs
@@ -353,7 +353,7 @@ struct ctxt_ {
     // Set of nodes which mark locals as mutable which end up getting used at
     // some point. Local variable definitions not in this set can be warned
     // about.
-    used_mut_nodes: @mut HashSet<ast::NodeId>,
+    used_mut_nodes: RefCell<HashSet<ast::NodeId>>,
 
     // vtable resolution information for impl declarations
     impl_vtables: typeck::impl_vtable_map,
@@ -1005,7 +1005,7 @@ pub fn mk_ctxt(s: session::Session,
         inherent_impls: RefCell::new(HashMap::new()),
         impls: RefCell::new(HashMap::new()),
         used_unsafe: RefCell::new(HashSet::new()),
-        used_mut_nodes: @mut HashSet::new(),
+        used_mut_nodes: RefCell::new(HashSet::new()),
         impl_vtables: RefCell::new(HashMap::new()),
         populated_external_types: @mut HashSet::new(),
         populated_external_traits: @mut HashSet::new(),