about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-07-18 01:37:44 -0700
committerbors <bors@rust-lang.org>2013-07-18 01:37:44 -0700
commitcee5c4ad11d348f0aa6487f5d01c8f660c7f5853 (patch)
treec0d53a2f0c88f0bd71028d9965858eea66f79393
parent30ef79ca6d069e3cc100e3d1332a286cbbc1eab3 (diff)
parent782853c65846be185c9b8bf930e1b47b78f6fdf6 (diff)
downloadrust-cee5c4ad11d348f0aa6487f5d01c8f660c7f5853.tar.gz
rust-cee5c4ad11d348f0aa6487f5d01c8f660c7f5853.zip
auto merge of #7849 : nikomatsakis/rust/issue-7444-capture-moved-value, r=bblum
This code looks like it was just wrong. r? @bblum
-rw-r--r--src/librustc/middle/borrowck/check_loans.rs18
-rw-r--r--src/librustc/middle/typeck/infer/region_inference/mod.rs1
-rw-r--r--src/test/compile-fail/borrowck-move-by-capture.rs4
-rw-r--r--src/test/compile-fail/borrowck-move-moved-value-into-closure.rs10
-rw-r--r--src/test/run-pass/borrowck-move-by-capture-ok.rs5
5 files changed, 26 insertions, 12 deletions
diff --git a/src/librustc/middle/borrowck/check_loans.rs b/src/librustc/middle/borrowck/check_loans.rs
index f10a2a258fe..8f254287d24 100644
--- a/src/librustc/middle/borrowck/check_loans.rs
+++ b/src/librustc/middle/borrowck/check_loans.rs
@@ -639,15 +639,14 @@ fn check_loans_in_fn<'a>(fk: &visit::fn_kind,
                                 span: span) {
         let cap_vars = this.bccx.capture_map.get(&closure_id);
         for cap_vars.iter().advance |cap_var| {
+            let var_id = ast_util::def_id_of_def(cap_var.def).node;
+            let var_path = @LpVar(var_id);
+            this.check_if_path_is_moved(closure_id, span,
+                                        MovedInCapture, var_path);
             match cap_var.mode {
-                moves::CapRef | moves::CapCopy => {
-                    let var_id = ast_util::def_id_of_def(cap_var.def).node;
-                    let lp = @LpVar(var_id);
-                    this.check_if_path_is_moved(closure_id, span,
-                                                MovedInCapture, lp);
-                }
+                moves::CapRef | moves::CapCopy => {}
                 moves::CapMove => {
-                    check_by_move_capture(this, closure_id, cap_var);
+                    check_by_move_capture(this, closure_id, cap_var, var_path);
                 }
             }
         }
@@ -655,9 +654,8 @@ fn check_loans_in_fn<'a>(fk: &visit::fn_kind,
 
         fn check_by_move_capture(this: @mut CheckLoanCtxt,
                                  closure_id: ast::node_id,
-                                 cap_var: &moves::CaptureVar) {
-            let var_id = ast_util::def_id_of_def(cap_var.def).node;
-            let move_path = @LpVar(var_id);
+                                 cap_var: &moves::CaptureVar,
+                                 move_path: @LoanPath) {
             let move_err = this.analyze_move_out_from(closure_id, move_path);
             match move_err {
                 MoveOk => {}
diff --git a/src/librustc/middle/typeck/infer/region_inference/mod.rs b/src/librustc/middle/typeck/infer/region_inference/mod.rs
index c3b35aba518..2342b60ace0 100644
--- a/src/librustc/middle/typeck/infer/region_inference/mod.rs
+++ b/src/librustc/middle/typeck/infer/region_inference/mod.rs
@@ -385,7 +385,6 @@ impl RegionVarBindings {
 
     pub fn tainted(&mut self, snapshot: uint, r0: Region) -> ~[Region] {
         /*!
-         *
          * Computes all regions that have been related to `r0` in any
          * way since the snapshot `snapshot` was taken---`r0` itself
          * will be the first entry. This is used when checking whether
diff --git a/src/test/compile-fail/borrowck-move-by-capture.rs b/src/test/compile-fail/borrowck-move-by-capture.rs
index 4ee824d1d49..ecb18993d93 100644
--- a/src/test/compile-fail/borrowck-move-by-capture.rs
+++ b/src/test/compile-fail/borrowck-move-by-capture.rs
@@ -4,8 +4,10 @@ pub fn main() {
     let _f: @fn() -> int = || *foo + 5;
     //~^ ERROR cannot move `foo`
 
+    // FIXME(#2202) - Due to the way that borrowck treats closures,
+    // you get two error reports here.
     let bar = ~3;
     let _g = || { //~ ERROR capture of moved value
-        let _h: @fn() -> int = || *bar;
+        let _h: @fn() -> int = || *bar; //~ ERROR capture of moved value
     };
 }
diff --git a/src/test/compile-fail/borrowck-move-moved-value-into-closure.rs b/src/test/compile-fail/borrowck-move-moved-value-into-closure.rs
new file mode 100644
index 00000000000..5e789e99c05
--- /dev/null
+++ b/src/test/compile-fail/borrowck-move-moved-value-into-closure.rs
@@ -0,0 +1,10 @@
+fn call_f(f: ~fn:Send() -> int) -> int {
+    f()
+}
+
+fn main() {
+    let t = ~3;
+
+    call_f(|| { *t + 1 });
+    call_f(|| { *t + 1 }); //~ ERROR capture of moved value
+}
diff --git a/src/test/run-pass/borrowck-move-by-capture-ok.rs b/src/test/run-pass/borrowck-move-by-capture-ok.rs
new file mode 100644
index 00000000000..095e2ba6fea
--- /dev/null
+++ b/src/test/run-pass/borrowck-move-by-capture-ok.rs
@@ -0,0 +1,5 @@
+pub fn main() {
+    let bar = ~3;
+    let h: @fn() -> int = || *bar;
+    assert_eq!(h(), 3);
+}