Rollup merge of #85823 - fee1-dead:borrowck-0, r=jackh726
Do not suggest ampmut if rhs is already mutable
Removes invalid suggestion in #85765, although it should highlight the user type instead of the local variable.
Looking at the comments of this line:
84b1005bfd/compiler/rustc_mir_build/src/build/matches/mod.rs (L2107)
It was intentionally set to `None`, causing it to highlight the local variable instead. I am not sure if I will be able to fix it.
Fixes #85765
This commit is contained in:
commit
883e1a5fd4
3 changed files with 26 additions and 2 deletions
|
@ -902,12 +902,16 @@ fn suggest_ampmut<'tcx>(
|
||||||
{
|
{
|
||||||
let lt_name = &src[1..ws_pos];
|
let lt_name = &src[1..ws_pos];
|
||||||
let ty = &src[ws_pos..];
|
let ty = &src[ws_pos..];
|
||||||
|
if !ty.trim_start().starts_with("mut") {
|
||||||
return (assignment_rhs_span, format!("&{} mut {}", lt_name, ty));
|
return (assignment_rhs_span, format!("&{} mut {}", lt_name, ty));
|
||||||
|
}
|
||||||
} else if let Some(stripped) = src.strip_prefix('&') {
|
} else if let Some(stripped) = src.strip_prefix('&') {
|
||||||
|
if !stripped.trim_start().starts_with("mut") {
|
||||||
return (assignment_rhs_span, format!("&mut {}", stripped));
|
return (assignment_rhs_span, format!("&mut {}", stripped));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let highlight_span = match opt_ty_info {
|
let highlight_span = match opt_ty_info {
|
||||||
// if this is a variable binding with an explicit type,
|
// if this is a variable binding with an explicit type,
|
||||||
|
|
8
src/test/ui/borrowck/issue-85765.rs
Normal file
8
src/test/ui/borrowck/issue-85765.rs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
fn main() {
|
||||||
|
let mut test = Vec::new();
|
||||||
|
let rofl: &Vec<Vec<i32>> = &mut test;
|
||||||
|
//~^ HELP consider changing this to be a mutable reference
|
||||||
|
rofl.push(Vec::new());
|
||||||
|
//~^ ERROR cannot borrow `*rofl` as mutable, as it is behind a `&` reference
|
||||||
|
//~| NOTE `rofl` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||||
|
}
|
12
src/test/ui/borrowck/issue-85765.stderr
Normal file
12
src/test/ui/borrowck/issue-85765.stderr
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
error[E0596]: cannot borrow `*rofl` as mutable, as it is behind a `&` reference
|
||||||
|
--> $DIR/issue-85765.rs:5:5
|
||||||
|
|
|
||||||
|
LL | let rofl: &Vec<Vec<i32>> = &mut test;
|
||||||
|
| ---- help: consider changing this to be a mutable reference: `&mut Vec<Vec<i32>>`
|
||||||
|
LL |
|
||||||
|
LL | rofl.push(Vec::new());
|
||||||
|
| ^^^^ `rofl` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0596`.
|
Loading…
Add table
Add a link
Reference in a new issue