Provide structured suggestion for removal of &mut
This commit is contained in:
parent
e4368de7b1
commit
a6af6d6506
3 changed files with 28 additions and 14 deletions
|
@ -12,7 +12,7 @@ use rustc_middle::{
|
||||||
};
|
};
|
||||||
use rustc_span::source_map::DesugaringKind;
|
use rustc_span::source_map::DesugaringKind;
|
||||||
use rustc_span::symbol::{kw, Symbol};
|
use rustc_span::symbol::{kw, Symbol};
|
||||||
use rustc_span::Span;
|
use rustc_span::{BytePos, Span};
|
||||||
|
|
||||||
use crate::borrow_check::diagnostics::BorrowedContentSource;
|
use crate::borrow_check::diagnostics::BorrowedContentSource;
|
||||||
use crate::borrow_check::MirBorrowckCtxt;
|
use crate::borrow_check::MirBorrowckCtxt;
|
||||||
|
@ -278,7 +278,25 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
err.span_help(source_info.span, "try removing `&mut` here");
|
if let Ok(snippet) =
|
||||||
|
self.infcx.tcx.sess.source_map().span_to_snippet(source_info.span)
|
||||||
|
{
|
||||||
|
if snippet.starts_with("&mut ") {
|
||||||
|
// We don't have access to the HIR to get accurate spans, but we can
|
||||||
|
// give a best effort structured suggestion.
|
||||||
|
err.span_suggestion_verbose(
|
||||||
|
source_info.span.with_hi(source_info.span.lo() + BytePos(5)),
|
||||||
|
"try removing `&mut` here",
|
||||||
|
String::new(),
|
||||||
|
Applicability::MachineApplicable,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// This can occur with things like `(&mut self).foo()`.
|
||||||
|
err.span_help(source_info.span, "try removing `&mut` here");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err.span_help(source_info.span, "try removing `&mut` here");
|
||||||
|
}
|
||||||
} else if decl.mutability == Mutability::Not
|
} else if decl.mutability == Mutability::Not
|
||||||
&& !matches!(
|
&& !matches!(
|
||||||
decl.local_info,
|
decl.local_info,
|
||||||
|
|
|
@ -10,10 +10,9 @@ note: the binding is already a mutable borrow
|
||||||
LL | pub fn f(b: &mut i32) {
|
LL | pub fn f(b: &mut i32) {
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
help: try removing `&mut` here
|
help: try removing `&mut` here
|
||||||
--> $DIR/mut-borrow-of-mut-ref.rs:7:7
|
|
||||||
|
|
|
|
||||||
LL | h(&mut b);
|
LL | h(b);
|
||||||
| ^^^^^^
|
| --
|
||||||
|
|
||||||
error[E0596]: cannot borrow `b` as mutable, as it is not declared as mutable
|
error[E0596]: cannot borrow `b` as mutable, as it is not declared as mutable
|
||||||
--> $DIR/mut-borrow-of-mut-ref.rs:11:12
|
--> $DIR/mut-borrow-of-mut-ref.rs:11:12
|
||||||
|
@ -27,10 +26,9 @@ note: the binding is already a mutable borrow
|
||||||
LL | pub fn f(b: &mut i32) {
|
LL | pub fn f(b: &mut i32) {
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
help: try removing `&mut` here
|
help: try removing `&mut` here
|
||||||
--> $DIR/mut-borrow-of-mut-ref.rs:11:12
|
|
||||||
|
|
|
|
||||||
LL | g(&mut &mut b);
|
LL | g(&mut b);
|
||||||
| ^^^^^^
|
| --
|
||||||
|
|
||||||
error[E0596]: cannot borrow `b` as mutable, as it is not declared as mutable
|
error[E0596]: cannot borrow `b` as mutable, as it is not declared as mutable
|
||||||
--> $DIR/mut-borrow-of-mut-ref.rs:18:12
|
--> $DIR/mut-borrow-of-mut-ref.rs:18:12
|
||||||
|
@ -44,10 +42,9 @@ note: the binding is already a mutable borrow
|
||||||
LL | pub fn g(b: &mut i32) {
|
LL | pub fn g(b: &mut i32) {
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
help: try removing `&mut` here
|
help: try removing `&mut` here
|
||||||
--> $DIR/mut-borrow-of-mut-ref.rs:18:12
|
|
||||||
|
|
|
|
||||||
LL | h(&mut &mut b);
|
LL | h(&mut b);
|
||||||
| ^^^^^^
|
| --
|
||||||
|
|
||||||
error[E0596]: cannot borrow `f` as mutable, as it is not declared as mutable
|
error[E0596]: cannot borrow `f` as mutable, as it is not declared as mutable
|
||||||
--> $DIR/mut-borrow-of-mut-ref.rs:35:5
|
--> $DIR/mut-borrow-of-mut-ref.rs:35:5
|
||||||
|
|
|
@ -10,10 +10,9 @@ note: the binding is already a mutable borrow
|
||||||
LL | fn start(&mut self) {
|
LL | fn start(&mut self) {
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
help: try removing `&mut` here
|
help: try removing `&mut` here
|
||||||
--> $DIR/issue-34126.rs:6:18
|
|
||||||
|
|
|
|
||||||
LL | self.run(&mut self);
|
LL | self.run(self);
|
||||||
| ^^^^^^^^^
|
| --
|
||||||
|
|
||||||
error[E0502]: cannot borrow `self` as mutable because it is also borrowed as immutable
|
error[E0502]: cannot borrow `self` as mutable because it is also borrowed as immutable
|
||||||
--> $DIR/issue-34126.rs:6:18
|
--> $DIR/issue-34126.rs:6:18
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue