about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2013-05-14 09:26:21 -0400
committerNiko Matsakis <niko@alum.mit.edu>2013-05-14 09:26:21 -0400
commitd204cfd739bfecb6252b54c5007a28559d0f9a73 (patch)
tree144e2720cf3d8105ded384c851db1f69b4efe8b4
parent5a2f65fb5035627b8fb0b1ce0e927a492d55e3a4 (diff)
downloadrust-d204cfd739bfecb6252b54c5007a28559d0f9a73.tar.gz
rust-d204cfd739bfecb6252b54c5007a28559d0f9a73.zip
Issue #5967: Make rvalues mutable
-rw-r--r--src/librustc/middle/borrowck/gather_loans/lifetime.rs10
-rw-r--r--src/librustc/middle/mem_categorization.rs2
2 files changed, 10 insertions, 2 deletions
diff --git a/src/librustc/middle/borrowck/gather_loans/lifetime.rs b/src/librustc/middle/borrowck/gather_loans/lifetime.rs
index 330d60a59d3..b0ddf2057d9 100644
--- a/src/librustc/middle/borrowck/gather_loans/lifetime.rs
+++ b/src/librustc/middle/borrowck/gather_loans/lifetime.rs
@@ -93,7 +93,7 @@ impl GuaranteeLifetimeContext {
                 let omit_root = (
                     ptr_mutbl == m_imm &&
                     self.bccx.is_subregion_of(self.loan_region, base_scope) &&
-                    base.mutbl.is_immutable() &&
+                    self.is_rvalue_or_immutable(base) &&
                     !self.is_moved(base)
                 );
 
@@ -168,6 +168,14 @@ impl GuaranteeLifetimeContext {
         }
     }
 
+    fn is_rvalue_or_immutable(&self,
+                              cmt: mc::cmt) -> bool {
+        cmt.mutbl.is_immutable() || match cmt.guarantor().cat {
+            mc::cat_rvalue => true,
+            _ => false
+        }
+    }
+
     fn check_root(&self,
                   cmt_deref: mc::cmt,
                   cmt_base: mc::cmt,
diff --git a/src/librustc/middle/mem_categorization.rs b/src/librustc/middle/mem_categorization.rs
index 95ed7fe8efc..91c0b8e61cc 100644
--- a/src/librustc/middle/mem_categorization.rs
+++ b/src/librustc/middle/mem_categorization.rs
@@ -551,7 +551,7 @@ pub impl mem_categorization_ctxt {
             id:elt.id(),
             span:elt.span(),
             cat:cat_rvalue,
-            mutbl:McImmutable,
+            mutbl:McDeclared,
             ty:expr_ty
         }
     }