Skip to content

Commit c24117e

Browse files
committed
improve tests
1 parent 322f121 commit c24117e

File tree

3 files changed

+67
-17
lines changed

3 files changed

+67
-17
lines changed

tests/ui/useless_conversion.fixed

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,13 +194,24 @@ mod issue11300 {
194194
assert_eq!(i.len(), 3);
195195
}
196196

197-
trait Helper {}
198-
impl Helper for [i32; 3] {}
199-
impl Helper for std::array::IntoIter<i32, 3> {}
197+
trait Helper<T: ?Sized> {}
198+
impl Helper<i32> for [i32; 3] {}
199+
impl Helper<i32> for std::array::IntoIter<i32, 3> {}
200+
impl Helper<()> for std::array::IntoIter<i32, 3> {}
200201

201-
fn foo2<I>(_: I)
202+
fn foo2<X: ?Sized, I>(_: I)
202203
where
203-
I: IntoIterator<Item = i32> + Helper,
204+
I: IntoIterator<Item = i32> + Helper<X>,
205+
{
206+
}
207+
208+
trait Helper2<T> {}
209+
impl Helper2<std::array::IntoIter<i32, 3>> for i32 {}
210+
impl Helper2<[i32; 3]> for i32 {}
211+
fn foo3<I>(_: I)
212+
where
213+
I: IntoIterator<Item = i32>,
214+
i32: Helper2<I>,
204215
{
205216
}
206217

@@ -211,7 +222,15 @@ mod issue11300 {
211222
foo([1, 2, 3].into_iter());
212223

213224
// This should trigger the lint, receiver type [i32; 3] also implements `Helper`
214-
foo2([1, 2, 3]);
225+
foo2::<i32, _>([1, 2, 3]);
226+
227+
// This again should *not* lint, since X = () and I = std::array::IntoIter<i32, 3>,
228+
// and `[i32; 3]: Helper<()>` is not true (only `std::array::IntoIter<i32, 3>: Helper<()>` is).
229+
foo2::<(), _>([1, 2, 3].into_iter());
230+
231+
// This should lint. Removing the `.into_iter()` means that `I` gets substituted with `[i32; 3]`,
232+
// and `i32: Helper2<[i32, 3]>` is true, so this call is indeed unncessary.
233+
foo3([1, 2, 3]);
215234
}
216235
}
217236

tests/ui/useless_conversion.rs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,13 +194,24 @@ mod issue11300 {
194194
assert_eq!(i.len(), 3);
195195
}
196196

197-
trait Helper {}
198-
impl Helper for [i32; 3] {}
199-
impl Helper for std::array::IntoIter<i32, 3> {}
197+
trait Helper<T: ?Sized> {}
198+
impl Helper<i32> for [i32; 3] {}
199+
impl Helper<i32> for std::array::IntoIter<i32, 3> {}
200+
impl Helper<()> for std::array::IntoIter<i32, 3> {}
200201

201-
fn foo2<I>(_: I)
202+
fn foo2<X: ?Sized, I>(_: I)
202203
where
203-
I: IntoIterator<Item = i32> + Helper,
204+
I: IntoIterator<Item = i32> + Helper<X>,
205+
{
206+
}
207+
208+
trait Helper2<T> {}
209+
impl Helper2<std::array::IntoIter<i32, 3>> for i32 {}
210+
impl Helper2<[i32; 3]> for i32 {}
211+
fn foo3<I>(_: I)
212+
where
213+
I: IntoIterator<Item = i32>,
214+
i32: Helper2<I>,
204215
{
205216
}
206217

@@ -211,7 +222,15 @@ mod issue11300 {
211222
foo([1, 2, 3].into_iter());
212223

213224
// This should trigger the lint, receiver type [i32; 3] also implements `Helper`
214-
foo2([1, 2, 3].into_iter());
225+
foo2::<i32, _>([1, 2, 3].into_iter());
226+
227+
// This again should *not* lint, since X = () and I = std::array::IntoIter<i32, 3>,
228+
// and `[i32; 3]: Helper<()>` is not true (only `std::array::IntoIter<i32, 3>: Helper<()>` is).
229+
foo2::<(), _>([1, 2, 3].into_iter());
230+
231+
// This should lint. Removing the `.into_iter()` means that `I` gets substituted with `[i32; 3]`,
232+
// and `i32: Helper2<[i32, 3]>` is true, so this call is indeed unncessary.
233+
foo3([1, 2, 3].into_iter());
215234
}
216235
}
217236

tests/ui/useless_conversion.stderr

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -179,16 +179,28 @@ LL | fn b<T: IntoIterator<Item = i32>>(_: T) {}
179179
| ^^^^^^^^^^^^^^^^^^^^^^^^
180180

181181
error: explicit call to `.into_iter()` in function argument accepting `IntoIterator`
182-
--> $DIR/useless_conversion.rs:214:14
182+
--> $DIR/useless_conversion.rs:225:24
183183
|
184-
LL | foo2([1, 2, 3].into_iter());
184+
LL | foo2::<i32, _>([1, 2, 3].into_iter());
185+
| ^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`: `[1, 2, 3]`
186+
|
187+
note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()`
188+
--> $DIR/useless_conversion.rs:204:12
189+
|
190+
LL | I: IntoIterator<Item = i32> + Helper<X>,
191+
| ^^^^^^^^^^^^^^^^^^^^^^^^
192+
193+
error: explicit call to `.into_iter()` in function argument accepting `IntoIterator`
194+
--> $DIR/useless_conversion.rs:233:14
195+
|
196+
LL | foo3([1, 2, 3].into_iter());
185197
| ^^^^^^^^^^^^^^^^^^^^^ help: consider removing the `.into_iter()`: `[1, 2, 3]`
186198
|
187199
note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()`
188-
--> $DIR/useless_conversion.rs:203:12
200+
--> $DIR/useless_conversion.rs:213:12
189201
|
190-
LL | I: IntoIterator<Item = i32> + Helper,
202+
LL | I: IntoIterator<Item = i32>,
191203
| ^^^^^^^^^^^^^^^^^^^^^^^^
192204

193-
error: aborting due to 25 previous errors
205+
error: aborting due to 26 previous errors
194206

0 commit comments

Comments
 (0)