Added 'move occurs because X is not Copy' note.

This commit is contained in:
David Wood 2017-12-22 15:00:26 +00:00
parent c428b7d9c1
commit 3dfe256b5f
No known key found for this signature in database
GPG Key ID: 01760B4F9F53F154

View File

@ -81,7 +81,34 @@ pub(super) fn report_use_of_moved_or_uninitialized(
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();
}
}
@ -655,4 +682,21 @@ fn describe_field_from_ty(&self, ty: &ty::Ty, field: Field) -> String {
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,
}
},
}
}
}