Split unfixable lints.

This commit is contained in:
Allen Hsu 2022-07-13 21:25:19 +10:00 committed by Allen Hsu
parent 171d082433
commit b96842d7d7
6 changed files with 386 additions and 266 deletions

View file

@ -394,7 +394,6 @@ const RUSTFIX_COVERAGE_KNOWN_EXCEPTIONS: &[&str] = &[
"single_component_path_imports_nested_first.rs",
"string_add.rs",
"toplevel_ref_arg_non_rustfix.rs",
"trait_duplication_in_bounds.rs",
"unit_arg.rs",
"unnecessary_clone.rs",
"unnecessary_lazy_eval_unfixable.rs",

View file

@ -0,0 +1,112 @@
// run-rustfix
#![deny(clippy::trait_duplication_in_bounds)]
#![allow(unused)]
fn bad_foo<T: Clone + Copy, U: Clone + Copy>(arg0: T, argo1: U) {
unimplemented!();
}
fn bad_bar<T, U>(arg0: T, arg1: U)
where
T: Clone + Copy,
U: Clone + Copy,
{
unimplemented!();
}
fn good_bar<T: Clone + Copy, U: Clone + Copy>(arg0: T, arg1: U) {
unimplemented!();
}
fn good_foo<T, U>(arg0: T, arg1: U)
where
T: Clone + Copy,
U: Clone + Copy,
{
unimplemented!();
}
trait GoodSelfTraitBound: Clone + Copy {
fn f();
}
trait GoodSelfWhereClause {
fn f()
where
Self: Clone + Copy;
}
trait BadSelfTraitBound: Clone {
fn f();
}
trait BadSelfWhereClause {
fn f()
where
Self: Clone;
}
trait GoodTraitBound<T: Clone + Copy, U: Clone + Copy> {
fn f();
}
trait GoodWhereClause<T, U> {
fn f()
where
T: Clone + Copy,
U: Clone + Copy;
}
trait BadTraitBound<T: Clone + Copy, U: Clone + Copy> {
fn f();
}
trait BadWhereClause<T, U> {
fn f()
where
T: Clone + Copy,
U: Clone + Copy;
}
struct GoodStructBound<T: Clone + Copy, U: Clone + Copy> {
t: T,
u: U,
}
impl<T: Clone + Copy, U: Clone + Copy> GoodTraitBound<T, U> for GoodStructBound<T, U> {
// this should not warn
fn f() {}
}
struct GoodStructWhereClause;
impl<T, U> GoodTraitBound<T, U> for GoodStructWhereClause
where
T: Clone + Copy,
U: Clone + Copy,
{
// this should not warn
fn f() {}
}
fn no_error_separate_arg_bounds(program: impl AsRef<()>, dir: impl AsRef<()>, args: &[impl AsRef<()>]) {}
trait GenericTrait<T> {}
fn good_generic<T: GenericTrait<u64> + GenericTrait<u32>>(arg0: T) {
unimplemented!();
}
fn bad_generic<T: GenericTrait<u32> + GenericTrait<u64>>(arg0: T) {
unimplemented!();
}
mod foo {
pub trait Clone {}
}
fn qualified_path<T: Clone + foo::Clone>(arg0: T) {
unimplemented!();
}
fn main() {}

View file

@ -1,212 +1,112 @@
// run-rustfix
#![deny(clippy::trait_duplication_in_bounds)]
#![allow(unused)]
use std::collections::BTreeMap;
use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};
fn bad_foo<T: Clone + Clone + Clone + Copy, U: Clone + Copy>(arg0: T, argo1: U) {
unimplemented!();
}
fn bad_foo<T: Clone + Default, Z: Copy>(arg0: T, arg1: Z)
fn bad_bar<T, U>(arg0: T, arg1: U)
where
T: Clone,
T: Default,
T: Clone + Clone + Clone + Copy,
U: Clone + Copy,
{
unimplemented!();
}
fn good_bar<T: Clone + Default>(arg: T) {
fn good_bar<T: Clone + Copy, U: Clone + Copy>(arg0: T, arg1: U) {
unimplemented!();
}
fn good_foo<T>(arg: T)
fn good_foo<T, U>(arg0: T, arg1: U)
where
T: Clone + Default,
T: Clone + Copy,
U: Clone + Copy,
{
unimplemented!();
}
fn good_foobar<T: Default>(arg: T)
where
T: Clone,
{
unimplemented!();
trait GoodSelfTraitBound: Clone + Copy {
fn f();
}
trait T: Default {
trait GoodSelfWhereClause {
fn f()
where
Self: Default;
Self: Clone + Copy;
}
trait U: Default {
trait BadSelfTraitBound: Clone + Clone + Clone {
fn f();
}
trait BadSelfWhereClause {
fn f()
where
Self: Clone;
Self: Clone + Clone + Clone;
}
trait ZZ: Default {
fn g();
fn h();
trait GoodTraitBound<T: Clone + Copy, U: Clone + Copy> {
fn f();
}
trait GoodWhereClause<T, U> {
fn f()
where
Self: Default + Clone;
T: Clone + Copy,
U: Clone + Copy;
}
trait BadTrait: Default + Clone {
trait BadTraitBound<T: Clone + Clone + Clone + Copy, U: Clone + Copy> {
fn f();
}
trait BadWhereClause<T, U> {
fn f()
where
Self: Default + Clone;
fn g()
where
Self: Default;
fn h()
where
Self: Copy;
}
#[derive(Default, Clone)]
struct Life;
impl T for Life {
// this should not warn
fn f() {}
}
impl U for Life {
// this should not warn
fn f() {}
}
// should not warn
trait Iter: Iterator {
fn into_group_btreemap<K, V>(self) -> BTreeMap<K, Vec<V>>
where
Self: Iterator<Item = (K, V)> + Sized,
K: Ord + Eq,
{
unimplemented!();
}
}
struct Foo;
trait FooIter: Iterator<Item = Foo> {
fn bar()
where
Self: Iterator<Item = Foo>,
{
}
}
// This should not lint
fn impl_trait(_: impl AsRef<str>, _: impl AsRef<str>) {}
mod repeated_where_clauses_or_trait_bounds {
fn bad_foo<T: Clone + Clone + Clone + Copy, U: Clone + Copy>(arg0: T, argo1: U) {
unimplemented!();
}
fn bad_bar<T, U>(arg0: T, arg1: U)
where
T: Clone + Clone + Clone + Copy,
U: Clone + Copy,
{
unimplemented!();
}
U: Clone + Copy;
}
fn good_bar<T: Clone + Copy, U: Clone + Copy>(arg0: T, arg1: U) {
unimplemented!();
}
struct GoodStructBound<T: Clone + Copy, U: Clone + Copy> {
t: T,
u: U,
}
fn good_foo<T, U>(arg0: T, arg1: U)
where
T: Clone + Copy,
U: Clone + Copy,
{
unimplemented!();
}
impl<T: Clone + Copy, U: Clone + Copy> GoodTraitBound<T, U> for GoodStructBound<T, U> {
// this should not warn
fn f() {}
}
trait GoodSelfTraitBound: Clone + Copy {
fn f();
}
struct GoodStructWhereClause;
trait GoodSelfWhereClause {
fn f()
where
Self: Clone + Copy;
}
impl<T, U> GoodTraitBound<T, U> for GoodStructWhereClause
where
T: Clone + Copy,
U: Clone + Copy,
{
// this should not warn
fn f() {}
}
trait BadSelfTraitBound: Clone + Clone + Clone {
fn f();
}
fn no_error_separate_arg_bounds(program: impl AsRef<()>, dir: impl AsRef<()>, args: &[impl AsRef<()>]) {}
trait BadSelfWhereClause {
fn f()
where
Self: Clone + Clone + Clone;
}
trait GenericTrait<T> {}
trait GoodTraitBound<T: Clone + Copy, U: Clone + Copy> {
fn f();
}
fn good_generic<T: GenericTrait<u64> + GenericTrait<u32>>(arg0: T) {
unimplemented!();
}
trait GoodWhereClause<T, U> {
fn f()
where
T: Clone + Copy,
U: Clone + Copy;
}
fn bad_generic<T: GenericTrait<u64> + GenericTrait<u32> + GenericTrait<u64>>(arg0: T) {
unimplemented!();
}
trait BadTraitBound<T: Clone + Clone + Clone + Copy, U: Clone + Copy> {
fn f();
}
mod foo {
pub trait Clone {}
}
trait BadWhereClause<T, U> {
fn f()
where
T: Clone + Clone + Clone + Copy,
U: Clone + Copy;
}
struct GoodStructBound<T: Clone + Copy, U: Clone + Copy> {
t: T,
u: U,
}
impl<T: Clone + Copy, U: Clone + Copy> GoodTraitBound<T, U> for GoodStructBound<T, U> {
// this should not warn
fn f() {}
}
struct GoodStructWhereClause;
impl<T, U> GoodTraitBound<T, U> for GoodStructWhereClause
where
T: Clone + Copy,
U: Clone + Copy,
{
// this should not warn
fn f() {}
}
fn no_error_separate_arg_bounds(program: impl AsRef<()>, dir: impl AsRef<()>, args: &[impl AsRef<()>]) {}
trait GenericTrait<T> {}
// This should not warn but currently does see #8757
fn good_generic<T: GenericTrait<u64> + GenericTrait<u32>>(arg0: T) {
unimplemented!();
}
fn bad_generic<T: GenericTrait<u64> + GenericTrait<u32> + GenericTrait<u64>>(arg0: T) {
unimplemented!();
}
mod foo {
pub trait Clone {}
}
fn qualified_path<T: std::clone::Clone + Clone + foo::Clone>(arg0: T) {
unimplemented!();
}
fn qualified_path<T: std::clone::Clone + Clone + foo::Clone>(arg0: T) {
unimplemented!();
}
fn main() {}

View file

@ -1,119 +1,56 @@
error: this trait bound is already specified in the where clause
--> $DIR/trait_duplication_in_bounds.rs:7:15
error: these bounds contain repeated elements
--> $DIR/trait_duplication_in_bounds.rs:5:15
|
LL | fn bad_foo<T: Clone + Default, Z: Copy>(arg0: T, arg1: Z)
| ^^^^^
LL | fn bad_foo<T: Clone + Clone + Clone + Copy, U: Clone + Copy>(arg0: T, argo1: U) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Clone + Copy`
|
note: the lint level is defined here
--> $DIR/trait_duplication_in_bounds.rs:1:9
--> $DIR/trait_duplication_in_bounds.rs:2:9
|
LL | #![deny(clippy::trait_duplication_in_bounds)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= help: consider removing this trait bound
error: this trait bound is already specified in the where clause
--> $DIR/trait_duplication_in_bounds.rs:7:23
|
LL | fn bad_foo<T: Clone + Default, Z: Copy>(arg0: T, arg1: Z)
| ^^^^^^^
|
= help: consider removing this trait bound
error: this trait bound is already specified in trait declaration
--> $DIR/trait_duplication_in_bounds.rs:36:15
|
LL | Self: Default;
| ^^^^^^^
|
= help: consider removing this trait bound
error: this trait bound is already specified in trait declaration
--> $DIR/trait_duplication_in_bounds.rs:50:15
|
LL | Self: Default + Clone;
| ^^^^^^^
|
= help: consider removing this trait bound
error: this trait bound is already specified in trait declaration
--> $DIR/trait_duplication_in_bounds.rs:56:15
|
LL | Self: Default + Clone;
| ^^^^^^^
|
= help: consider removing this trait bound
error: this trait bound is already specified in trait declaration
--> $DIR/trait_duplication_in_bounds.rs:56:25
|
LL | Self: Default + Clone;
| ^^^^^
|
= help: consider removing this trait bound
error: this trait bound is already specified in trait declaration
--> $DIR/trait_duplication_in_bounds.rs:59:15
|
LL | Self: Default;
| ^^^^^^^
|
= help: consider removing this trait bound
error: this trait bound is already specified in trait declaration
--> $DIR/trait_duplication_in_bounds.rs:94:15
|
LL | Self: Iterator<Item = Foo>,
| ^^^^^^^^^^^^^^^^^^^^
|
= help: consider removing this trait bound
error: these bounds contain repeated elements
--> $DIR/trait_duplication_in_bounds.rs:103:19
|
LL | fn bad_foo<T: Clone + Clone + Clone + Copy, U: Clone + Copy>(arg0: T, argo1: U) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Clone + Copy`
error: these where clauses contain repeated elements
--> $DIR/trait_duplication_in_bounds.rs:109:12
--> $DIR/trait_duplication_in_bounds.rs:11:8
|
LL | T: Clone + Clone + Clone + Copy,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Clone + Copy`
error: these bounds contain repeated elements
--> $DIR/trait_duplication_in_bounds.rs:39:26
|
LL | trait BadSelfTraitBound: Clone + Clone + Clone {
| ^^^^^^^^^^^^^^^^^^^^^ help: try: `Clone`
error: these where clauses contain repeated elements
--> $DIR/trait_duplication_in_bounds.rs:46:15
|
LL | Self: Clone + Clone + Clone;
| ^^^^^^^^^^^^^^^^^^^^^ help: try: `Clone`
error: these bounds contain repeated elements
--> $DIR/trait_duplication_in_bounds.rs:60:24
|
LL | trait BadTraitBound<T: Clone + Clone + Clone + Copy, U: Clone + Copy> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Clone + Copy`
error: these where clauses contain repeated elements
--> $DIR/trait_duplication_in_bounds.rs:67:12
|
LL | T: Clone + Clone + Clone + Copy,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Clone + Copy`
error: these bounds contain repeated elements
--> $DIR/trait_duplication_in_bounds.rs:137:30
--> $DIR/trait_duplication_in_bounds.rs:100:19
|
LL | trait BadSelfTraitBound: Clone + Clone + Clone {
| ^^^^^^^^^^^^^^^^^^^^^ help: try: `Clone`
error: these where clauses contain repeated elements
--> $DIR/trait_duplication_in_bounds.rs:144:19
|
LL | Self: Clone + Clone + Clone;
| ^^^^^^^^^^^^^^^^^^^^^ help: try: `Clone`
LL | fn bad_generic<T: GenericTrait<u64> + GenericTrait<u32> + GenericTrait<u64>>(arg0: T) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `GenericTrait<u32> + GenericTrait<u64>`
error: these bounds contain repeated elements
--> $DIR/trait_duplication_in_bounds.rs:158:28
--> $DIR/trait_duplication_in_bounds.rs:108:22
|
LL | trait BadTraitBound<T: Clone + Clone + Clone + Copy, U: Clone + Copy> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Clone + Copy`
LL | fn qualified_path<T: std::clone::Clone + Clone + foo::Clone>(arg0: T) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Clone + foo::Clone`
error: these where clauses contain repeated elements
--> $DIR/trait_duplication_in_bounds.rs:165:16
|
LL | T: Clone + Clone + Clone + Copy,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Clone + Copy`
error: these bounds contain repeated elements
--> $DIR/trait_duplication_in_bounds.rs:199:23
|
LL | fn bad_generic<T: GenericTrait<u64> + GenericTrait<u32> + GenericTrait<u64>>(arg0: T) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `GenericTrait<u32> + GenericTrait<u64>`
error: these bounds contain repeated elements
--> $DIR/trait_duplication_in_bounds.rs:207:26
|
LL | fn qualified_path<T: std::clone::Clone + Clone + foo::Clone>(arg0: T) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `Clone + foo::Clone`
error: aborting due to 16 previous errors
error: aborting due to 8 previous errors

View file

@ -0,0 +1,101 @@
#![deny(clippy::trait_duplication_in_bounds)]
use std::collections::BTreeMap;
use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};
fn bad_foo<T: Clone + Default, Z: Copy>(arg0: T, arg1: Z)
where
T: Clone,
T: Default,
{
unimplemented!();
}
fn good_bar<T: Clone + Default>(arg: T) {
unimplemented!();
}
fn good_foo<T>(arg: T)
where
T: Clone + Default,
{
unimplemented!();
}
fn good_foobar<T: Default>(arg: T)
where
T: Clone,
{
unimplemented!();
}
trait T: Default {
fn f()
where
Self: Default;
}
trait U: Default {
fn f()
where
Self: Clone;
}
trait ZZ: Default {
fn g();
fn h();
fn f()
where
Self: Default + Clone;
}
trait BadTrait: Default + Clone {
fn f()
where
Self: Default + Clone;
fn g()
where
Self: Default;
fn h()
where
Self: Copy;
}
#[derive(Default, Clone)]
struct Life;
impl T for Life {
// this should not warn
fn f() {}
}
impl U for Life {
// this should not warn
fn f() {}
}
// should not warn
trait Iter: Iterator {
fn into_group_btreemap<K, V>(self) -> BTreeMap<K, Vec<V>>
where
Self: Iterator<Item = (K, V)> + Sized,
K: Ord + Eq,
{
unimplemented!();
}
}
struct Foo;
trait FooIter: Iterator<Item = Foo> {
fn bar()
where
Self: Iterator<Item = Foo>,
{
}
}
// This should not lint
fn impl_trait(_: impl AsRef<str>, _: impl AsRef<str>) {}
fn main() {}

View file

@ -0,0 +1,71 @@
error: this trait bound is already specified in the where clause
--> $DIR/trait_duplication_in_bounds_unfixable.rs:6:15
|
LL | fn bad_foo<T: Clone + Default, Z: Copy>(arg0: T, arg1: Z)
| ^^^^^
|
note: the lint level is defined here
--> $DIR/trait_duplication_in_bounds_unfixable.rs:1:9
|
LL | #![deny(clippy::trait_duplication_in_bounds)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= help: consider removing this trait bound
error: this trait bound is already specified in the where clause
--> $DIR/trait_duplication_in_bounds_unfixable.rs:6:23
|
LL | fn bad_foo<T: Clone + Default, Z: Copy>(arg0: T, arg1: Z)
| ^^^^^^^
|
= help: consider removing this trait bound
error: this trait bound is already specified in trait declaration
--> $DIR/trait_duplication_in_bounds_unfixable.rs:35:15
|
LL | Self: Default;
| ^^^^^^^
|
= help: consider removing this trait bound
error: this trait bound is already specified in trait declaration
--> $DIR/trait_duplication_in_bounds_unfixable.rs:49:15
|
LL | Self: Default + Clone;
| ^^^^^^^
|
= help: consider removing this trait bound
error: this trait bound is already specified in trait declaration
--> $DIR/trait_duplication_in_bounds_unfixable.rs:55:15
|
LL | Self: Default + Clone;
| ^^^^^^^
|
= help: consider removing this trait bound
error: this trait bound is already specified in trait declaration
--> $DIR/trait_duplication_in_bounds_unfixable.rs:55:25
|
LL | Self: Default + Clone;
| ^^^^^
|
= help: consider removing this trait bound
error: this trait bound is already specified in trait declaration
--> $DIR/trait_duplication_in_bounds_unfixable.rs:58:15
|
LL | Self: Default;
| ^^^^^^^
|
= help: consider removing this trait bound
error: this trait bound is already specified in trait declaration
--> $DIR/trait_duplication_in_bounds_unfixable.rs:93:15
|
LL | Self: Iterator<Item = Foo>,
| ^^^^^^^^^^^^^^^^^^^^
|
= help: consider removing this trait bound
error: aborting due to 8 previous errors