diff --git a/src/test/ui/iterators/array-of-ranges.rs b/src/test/ui/iterators/array-of-ranges.rs new file mode 100644 index 00000000000..eb2309f7a3f --- /dev/null +++ b/src/test/ui/iterators/array-of-ranges.rs @@ -0,0 +1,9 @@ +fn main() { + for _ in [0..1] {} + let start = 0; + let end = 0; + for _ in [start..end] {} + let array_of_range = [start..end]; + for _ in array_of_range {} + for _ in [0..1, 2..3] {} +} diff --git a/src/test/ui/iterators/array-of-ranges.stderr b/src/test/ui/iterators/array-of-ranges.stderr new file mode 100644 index 00000000000..95839ebc53a --- /dev/null +++ b/src/test/ui/iterators/array-of-ranges.stderr @@ -0,0 +1,43 @@ +error[E0277]: `[std::ops::Range<{integer}>; 1]` is not an iterator + --> $DIR/array-of-ranges.rs:2:14 + | +LL | for _ in [0..1] {} + | ^^^^^^ if you meant to iterate between two values, remove the square brackets + | + = help: the trait `std::iter::Iterator` is not implemented for `[std::ops::Range<{integer}>; 1]` + = note: `[start..end]` is an array of one `Range`, you might have meant to have a `Range`: `start..end` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `[std::ops::Range<{integer}>; 1]` is not an iterator + --> $DIR/array-of-ranges.rs:5:14 + | +LL | for _ in [start..end] {} + | ^^^^^^^^^^^^ if you meant to iterate between two values, remove the square brackets + | + = help: the trait `std::iter::Iterator` is not implemented for `[std::ops::Range<{integer}>; 1]` + = note: `[start..end]` is an array of one `Range`, you might have meant to have a `Range`: `start..end` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `[std::ops::Range<{integer}>; 1]` is not an iterator + --> $DIR/array-of-ranges.rs:7:14 + | +LL | for _ in array_of_range {} + | ^^^^^^^^^^^^^^ if you meant to iterate between two values, remove the square brackets + | + = help: the trait `std::iter::Iterator` is not implemented for `[std::ops::Range<{integer}>; 1]` + = note: `[start..end]` is an array of one `Range`, you might have meant to have a `Range`: `start..end` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `[std::ops::Range<{integer}>; 2]` is not an iterator + --> $DIR/array-of-ranges.rs:8:14 + | +LL | for _ in [0..1, 2..3] {} + | ^^^^^^^^^^^^ borrow the array with `&` or call `.iter()` on it to iterate over it + | + = help: the trait `std::iter::Iterator` is not implemented for `[std::ops::Range<{integer}>; 2]` + = note: arrays are not an iterators, but slices like the following are: `&[1, 2, 3]` + = note: required by `std::iter::IntoIterator::into_iter` + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/iterators/array.rs b/src/test/ui/iterators/array.rs new file mode 100644 index 00000000000..f54bb812743 --- /dev/null +++ b/src/test/ui/iterators/array.rs @@ -0,0 +1,6 @@ +fn main() { + for _ in [1, 2] {} + let x = [1, 2]; + for _ in x {} + for _ in [1.0, 2.0] {} +} diff --git a/src/test/ui/iterators/array.stderr b/src/test/ui/iterators/array.stderr new file mode 100644 index 00000000000..fd74cd7a727 --- /dev/null +++ b/src/test/ui/iterators/array.stderr @@ -0,0 +1,33 @@ +error[E0277]: `[{integer}; 2]` is not an iterator + --> $DIR/array.rs:2:14 + | +LL | for _ in [1, 2] {} + | ^^^^^^ borrow the array with `&` or call `.iter()` on it to iterate over it + | + = help: the trait `std::iter::Iterator` is not implemented for `[{integer}; 2]` + = note: arrays are not an iterators, but slices like the following are: `&[1, 2, 3]` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `[{integer}; 2]` is not an iterator + --> $DIR/array.rs:4:14 + | +LL | for _ in x {} + | ^ borrow the array with `&` or call `.iter()` on it to iterate over it + | + = help: the trait `std::iter::Iterator` is not implemented for `[{integer}; 2]` + = note: arrays are not an iterators, but slices like the following are: `&[1, 2, 3]` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `[{float}; 2]` is not an iterator + --> $DIR/array.rs:5:14 + | +LL | for _ in [1.0, 2.0] {} + | ^^^^^^^^^^ borrow the array with `&` or call `.iter()` on it to iterate over it + | + = help: the trait `std::iter::Iterator` is not implemented for `[{float}; 2]` + = note: arrays are not an iterators, but slices like the following are: `&[1, 2, 3]` + = note: required by `std::iter::IntoIterator::into_iter` + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/iterators/bound.rs b/src/test/ui/iterators/bound.rs new file mode 100644 index 00000000000..78285b8161c --- /dev/null +++ b/src/test/ui/iterators/bound.rs @@ -0,0 +1,3 @@ +struct S(I); +struct T(S); +fn main() {} diff --git a/src/test/ui/iterators/bound.stderr b/src/test/ui/iterators/bound.stderr new file mode 100644 index 00000000000..2ddbd93c83c --- /dev/null +++ b/src/test/ui/iterators/bound.stderr @@ -0,0 +1,17 @@ +error[E0277]: `u8` is not an iterator + --> $DIR/bound.rs:2:10 + | +LL | struct T(S); + | ^^^^^ `u8` is not an iterator + | + = help: the trait `std::iter::Iterator` is not implemented for `u8` + = note: if you want to iterate between `0` until a value `end`, use the range syntax: `0..end` +note: required by `S` + --> $DIR/bound.rs:1:1 + | +LL | struct S(I); + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/iterators/integral.rs b/src/test/ui/iterators/integral.rs new file mode 100644 index 00000000000..7537c7904c0 --- /dev/null +++ b/src/test/ui/iterators/integral.rs @@ -0,0 +1,26 @@ +fn main() { + for _ in 42 {} + //~^ ERROR `{integer}` is not an iterator + for _ in 42 as u8 {} + //~^ ERROR `u8` is not an iterator + for _ in 42 as i8 {} + //~^ ERROR `i8` is not an iterator + for _ in 42 as u16 {} + //~^ ERROR `u16` is not an iterator + for _ in 42 as i16 {} + //~^ ERROR `i16` is not an iterator + for _ in 42 as u32 {} + //~^ ERROR `u32` is not an iterator + for _ in 42 as i32 {} + //~^ ERROR `i32` is not an iterator + for _ in 42 as u64 {} + //~^ ERROR `u64` is not an iterator + for _ in 42 as i64 {} + //~^ ERROR `i64` is not an iterator + for _ in 42 as usize {} + //~^ ERROR `usize` is not an iterator + for _ in 42 as isize {} + //~^ ERROR `isize` is not an iterator + for _ in 42.0 {} + //~^ ERROR `{float}` is not an iterator +} diff --git a/src/test/ui/iterators/integral.stderr b/src/test/ui/iterators/integral.stderr new file mode 100644 index 00000000000..3662d97d72e --- /dev/null +++ b/src/test/ui/iterators/integral.stderr @@ -0,0 +1,122 @@ +error[E0277]: `{integer}` is not an iterator + --> $DIR/integral.rs:2:14 + | +LL | for _ in 42 {} + | ^^ `{integer}` is not an iterator + | + = help: the trait `std::iter::Iterator` is not implemented for `{integer}` + = note: if you want to iterate between `0` until a value `end`, use the range syntax: `0..end` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `u8` is not an iterator + --> $DIR/integral.rs:4:14 + | +LL | for _ in 42 as u8 {} + | ^^^^^^^^ `u8` is not an iterator + | + = help: the trait `std::iter::Iterator` is not implemented for `u8` + = note: if you want to iterate between `0` until a value `end`, use the range syntax: `0..end` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `i8` is not an iterator + --> $DIR/integral.rs:6:14 + | +LL | for _ in 42 as i8 {} + | ^^^^^^^^ `i8` is not an iterator + | + = help: the trait `std::iter::Iterator` is not implemented for `i8` + = note: if you want to iterate between `0` until a value `end`, use the range syntax: `0..end` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `u16` is not an iterator + --> $DIR/integral.rs:8:14 + | +LL | for _ in 42 as u16 {} + | ^^^^^^^^^ `u16` is not an iterator + | + = help: the trait `std::iter::Iterator` is not implemented for `u16` + = note: if you want to iterate between `0` until a value `end`, use the range syntax: `0..end` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `i16` is not an iterator + --> $DIR/integral.rs:10:14 + | +LL | for _ in 42 as i16 {} + | ^^^^^^^^^ `i16` is not an iterator + | + = help: the trait `std::iter::Iterator` is not implemented for `i16` + = note: if you want to iterate between `0` until a value `end`, use the range syntax: `0..end` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `u32` is not an iterator + --> $DIR/integral.rs:12:14 + | +LL | for _ in 42 as u32 {} + | ^^^^^^^^^ `u32` is not an iterator + | + = help: the trait `std::iter::Iterator` is not implemented for `u32` + = note: if you want to iterate between `0` until a value `end`, use the range syntax: `0..end` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `i32` is not an iterator + --> $DIR/integral.rs:14:14 + | +LL | for _ in 42 as i32 {} + | ^^^^^^^^^ `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` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `u64` is not an iterator + --> $DIR/integral.rs:16:14 + | +LL | for _ in 42 as u64 {} + | ^^^^^^^^^ `u64` is not an iterator + | + = help: the trait `std::iter::Iterator` is not implemented for `u64` + = note: if you want to iterate between `0` until a value `end`, use the range syntax: `0..end` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `i64` is not an iterator + --> $DIR/integral.rs:18:14 + | +LL | for _ in 42 as i64 {} + | ^^^^^^^^^ `i64` is not an iterator + | + = help: the trait `std::iter::Iterator` is not implemented for `i64` + = note: if you want to iterate between `0` until a value `end`, use the range syntax: `0..end` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `usize` is not an iterator + --> $DIR/integral.rs:20:14 + | +LL | for _ in 42 as usize {} + | ^^^^^^^^^^^ `usize` is not an iterator + | + = help: the trait `std::iter::Iterator` is not implemented for `usize` + = note: if you want to iterate between `0` until a value `end`, use the range syntax: `0..end` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `isize` is not an iterator + --> $DIR/integral.rs:22:14 + | +LL | for _ in 42 as isize {} + | ^^^^^^^^^^^ `isize` is not an iterator + | + = help: the trait `std::iter::Iterator` is not implemented for `isize` + = note: if you want to iterate between `0` until a value `end`, use the range syntax: `0..end` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `{float}` is not an iterator + --> $DIR/integral.rs:24:14 + | +LL | for _ in 42.0 {} + | ^^^^ `{float}` is not an iterator + | + = help: the trait `std::iter::Iterator` is not implemented for `{float}` + = note: required by `std::iter::IntoIterator::into_iter` + +error: aborting due to 12 previous errors + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/iterators/string.rs b/src/test/ui/iterators/string.rs new file mode 100644 index 00000000000..4373dcaabe5 --- /dev/null +++ b/src/test/ui/iterators/string.rs @@ -0,0 +1,6 @@ +fn main() { + for _ in "".to_owned() {} + //~^ ERROR `std::string::String` is not an iterator + for _ in "" {} + //~^ ERROR `&str` is not an iterator +} diff --git a/src/test/ui/iterators/string.stderr b/src/test/ui/iterators/string.stderr new file mode 100644 index 00000000000..927de952cc8 --- /dev/null +++ b/src/test/ui/iterators/string.stderr @@ -0,0 +1,21 @@ +error[E0277]: `std::string::String` is not an iterator + --> $DIR/string.rs:2:14 + | +LL | for _ in "".to_owned() {} + | ^^^^^^^^^^^^^ `std::string::String` is not an iterator; try calling `.chars()` or `.bytes()` + | + = help: the trait `std::iter::Iterator` is not implemented for `std::string::String` + = note: required by `std::iter::IntoIterator::into_iter` + +error[E0277]: `&str` is not an iterator + --> $DIR/string.rs:4:14 + | +LL | for _ in "" {} + | ^^ `&str` is not an iterator; try calling `.chars()` or `.bytes()` + | + = help: the trait `std::iter::Iterator` is not implemented for `&str` + = note: required by `std::iter::IntoIterator::into_iter` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0277`.