about summary refs log tree commit diff
path: root/src/rustc
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-08-23 14:46:59 -0700
committerNiko Matsakis <niko@alum.mit.edu>2012-08-23 18:54:08 -0700
commita08f3a7d4d937c2b26c8a29edabe7fb089d0b5f7 (patch)
tree778e2d94eca68fd3e579b2ad8ac2725602afe340 /src/rustc
parent83e7c869bdfadf0ed8aca92e76fc5073b63402e2 (diff)
downloadrust-a08f3a7d4d937c2b26c8a29edabe7fb089d0b5f7.tar.gz
rust-a08f3a7d4d937c2b26c8a29edabe7fb089d0b5f7.zip
More complete fix to #3162 (borrowck bug related to access to rec fields)
Diffstat (limited to 'src/rustc')
-rw-r--r--src/rustc/middle/borrowck/check_loans.rs15
-rw-r--r--src/rustc/middle/resolve3.rs2
-rw-r--r--src/rustc/middle/trans/type_use.rs9
3 files changed, 9 insertions, 17 deletions
diff --git a/src/rustc/middle/borrowck/check_loans.rs b/src/rustc/middle/borrowck/check_loans.rs
index 885d8a65046..6db7297618b 100644
--- a/src/rustc/middle/borrowck/check_loans.rs
+++ b/src/rustc/middle/borrowck/check_loans.rs
@@ -326,19 +326,8 @@ impl check_loan_ctxt {
             // even to data owned by the current stack frame.  This is
             // because that aliasable data might have been located on
             // the current stack frame, we don't know.
-            match cmt.lp {
-              some(@lp_local(*)) | some(@lp_arg(*)) => {
-                // it's ok to mutate a local variable, as it is either
-                // lent our or not.  The problem arises when you have
-                // some subcomponent that might have been lent out
-                // through an alias on the condition that you ensure
-                // purity.
-              }
-              none | some(@lp_comp(*)) | some(@lp_deref(*)) => {
-                self.report_purity_error(
-                    pc, ex.span, at.ing_form(self.bccx.cmt_to_str(cmt)));
-              }
-            }
+            self.report_purity_error(
+                pc, ex.span, at.ing_form(self.bccx.cmt_to_str(cmt)));
           }
           some(pc_pure_fn) => {
             if cmt.lp.is_none() {
diff --git a/src/rustc/middle/resolve3.rs b/src/rustc/middle/resolve3.rs
index 68d2b145829..da6b0b5087b 100644
--- a/src/rustc/middle/resolve3.rs
+++ b/src/rustc/middle/resolve3.rs
@@ -2065,7 +2065,7 @@ struct Resolver {
                                                            str_of(name)));
                             return Failed;
                         }
-                        ModuleDef(module_) => {
+                        ModuleDef(copy module_) => {
                             search_module = module_;
                         }
                     }
diff --git a/src/rustc/middle/trans/type_use.rs b/src/rustc/middle/trans/type_use.rs
index 004de82e064..ce84269bb67 100644
--- a/src/rustc/middle/trans/type_use.rs
+++ b/src/rustc/middle/trans/type_use.rs
@@ -116,10 +116,13 @@ fn type_uses_for(ccx: @crate_ctxt, fn_id: def_id, n_tps: uint)
 }
 
 fn type_needs(cx: ctx, use: uint, ty: ty::t) {
-    let mut done = true;
     // Optimization -- don't descend type if all params already have this use
-    for vec::each(cx.uses) |u| { if u & use != use { done = false } }
-    if !done { type_needs_inner(cx, use, ty, @nil); }
+    for vec::each_mut(cx.uses) |u| {
+        if *u & use != use {
+            type_needs_inner(cx, use, ty, @nil);
+            return;
+        }
+    }
 }
 
 fn type_needs_inner(cx: ctx, use: uint, ty: ty::t,