Make IndexMut note apply to more cases

Previously it was only emitted for assigments, which was an
unnecessary restriction. Now it doesn't care where the mutability
comes from.

This commit also adds `` quotes around the printed type.
This commit is contained in:
Lukas Kalbertodt 2018-08-07 22:38:14 +02:00
parent 9d59c6b76e
commit 764d472b1f
No known key found for this signature in database
GPG Key ID: 3CBAF4153F818627

View File

@ -882,28 +882,6 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
}
}
// We add a special note about `IndexMut`, if the source of this error
// is the fact that `Index` is implemented, but `IndexMut` is not. Needing
// to implement two traits for "one operator" is not very intuitive for
// many programmers.
if err.cmt.note == mc::NoteIndex {
let node_id = self.tcx.hir.hir_to_node_id(err.cmt.hir_id);
let node = self.tcx.hir.get(node_id);
// This pattern probably always matches.
if let hir_map::NodeExpr(
hir::Expr { node: hir::ExprKind::Index(lhs, _), ..}
) = node {
let ty = self.tables.expr_ty(lhs);
db.help(&format!(
"trait `IndexMut` is required to modify indexed content, but \
it is not implemented for {}",
ty
));
}
}
db
}
BorrowViolation(euv::ClosureCapture(_)) => {
@ -924,6 +902,28 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
}
};
// We add a special note about `IndexMut`, if the source of this error
// is the fact that `Index` is implemented, but `IndexMut` is not. Needing
// to implement two traits for "one operator" is not very intuitive for
// many programmers.
if err.cmt.note == mc::NoteIndex {
let node_id = self.tcx.hir.hir_to_node_id(err.cmt.hir_id);
let node = self.tcx.hir.get(node_id);
// This pattern probably always matches.
if let hir_map::NodeExpr(
hir::Expr { node: hir::ExprKind::Index(lhs, _), ..}
) = node {
let ty = self.tables.expr_ty(lhs);
db.help(&format!(
"trait `IndexMut` is required to modify indexed content, but \
it is not implemented for `{}`",
ty
));
}
}
self.note_and_explain_mutbl_error(&mut db, &err, &error_span);
self.note_immutability_blame(
&mut db,