Suggest borrowing Vec<NonCopy> in for loop

Partially address #64167.
This commit is contained in:
Esteban Küber 2020-01-21 11:11:00 -08:00
parent 7da653f669
commit c775927d7f
4 changed files with 53 additions and 0 deletions

View file

@ -1,6 +1,7 @@
use rustc::mir::*;
use rustc::ty;
use rustc_errors::{Applicability, DiagnosticBuilder};
use rustc_span::source_map::DesugaringKind;
use rustc_span::Span;
use crate::borrow_check::diagnostics::UseSpans;
@ -397,6 +398,16 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
format!("{}.as_ref()", snippet),
Applicability::MaybeIncorrect,
);
} else if span.is_desugaring(DesugaringKind::ForLoop)
&& move_ty.starts_with("std::vec::Vec")
{
// FIXME: suggest for anything that implements `IntoIterator`.
err.span_suggestion(
span,
"consider iterating over a slice of the `Vec`'s content",
format!("&{}", snippet),
Applicability::MaybeIncorrect,
);
}
}
err

View file

@ -0,0 +1,15 @@
// run-rustfix
#![allow(dead_code)]
struct Foo {
v: Vec<u32>,
}
impl Foo {
fn bar(&self) {
for _ in &self.v { //~ ERROR cannot move out of `self.v` which is behind a shared reference
}
}
}
fn main() {}

View file

@ -0,0 +1,15 @@
// run-rustfix
#![allow(dead_code)]
struct Foo {
v: Vec<u32>,
}
impl Foo {
fn bar(&self) {
for _ in self.v { //~ ERROR cannot move out of `self.v` which is behind a shared reference
}
}
}
fn main() {}

View file

@ -0,0 +1,12 @@
error[E0507]: cannot move out of `self.v` which is behind a shared reference
--> $DIR/for-i-in-vec.rs:10:18
|
LL | for _ in self.v {
| ^^^^^^
| |
| move occurs because `self.v` has type `std::vec::Vec<u32>`, which does not implement the `Copy` trait
| help: consider iterating over a slice of the `Vec`'s content: `&self.v`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0507`.