Rollup merge of #95415 - notriddle:notriddle/issue-82081, r=Dylan-DPC

diagnostics: regression test for HashMap iter_mut suggestion

Closes #82081
This commit is contained in:
Dylan DPC 2022-03-29 17:11:52 +02:00 committed by GitHub
commit eceb173de9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 64 additions and 2 deletions

View File

@ -787,7 +787,12 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
_,
[
Expr {
kind: MethodCall(path_segment, ..),
kind:
MethodCall(
path_segment,
_args,
span,
),
hir_id,
..
},
@ -831,7 +836,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
if let Some(mut suggestions) = opt_suggestions {
if suggestions.peek().is_some() {
err.span_suggestions(
path_segment.ident.span,
*span,
"use mutable method",
suggestions,
Applicability::MaybeIncorrect,

View File

@ -0,0 +1,21 @@
// run-rustfix
// https://github.com/rust-lang/rust/issues/82081
use std::collections::HashMap;
struct Test {
v: u32,
}
fn main() {
let mut map = HashMap::new();
map.insert("a", Test { v: 0 });
for (_k, mut v) in map.iter_mut() {
//~^ HELP use mutable method
//~| NOTE this iterator yields `&` references
v.v += 1;
//~^ ERROR cannot assign to `v.v`
//~| NOTE `v` is a `&` reference
}
}

View File

@ -0,0 +1,21 @@
// run-rustfix
// https://github.com/rust-lang/rust/issues/82081
use std::collections::HashMap;
struct Test {
v: u32,
}
fn main() {
let mut map = HashMap::new();
map.insert("a", Test { v: 0 });
for (_k, mut v) in map.iter() {
//~^ HELP use mutable method
//~| NOTE this iterator yields `&` references
v.v += 1;
//~^ ERROR cannot assign to `v.v`
//~| NOTE `v` is a `&` reference
}
}

View File

@ -0,0 +1,15 @@
error[E0594]: cannot assign to `v.v`, which is behind a `&` reference
--> $DIR/suggest-mut-method-for-loop-hashmap.rs:17:9
|
LL | for (_k, mut v) in map.iter() {
| ----------
| | |
| | help: use mutable method: `iter_mut()`
| this iterator yields `&` references
...
LL | v.v += 1;
| ^^^^^^^^ `v` is a `&` reference, so the data it refers to cannot be written
error: aborting due to previous error
For more information about this error, try `rustc --explain E0594`.