From 79e43714fac2bb2d6e54dfceaca22c83dea8af5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Tue, 5 Sep 2017 23:36:34 -0700 Subject: [PATCH] Move reason for move to label --- src/librustc_borrowck/borrowck/mod.rs | 22 ++++---- .../compile-fail/augmented-assignments.rs | 16 +++--- .../borrowck/borrowck-box-insensitivity.rs | 54 +++++++++---------- src/test/compile-fail/issue-24357.rs | 5 +- ...ased-on-type-distribute-copy-over-paren.rs | 8 +-- .../moves-based-on-type-match-bindings.rs | 6 +-- src/test/ui/borrowck/issue-41962.rs | 18 +++++++ src/test/ui/borrowck/issue-41962.stderr | 16 ++++++ 8 files changed, 87 insertions(+), 58 deletions(-) create mode 100644 src/test/ui/borrowck/issue-41962.rs create mode 100644 src/test/ui/borrowck/issue-41962.stderr diff --git a/src/librustc_borrowck/borrowck/mod.rs b/src/librustc_borrowck/borrowck/mod.rs index 98c9a4a92ef30..25d7df2050df8 100644 --- a/src/librustc_borrowck/borrowck/mod.rs +++ b/src/librustc_borrowck/borrowck/mod.rs @@ -664,28 +664,28 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> { }, " (into closure)"), }; + let extra_move_label = if need_note { + format!(" because it has type `{}`, which does not implement the `Copy` trait", + moved_lp.ty) + } else { + String::new() + }; // Annotate the use and the move in the span. Watch out for // the case where the use and the move are the same. This // means the use is in a loop. err = if use_span == move_span { err.span_label( use_span, - format!("value moved{} here in previous iteration of loop", - move_note)); + format!("value moved{} here in previous iteration of loop{}", + move_note, + extra_move_label)); err } else { err.span_label(use_span, format!("value {} here after move", verb_participle)) - .span_label(move_span, format!("value moved{} here", move_note)); + .span_label(move_span, format!("value moved{} here{}", move_note, extra_move_label)); err }; - if need_note { - err.note(&format!("move occurs because `{}` has type `{}`, \ - which does not implement the `Copy` trait", - self.loan_path_to_string(moved_lp), - moved_lp.ty)); - } - // Note: we used to suggest adding a `ref binding` or calling // `clone` but those suggestions have been removed because // they are often not what you actually want to do, and were @@ -1365,7 +1365,7 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> { LpDowncast(ref lp_base, variant_def_id) => { out.push('('); self.append_autoderefd_loan_path_to_string(&lp_base, out); - out.push(':'); + out.push_str(DOWNCAST_PRINTED_OPERATOR); out.push_str(&self.tcx.item_path_str(variant_def_id)); out.push(')'); } diff --git a/src/test/compile-fail/augmented-assignments.rs b/src/test/compile-fail/augmented-assignments.rs index 736aa465aa732..0ac48990be4be 100644 --- a/src/test/compile-fail/augmented-assignments.rs +++ b/src/test/compile-fail/augmented-assignments.rs @@ -20,16 +20,18 @@ impl AddAssign for Int { fn main() { let mut x = Int(1); - x //~ error: use of moved value: `x` - //~^ value used here after move - //~| note: move occurs because `x` has type `Int` + x + //~^ error: use of moved value: `x` + //~| note: value used here after move += - x; //~ value moved here + x; + //~^ note: value moved here because it has type `Int`, which does not implement the `Copy` let y = Int(2); - //~^ consider changing this to `mut y` - y //~ error: cannot borrow immutable local variable `y` as mutable - //~| cannot borrow + //~^ note: consider changing this to `mut y` + y + //~^ error: cannot borrow immutable local variable `y` as mutable + //~| note: cannot borrow mutably += Int(1); } diff --git a/src/test/compile-fail/borrowck/borrowck-box-insensitivity.rs b/src/test/compile-fail/borrowck/borrowck-box-insensitivity.rs index d09cb73d6702a..dd2ec7f5fa359 100644 --- a/src/test/compile-fail/borrowck/borrowck-box-insensitivity.rs +++ b/src/test/compile-fail/borrowck/borrowck-box-insensitivity.rs @@ -33,28 +33,25 @@ struct D { fn copy_after_move() { let a: Box<_> = box A { x: box 0, y: 1 }; let _x = a.x; - //~^ value moved here - let _y = a.y; //~ ERROR use of moved - //~^ move occurs because `a.x` has type `std::boxed::Box` - //~| value used here after move + //~^ NOTE value moved here because it has type `std::boxed::Box`, which does not + let _y = a.y; //~ ERROR use of moved value + //~^ NOTE value used here after move } fn move_after_move() { let a: Box<_> = box B { x: box 0, y: box 1 }; let _x = a.x; - //~^ value moved here + //~^ NOTE value moved here because it has type `std::boxed::Box`, which does not let _y = a.y; //~ ERROR use of moved - //~^ move occurs because `a.x` has type `std::boxed::Box` - //~| value used here after move + //~^ NOTE value used here after move } fn borrow_after_move() { let a: Box<_> = box A { x: box 0, y: 1 }; let _x = a.x; - //~^ value moved here + //~^ NOTE value moved here because it has type `std::boxed::Box`, which does not let _y = &a.y; //~ ERROR use of moved - //~^ move occurs because `a.x` has type `std::boxed::Box` - //~| value used here after move + //~^ NOTE value used here after move } fn move_after_borrow() { @@ -63,7 +60,7 @@ fn move_after_borrow() { //~^ NOTE borrow of `a.x` occurs here let _y = a.y; //~^ ERROR cannot move - //~| move out of + //~| NOTE move out of } fn copy_after_mut_borrow() { @@ -80,7 +77,7 @@ fn move_after_mut_borrow() { //~^ NOTE borrow of `a.x` occurs here let _y = a.y; //~^ ERROR cannot move - //~| move out of + //~| NOTE move out of } fn borrow_after_mut_borrow() { @@ -88,7 +85,7 @@ fn borrow_after_mut_borrow() { let _x = &mut a.x; //~^ NOTE mutable borrow occurs here (via `a.x`) let _y = &a.y; //~ ERROR cannot borrow - //~^ immutable borrow occurs here (via `a.y`) + //~^ NOTE immutable borrow occurs here (via `a.y`) } //~^ NOTE mutable borrow ends here @@ -97,44 +94,41 @@ fn mut_borrow_after_borrow() { let _x = &a.x; //~^ NOTE immutable borrow occurs here (via `a.x`) let _y = &mut a.y; //~ ERROR cannot borrow - //~^ mutable borrow occurs here (via `a.y`) + //~^ NOTE mutable borrow occurs here (via `a.y`) } //~^ NOTE immutable borrow ends here fn copy_after_move_nested() { let a: Box<_> = box C { x: box A { x: box 0, y: 1 }, y: 2 }; let _x = a.x.x; - //~^ value moved here + //~^ NOTE value moved here because it has type `std::boxed::Box`, which does not let _y = a.y; //~ ERROR use of collaterally moved - //~^ NOTE move occurs because `a.x.x` has type `std::boxed::Box` - //~| value used here after move + //~^ NOTE value used here after move } fn move_after_move_nested() { let a: Box<_> = box D { x: box A { x: box 0, y: 1 }, y: box 2 }; let _x = a.x.x; - //~^ value moved here + //~^ NOTE value moved here because it has type `std::boxed::Box`, which does not let _y = a.y; //~ ERROR use of collaterally moved - //~^ NOTE move occurs because `a.x.x` has type `std::boxed::Box` - //~| value used here after move + //~^ NOTE value used here after move } fn borrow_after_move_nested() { let a: Box<_> = box C { x: box A { x: box 0, y: 1 }, y: 2 }; let _x = a.x.x; - //~^ value moved here + //~^ NOTE value moved here because it has type `std::boxed::Box`, which does not let _y = &a.y; //~ ERROR use of collaterally moved - //~^ NOTE move occurs because `a.x.x` has type `std::boxed::Box` - //~| value used here after move + //~^ NOTE value used here after move } fn move_after_borrow_nested() { let a: Box<_> = box D { x: box A { x: box 0, y: 1 }, y: box 2 }; let _x = &a.x.x; - //~^ borrow of `a.x.x` occurs here + //~^ NOTE borrow of `a.x.x` occurs here let _y = a.y; //~^ ERROR cannot move - //~| move out of + //~| NOTE move out of } fn copy_after_mut_borrow_nested() { @@ -151,24 +145,24 @@ fn move_after_mut_borrow_nested() { //~^ NOTE borrow of `a.x.x` occurs here let _y = a.y; //~^ ERROR cannot move - //~| move out of + //~| NOTE move out of } fn borrow_after_mut_borrow_nested() { let mut a: Box<_> = box C { x: box A { x: box 0, y: 1 }, y: 2 }; let _x = &mut a.x.x; - //~^ mutable borrow occurs here + //~^ NOTE mutable borrow occurs here let _y = &a.y; //~ ERROR cannot borrow - //~^ immutable borrow occurs here + //~^ NOTE immutable borrow occurs here } //~^ NOTE mutable borrow ends here fn mut_borrow_after_borrow_nested() { let mut a: Box<_> = box C { x: box A { x: box 0, y: 1 }, y: 2 }; let _x = &a.x.x; - //~^ immutable borrow occurs here + //~^ NOTE immutable borrow occurs here let _y = &mut a.y; //~ ERROR cannot borrow - //~^ mutable borrow occurs here + //~^ NOTE mutable borrow occurs here } //~^ NOTE immutable borrow ends here diff --git a/src/test/compile-fail/issue-24357.rs b/src/test/compile-fail/issue-24357.rs index 5d6b989fc968a..544679171b462 100644 --- a/src/test/compile-fail/issue-24357.rs +++ b/src/test/compile-fail/issue-24357.rs @@ -12,9 +12,8 @@ struct NoCopy; fn main() { let x = NoCopy; let f = move || { let y = x; }; - //~^ value moved (into closure) here + //~^ NOTE value moved (into closure) here because it has type `NoCopy`, which does not let z = x; //~^ ERROR use of moved value: `x` - //~| value used here after move - //~| move occurs because `x` has type `NoCopy` + //~| NOTE value used here after move } diff --git a/src/test/compile-fail/moves-based-on-type-distribute-copy-over-paren.rs b/src/test/compile-fail/moves-based-on-type-distribute-copy-over-paren.rs index 02c09aa7d69a2..0929e0b57d32d 100644 --- a/src/test/compile-fail/moves-based-on-type-distribute-copy-over-paren.rs +++ b/src/test/compile-fail/moves-based-on-type-distribute-copy-over-paren.rs @@ -17,17 +17,17 @@ fn touch(_a: &A) {} fn f00() { let x = "hi".to_string(); let _y = Foo { f:x }; - //~^ value moved here + //~^ NOTE value moved here because it has type touch(&x); //~ ERROR use of moved value: `x` - //~^ value used here after move - //~| move occurs because `x` has type `std::string::String` + //~^ NOTE value used here after move } fn f05() { let x = "hi".to_string(); let _y = Foo { f:(((x))) }; - //~^ value moved here + //~^ NOTE value moved here because it has type touch(&x); //~ ERROR use of moved value: `x` + //~^ NOTE value used here after move } fn f10() { diff --git a/src/test/compile-fail/moves-based-on-type-match-bindings.rs b/src/test/compile-fail/moves-based-on-type-match-bindings.rs index bcbb8dbfad121..c08c1a788c1e0 100644 --- a/src/test/compile-fail/moves-based-on-type-match-bindings.rs +++ b/src/test/compile-fail/moves-based-on-type-match-bindings.rs @@ -20,12 +20,12 @@ fn f10() { let x = Foo {f: "hi".to_string()}; let y = match x { - Foo {f} => {} //~ NOTE moved here + Foo {f} => {} + //~^ NOTE value moved here because it has type `std::string::String`, which does not }; touch(&x); //~ ERROR use of partially moved value: `x` - //~^ value used here after move - //~| move occurs because `x.f` has type `std::string::String` + //~^ NOTE value used here after move } fn main() {} diff --git a/src/test/ui/borrowck/issue-41962.rs b/src/test/ui/borrowck/issue-41962.rs new file mode 100644 index 0000000000000..a8e1edbdfdf1e --- /dev/null +++ b/src/test/ui/borrowck/issue-41962.rs @@ -0,0 +1,18 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +pub fn main(){ + let maybe = Some(vec![true, true]); + + loop { + if let Some(thing) = maybe { + } + } +} diff --git a/src/test/ui/borrowck/issue-41962.stderr b/src/test/ui/borrowck/issue-41962.stderr new file mode 100644 index 0000000000000..4ee11798123a9 --- /dev/null +++ b/src/test/ui/borrowck/issue-41962.stderr @@ -0,0 +1,16 @@ +error[E0382]: use of partially moved value: `maybe` + --> $DIR/issue-41962.rs:15:30 + | +15 | if let Some(thing) = maybe { + | ----- ^^^^^ value used here after move + | | + | value moved here because it has type `std::vec::Vec`, which does not implement the `Copy` trait + +error[E0382]: use of moved value: `(maybe as std::prelude::v1::Some).0` + --> $DIR/issue-41962.rs:15:21 + | +15 | if let Some(thing) = maybe { + | ^^^^^ value moved here in previous iteration of loop because it has type `std::vec::Vec`, which does not implement the `Copy` trait + +error: aborting due to 2 previous errors +