Skip to content

Commit 3dfe256

Browse files
committed
Added 'move occurs because X is not Copy' note.
1 parent c428b7d commit 3dfe256

File tree

1 file changed

+45
-1
lines changed

1 file changed

+45
-1
lines changed

src/librustc_mir/borrow_check/error_reporting.rs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,34 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
8181
err.span_label(move_span, format!("value moved{} here", move_msg));
8282
};
8383
}
84-
//FIXME: add note for closure
84+
85+
if let Some(ty) = self.retrieve_type_for_place(place) {
86+
let needs_note = match ty.sty {
87+
ty::TypeVariants::TyClosure(id, _) => {
88+
let tables = self.tcx.typeck_tables_of(id);
89+
let node_id = self.tcx.hir.as_local_node_id(id).unwrap();
90+
let hir_id = self.tcx.hir.node_to_hir_id(node_id);
91+
if let Some(_) = tables.closure_kind_origins().get(hir_id) {
92+
false
93+
} else {
94+
true
95+
}
96+
},
97+
_ => true,
98+
};
99+
100+
if needs_note {
101+
let note_msg = match self.describe_place(place) {
102+
Some(name) => format!("`{}`", name),
103+
None => "value".to_owned(),
104+
};
105+
106+
err.note(&format!("move occurs because {} has type `{}`, \
107+
which does not implement the `Copy` trait",
108+
note_msg, ty));
109+
}
110+
}
111+
85112
err.emit();
86113
}
87114
}
@@ -655,4 +682,21 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
655682
fn retrieve_borrow_span(&self, borrow: &BorrowData) -> Span {
656683
self.mir.source_info(borrow.location).span
657684
}
685+
686+
// Retrieve type of a place for the current MIR representation
687+
fn retrieve_type_for_place(&self, place: &Place<'tcx>) -> Option<ty::Ty> {
688+
match place {
689+
Place::Local(local) => {
690+
let local = &self.mir.local_decls[*local];
691+
Some(local.ty)
692+
},
693+
Place::Static(ref st) => Some(st.ty),
694+
Place::Projection(ref proj) => {
695+
match proj.elem {
696+
ProjectionElem::Field(_, ty) => Some(ty),
697+
_ => None,
698+
}
699+
},
700+
}
701+
}
658702
}

0 commit comments

Comments
 (0)