Skip to content

Commit

Permalink
Auto merge of #46949 - davidtwco:issue-46631, r=arielb1
Browse files Browse the repository at this point in the history
MIR borrowck: no "move occurs because `X` is not Copy` error

Fixes #46631.

r? @arielb1
  • Loading branch information
bors committed Dec 25, 2017
2 parents 0cd6758 + 6710bd8 commit b159eeb
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 2 deletions.
46 changes: 45 additions & 1 deletion src/librustc_mir/borrow_check/error_reporting.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,34 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
err.span_label(move_span, format!("value moved{} here", move_msg));
};
}
//FIXME: add note for closure

if let Some(ty) = self.retrieve_type_for_place(place) {
let needs_note = match ty.sty {
ty::TypeVariants::TyClosure(id, _) => {
let tables = self.tcx.typeck_tables_of(id);
let node_id = self.tcx.hir.as_local_node_id(id).unwrap();
let hir_id = self.tcx.hir.node_to_hir_id(node_id);
if let Some(_) = tables.closure_kind_origins().get(hir_id) {
false
} else {
true
}
},
_ => true,
};

if needs_note {
let note_msg = match self.describe_place(place) {
Some(name) => format!("`{}`", name),
None => "value".to_owned(),
};

err.note(&format!("move occurs because {} has type `{}`, \
which does not implement the `Copy` trait",
note_msg, ty));
}
}

err.emit();
}
}
Expand Down Expand Up @@ -721,4 +748,21 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
fn retrieve_borrow_span(&self, borrow: &BorrowData) -> Span {
self.mir.source_info(borrow.location).span
}

// Retrieve type of a place for the current MIR representation
fn retrieve_type_for_place(&self, place: &Place<'tcx>) -> Option<ty::Ty> {
match place {
Place::Local(local) => {
let local = &self.mir.local_decls[*local];
Some(local.ty)
},
Place::Static(ref st) => Some(st.ty),
Place::Projection(ref proj) => {
match proj.elem {
ProjectionElem::Field(_, ty) => Some(ty),
_ => None,
}
},
}
}
}
2 changes: 2 additions & 0 deletions src/test/ui/borrowck/borrowck-reinit.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ error[E0382]: use of moved value: `x` (Mir)
| - value moved here
18 | let _ = (1,x); //~ ERROR use of moved value: `x` (Ast)
| ^ value used here after move
|
= note: move occurs because `x` has type `std::boxed::Box<i32>`, which does not implement the `Copy` trait

error: aborting due to 2 previous errors

Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,14 @@

#![feature(box_syntax)]

// compile-flags: -Z emit-end-regions -Z borrowck=compare

fn dup(x: Box<isize>) -> Box<(Box<isize>,Box<isize>)> {
box (x, x) //~ ERROR use of moved value
box (x, x)
//~^ use of moved value: `x` (Ast) [E0382]
//~| use of moved value: `x` (Mir) [E0382]
}

fn main() {
dup(box 3);
}
22 changes: 22 additions & 0 deletions src/test/ui/moves-based-on-type-tuple.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
error[E0382]: use of moved value: `x` (Ast)
--> $DIR/moves-based-on-type-tuple.rs:16:13
|
16 | box (x, x)
| - ^ value used here after move
| |
| value moved here
|
= note: move occurs because `x` has type `std::boxed::Box<isize>`, which does not implement the `Copy` trait

error[E0382]: use of moved value: `x` (Mir)
--> $DIR/moves-based-on-type-tuple.rs:16:13
|
16 | box (x, x)
| - ^ value used here after move
| |
| value moved here
|
= note: move occurs because `x` has type `std::boxed::Box<isize>`, which does not implement the `Copy` trait

error: aborting due to 2 previous errors

0 comments on commit b159eeb

Please sign in to comment.