Skip to content

Move reason for move to label #44360

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions src/librustc_borrowck/borrowck/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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(')');
}
Expand Down
16 changes: 9 additions & 7 deletions src/test/compile-fail/augmented-assignments.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
54 changes: 24 additions & 30 deletions src/test/compile-fail/borrowck/borrowck-box-insensitivity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<isize>`
//~| value used here after move
//~^ NOTE value moved here because it has type `std::boxed::Box<isize>`, 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<isize>`, which does not
let _y = a.y; //~ ERROR use of moved
//~^ move occurs because `a.x` has type `std::boxed::Box<isize>`
//~| 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<isize>`, which does not
let _y = &a.y; //~ ERROR use of moved
//~^ move occurs because `a.x` has type `std::boxed::Box<isize>`
//~| value used here after move
//~^ NOTE value used here after move
}

fn move_after_borrow() {
Expand All @@ -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() {
Expand All @@ -80,15 +77,15 @@ 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() {
let mut a: Box<_> = box A { x: box 0, y: 1 };
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

Expand All @@ -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<isize>`, which does not
let _y = a.y; //~ ERROR use of collaterally moved
//~^ NOTE move occurs because `a.x.x` has type `std::boxed::Box<isize>`
//~| 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<isize>`, which does not
let _y = a.y; //~ ERROR use of collaterally moved
//~^ NOTE move occurs because `a.x.x` has type `std::boxed::Box<isize>`
//~| 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<isize>`, which does not
let _y = &a.y; //~ ERROR use of collaterally moved
//~^ NOTE move occurs because `a.x.x` has type `std::boxed::Box<isize>`
//~| 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() {
Expand All @@ -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

Expand Down
5 changes: 2 additions & 3 deletions src/test/compile-fail/issue-24357.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,17 @@ fn touch<A>(_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() {
Expand Down
6 changes: 3 additions & 3 deletions src/test/compile-fail/moves-based-on-type-match-bindings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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() {}
18 changes: 18 additions & 0 deletions src/test/ui/borrowck/issue-41962.rs
Original file line number Diff line number Diff line change
@@ -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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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 {
}
}
}
16 changes: 16 additions & 0 deletions src/test/ui/borrowck/issue-41962.stderr
Original file line number Diff line number Diff line change
@@ -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<bool>`, 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<bool>`, which does not implement the `Copy` trait

error: aborting due to 2 previous errors