Reword rustc_on_unimplemented errors for Iterator
- Detect one element array of `Range` type, which is potentially a typo:
`for _ in [0..10] {}` where iterating between `0` and `10` was intended.
(#23141)
- Suggest `.bytes()` and `.chars()` for `String`.
- Suggest borrowing or `.iter()` on arrays (#36391)
- Suggest using range literal when iterating on integers (#34353)
- Do not suggest `.iter()` by default (#50773, #46806)
This commit is contained in:
parent
cd7c8182dd
commit
5b0223e8c6
18 changed files with 64 additions and 42 deletions
|
|
@ -11,7 +11,7 @@
|
|||
// #39872, #39553
|
||||
|
||||
fn will_ice(something: &u32) -> impl Iterator<Item = &u32> {
|
||||
//~^ ERROR the trait bound `(): std::iter::Iterator` is not satisfied [E0277]
|
||||
//~^ ERROR `()` is not an iterator
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
error[E0277]: the trait bound `(): std::iter::Iterator` is not satisfied
|
||||
error[E0277]: `()` is not an iterator
|
||||
--> $DIR/conservative_impl_trait.rs:13:33
|
||||
|
|
||||
LL | fn will_ice(something: &u32) -> impl Iterator<Item = &u32> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ `()` is not an iterator; maybe try calling `.iter()` or a similar method
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ `()` is not an iterator
|
||||
|
|
||||
= help: the trait `std::iter::Iterator` is not implemented for `()`
|
||||
= note: the return type of a function must have a statically known size
|
||||
|
|
|
|||
|
|
@ -75,15 +75,16 @@ LL | | }
|
|||
= help: see issue #48214
|
||||
= help: add #![feature(trivial_bounds)] to the crate attributes to enable
|
||||
|
||||
error[E0277]: the trait bound `i32: std::iter::Iterator` is not satisfied
|
||||
error[E0277]: `i32` is not an iterator
|
||||
--> $DIR/feature-gate-trivial_bounds.rs:50:1
|
||||
|
|
||||
LL | / fn use_for() where i32: Iterator { //~ ERROR
|
||||
LL | | for _ in 2i32 {}
|
||||
LL | | }
|
||||
| |_^ `i32` is not an iterator; maybe try calling `.iter()` or a similar method
|
||||
| |_^ `i32` is not an iterator
|
||||
|
|
||||
= help: the trait `std::iter::Iterator` is not implemented for `i32`
|
||||
= note: if you want to iterate between `0` until a value `end`, use the range syntax: `0..end`
|
||||
= help: see issue #48214
|
||||
= help: add #![feature(trivial_bounds)] to the crate attributes to enable
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
fn main() {
|
||||
for c in "asdf" {
|
||||
//~^ ERROR the trait bound `&str: std::iter::Iterator` is not satisfied
|
||||
//~^ ERROR `&str` is not an iterator
|
||||
//~| NOTE `&str` is not an iterator
|
||||
//~| HELP the trait `std::iter::Iterator` is not implemented for `&str`
|
||||
//~| NOTE required by `std::iter::IntoIterator::into_iter`
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
error[E0277]: the trait bound `&str: std::iter::Iterator` is not satisfied
|
||||
error[E0277]: `&str` is not an iterator
|
||||
--> $DIR/for-c-in-str.rs:14:14
|
||||
|
|
||||
LL | for c in "asdf" {
|
||||
|
|
|
|||
|
|
@ -24,7 +24,8 @@ pub fn main() {
|
|||
x: 1,
|
||||
y: 2,
|
||||
};
|
||||
for x in bogus { //~ ERROR `MyStruct: std::iter::Iterator` is not satisfied
|
||||
for x in bogus {
|
||||
//~^ ERROR `MyStruct` is not an iterator
|
||||
drop(x);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
error[E0277]: the trait bound `MyStruct: std::iter::Iterator` is not satisfied
|
||||
error[E0277]: `MyStruct` is not an iterator
|
||||
--> $DIR/for-loop-bogosity.rs:27:14
|
||||
|
|
||||
LL | for x in bogus { //~ ERROR `MyStruct: std::iter::Iterator` is not satisfied
|
||||
| ^^^^^ `MyStruct` is not an iterator; maybe try calling `.iter()` or a similar method
|
||||
LL | for x in bogus {
|
||||
| ^^^^^ `MyStruct` is not an iterator
|
||||
|
|
||||
= help: the trait `std::iter::Iterator` is not implemented for `MyStruct`
|
||||
= note: required by `std::iter::IntoIterator::into_iter`
|
||||
|
|
|
|||
|
|
@ -10,13 +10,13 @@
|
|||
|
||||
fn main() {
|
||||
let _ = Iterator::next(&mut ());
|
||||
//~^ ERROR `(): std::iter::Iterator` is not satisfied
|
||||
//~^ ERROR `()` is not an iterator
|
||||
|
||||
for _ in false {}
|
||||
//~^ ERROR `bool: std::iter::Iterator` is not satisfied
|
||||
//~^ ERROR `bool` is not an iterator
|
||||
|
||||
let _ = Iterator::next(&mut ());
|
||||
//~^ ERROR `(): std::iter::Iterator` is not satisfied
|
||||
//~^ ERROR `()` is not an iterator
|
||||
|
||||
other()
|
||||
}
|
||||
|
|
@ -25,11 +25,11 @@ pub fn other() {
|
|||
// check errors are still reported globally
|
||||
|
||||
let _ = Iterator::next(&mut ());
|
||||
//~^ ERROR `(): std::iter::Iterator` is not satisfied
|
||||
//~^ ERROR `()` is not an iterator
|
||||
|
||||
let _ = Iterator::next(&mut ());
|
||||
//~^ ERROR `(): std::iter::Iterator` is not satisfied
|
||||
//~^ ERROR `()` is not an iterator
|
||||
|
||||
for _ in false {}
|
||||
//~^ ERROR `bool: std::iter::Iterator` is not satisfied
|
||||
//~^ ERROR `bool` is not an iterator
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,53 +1,53 @@
|
|||
error[E0277]: the trait bound `(): std::iter::Iterator` is not satisfied
|
||||
error[E0277]: `()` is not an iterator
|
||||
--> $DIR/issue-28098.rs:12:13
|
||||
|
|
||||
LL | let _ = Iterator::next(&mut ());
|
||||
| ^^^^^^^^^^^^^^ `()` is not an iterator; maybe try calling `.iter()` or a similar method
|
||||
| ^^^^^^^^^^^^^^ `()` is not an iterator
|
||||
|
|
||||
= help: the trait `std::iter::Iterator` is not implemented for `()`
|
||||
= note: required by `std::iter::Iterator::next`
|
||||
|
||||
error[E0277]: the trait bound `bool: std::iter::Iterator` is not satisfied
|
||||
error[E0277]: `bool` is not an iterator
|
||||
--> $DIR/issue-28098.rs:15:14
|
||||
|
|
||||
LL | for _ in false {}
|
||||
| ^^^^^ `bool` is not an iterator; maybe try calling `.iter()` or a similar method
|
||||
| ^^^^^ `bool` is not an iterator
|
||||
|
|
||||
= help: the trait `std::iter::Iterator` is not implemented for `bool`
|
||||
= note: required by `std::iter::IntoIterator::into_iter`
|
||||
|
||||
error[E0277]: the trait bound `(): std::iter::Iterator` is not satisfied
|
||||
error[E0277]: `()` is not an iterator
|
||||
--> $DIR/issue-28098.rs:18:13
|
||||
|
|
||||
LL | let _ = Iterator::next(&mut ());
|
||||
| ^^^^^^^^^^^^^^ `()` is not an iterator; maybe try calling `.iter()` or a similar method
|
||||
| ^^^^^^^^^^^^^^ `()` is not an iterator
|
||||
|
|
||||
= help: the trait `std::iter::Iterator` is not implemented for `()`
|
||||
= note: required by `std::iter::Iterator::next`
|
||||
|
||||
error[E0277]: the trait bound `(): std::iter::Iterator` is not satisfied
|
||||
error[E0277]: `()` is not an iterator
|
||||
--> $DIR/issue-28098.rs:27:13
|
||||
|
|
||||
LL | let _ = Iterator::next(&mut ());
|
||||
| ^^^^^^^^^^^^^^ `()` is not an iterator; maybe try calling `.iter()` or a similar method
|
||||
| ^^^^^^^^^^^^^^ `()` is not an iterator
|
||||
|
|
||||
= help: the trait `std::iter::Iterator` is not implemented for `()`
|
||||
= note: required by `std::iter::Iterator::next`
|
||||
|
||||
error[E0277]: the trait bound `(): std::iter::Iterator` is not satisfied
|
||||
error[E0277]: `()` is not an iterator
|
||||
--> $DIR/issue-28098.rs:30:13
|
||||
|
|
||||
LL | let _ = Iterator::next(&mut ());
|
||||
| ^^^^^^^^^^^^^^ `()` is not an iterator; maybe try calling `.iter()` or a similar method
|
||||
| ^^^^^^^^^^^^^^ `()` is not an iterator
|
||||
|
|
||||
= help: the trait `std::iter::Iterator` is not implemented for `()`
|
||||
= note: required by `std::iter::Iterator::next`
|
||||
|
||||
error[E0277]: the trait bound `bool: std::iter::Iterator` is not satisfied
|
||||
error[E0277]: `bool` is not an iterator
|
||||
--> $DIR/issue-28098.rs:33:14
|
||||
|
|
||||
LL | for _ in false {}
|
||||
| ^^^^^ `bool` is not an iterator; maybe try calling `.iter()` or a similar method
|
||||
| ^^^^^ `bool` is not an iterator
|
||||
|
|
||||
= help: the trait `std::iter::Iterator` is not implemented for `bool`
|
||||
= note: required by `std::iter::IntoIterator::into_iter`
|
||||
|
|
|
|||
|
|
@ -12,6 +12,6 @@
|
|||
//~^ ERROR the trait `Copy` may not be implemented for this type
|
||||
struct Foo(NotDefined, <i32 as Iterator>::Item, Vec<i32>, String);
|
||||
//~^ ERROR cannot find type `NotDefined` in this scope
|
||||
//~| ERROR the trait bound `i32: std::iter::Iterator` is not satisfied
|
||||
//~| ERROR `i32` is not an iterator
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -4,13 +4,14 @@ error[E0412]: cannot find type `NotDefined` in this scope
|
|||
LL | struct Foo(NotDefined, <i32 as Iterator>::Item, Vec<i32>, String);
|
||||
| ^^^^^^^^^^ not found in this scope
|
||||
|
||||
error[E0277]: the trait bound `i32: std::iter::Iterator` is not satisfied
|
||||
error[E0277]: `i32` is not an iterator
|
||||
--> $DIR/issue-50480.rs:13:24
|
||||
|
|
||||
LL | struct Foo(NotDefined, <i32 as Iterator>::Item, Vec<i32>, String);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ `i32` is not an iterator; maybe try calling `.iter()` or a similar method
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ `i32` is not an iterator
|
||||
|
|
||||
= help: the trait `std::iter::Iterator` is not implemented for `i32`
|
||||
= note: if you want to iterate between `0` until a value `end`, use the range syntax: `0..end`
|
||||
|
||||
error[E0204]: the trait `Copy` may not be implemented for this type
|
||||
--> $DIR/issue-50480.rs:11:17
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ fn main() {
|
|||
let v = vec![0, 1, 2, 3];
|
||||
|
||||
for (i, n) in &v.iter().enumerate() {
|
||||
//~^ ERROR the trait bound
|
||||
//~^ ERROR `&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator
|
||||
println!("{}", i);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
error[E0277]: the trait bound `&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>: std::iter::Iterator` is not satisfied
|
||||
error[E0277]: `&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator
|
||||
--> $DIR/suggest-remove-refs-1.rs:14:19
|
||||
|
|
||||
LL | for (i, n) in &v.iter().enumerate() {
|
||||
| -^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| `&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator; maybe try calling `.iter()` or a similar method
|
||||
| `&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator
|
||||
| help: consider removing 1 leading `&`-references
|
||||
|
|
||||
= help: the trait `std::iter::Iterator` is not implemented for `&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>`
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ fn main() {
|
|||
let v = vec![0, 1, 2, 3];
|
||||
|
||||
for (i, n) in & & & & &v.iter().enumerate() {
|
||||
//~^ ERROR the trait bound
|
||||
//~^ ERROR `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator
|
||||
println!("{}", i);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
error[E0277]: the trait bound `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>: std::iter::Iterator` is not satisfied
|
||||
error[E0277]: `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator
|
||||
--> $DIR/suggest-remove-refs-2.rs:14:19
|
||||
|
|
||||
LL | for (i, n) in & & & & &v.iter().enumerate() {
|
||||
| ---------^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator; maybe try calling `.iter()` or a similar method
|
||||
| `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator
|
||||
| help: consider removing 5 leading `&`-references
|
||||
|
|
||||
= help: the trait `std::iter::Iterator` is not implemented for `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>`
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ fn main() {
|
|||
& &v
|
||||
.iter()
|
||||
.enumerate() {
|
||||
//~^^^^ ERROR the trait bound
|
||||
//~^^^^ ERROR `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an
|
||||
println!("{}", i);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
error[E0277]: the trait bound `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>: std::iter::Iterator` is not satisfied
|
||||
error[E0277]: `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator
|
||||
--> $DIR/suggest-remove-refs-3.rs:14:19
|
||||
|
|
||||
LL | for (i, n) in & & &
|
||||
|
|
@ -9,7 +9,7 @@ LL | || & &v
|
|||
| ||___________- help: consider removing 5 leading `&`-references
|
||||
LL | | .iter()
|
||||
LL | | .enumerate() {
|
||||
| |_____________________^ `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator; maybe try calling `.iter()` or a similar method
|
||||
| |_____________________^ `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator
|
||||
|
|
||||
= help: the trait `std::iter::Iterator` is not implemented for `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>`
|
||||
= note: required by `std::iter::IntoIterator::into_iter`
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue