diff options
| author | Ariel Uy <ariel.b.uy@gmail.com> | 2022-05-13 23:48:52 -0700 |
|---|---|---|
| committer | Ariel Uy <ariel.b.uy@gmail.com> | 2022-06-03 00:04:55 -0700 |
| commit | 58cd01c2fcda07f97efcd908b50e5256cf084593 (patch) | |
| tree | ba754ab436a21a78ce65c82b1276f956d001798f /tests | |
| parent | 1194c6369eda50c55d421bd6641edee1e0ebbfe2 (diff) | |
| download | rust-58cd01c2fcda07f97efcd908b50e5256cf084593.tar.gz rust-58cd01c2fcda07f97efcd908b50e5256cf084593.zip | |
Add new lint mismatching_type_param_order
Add new lint for checking if type parameters are consistent between type definitions and impl blocks.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/ui/mismatching_type_param_order.rs | 60 | ||||
| -rw-r--r-- | tests/ui/mismatching_type_param_order.stderr | 83 |
2 files changed, 143 insertions, 0 deletions
diff --git a/tests/ui/mismatching_type_param_order.rs b/tests/ui/mismatching_type_param_order.rs new file mode 100644 index 00000000000..8f286c9304c --- /dev/null +++ b/tests/ui/mismatching_type_param_order.rs @@ -0,0 +1,60 @@ +#![warn(clippy::mismatching_type_param_order)] +#![allow(clippy::blacklisted_name)] + +fn main() { + struct Foo<A, B> { + x: A, + y: B, + } + + // lint on both params + impl<B, A> Foo<B, A> {} + + // lint on the 2nd param + impl<C, A> Foo<C, A> {} + + // should not lint + impl<A, B> Foo<A, B> {} + + struct FooLifetime<'l, 'm, A, B> { + x: &'l A, + y: &'m B, + } + + // should not lint on lifetimes + impl<'m, 'l, B, A> FooLifetime<'m, 'l, B, A> {} + + struct Bar { + x: i32, + } + + // should not lint + impl Bar {} + + // also works for enums + enum FooEnum<A, B, C> { + X(A), + Y(B), + Z(C), + } + + impl<C, A, B> FooEnum<C, A, B> {} + + // also works for unions + union FooUnion<A: Copy, B> + where + B: Copy, + { + x: A, + y: B, + } + + impl<B: Copy, A> FooUnion<B, A> where A: Copy {} + + impl<A, B> FooUnion<A, B> + where + A: Copy, + B: Copy, + { + } +} diff --git a/tests/ui/mismatching_type_param_order.stderr b/tests/ui/mismatching_type_param_order.stderr new file mode 100644 index 00000000000..cb720256c50 --- /dev/null +++ b/tests/ui/mismatching_type_param_order.stderr @@ -0,0 +1,83 @@ +error: `Foo` has a similarly named generic type parameter `B` in its declaration, but in a different order + --> $DIR/mismatching_type_param_order.rs:11:20 + | +LL | impl<B, A> Foo<B, A> {} + | ^ + | + = note: `-D clippy::mismatching-type-param-order` implied by `-D warnings` + = help: try `A`, or a name that does not conflict with `Foo`'s generic params + +error: `Foo` has a similarly named generic type parameter `A` in its declaration, but in a different order + --> $DIR/mismatching_type_param_order.rs:11:23 + | +LL | impl<B, A> Foo<B, A> {} + | ^ + | + = help: try `B`, or a name that does not conflict with `Foo`'s generic params + +error: `Foo` has a similarly named generic type parameter `A` in its declaration, but in a different order + --> $DIR/mismatching_type_param_order.rs:14:23 + | +LL | impl<C, A> Foo<C, A> {} + | ^ + | + = help: try `B`, or a name that does not conflict with `Foo`'s generic params + +error: `FooLifetime` has a similarly named generic type parameter `B` in its declaration, but in a different order + --> $DIR/mismatching_type_param_order.rs:25:44 + | +LL | impl<'m, 'l, B, A> FooLifetime<'m, 'l, B, A> {} + | ^ + | + = help: try `A`, or a name that does not conflict with `FooLifetime`'s generic params + +error: `FooLifetime` has a similarly named generic type parameter `A` in its declaration, but in a different order + --> $DIR/mismatching_type_param_order.rs:25:47 + | +LL | impl<'m, 'l, B, A> FooLifetime<'m, 'l, B, A> {} + | ^ + | + = help: try `B`, or a name that does not conflict with `FooLifetime`'s generic params + +error: `FooEnum` has a similarly named generic type parameter `C` in its declaration, but in a different order + --> $DIR/mismatching_type_param_order.rs:41:27 + | +LL | impl<C, A, B> FooEnum<C, A, B> {} + | ^ + | + = help: try `A`, or a name that does not conflict with `FooEnum`'s generic params + +error: `FooEnum` has a similarly named generic type parameter `A` in its declaration, but in a different order + --> $DIR/mismatching_type_param_order.rs:41:30 + | +LL | impl<C, A, B> FooEnum<C, A, B> {} + | ^ + | + = help: try `B`, or a name that does not conflict with `FooEnum`'s generic params + +error: `FooEnum` has a similarly named generic type parameter `B` in its declaration, but in a different order + --> $DIR/mismatching_type_param_order.rs:41:33 + | +LL | impl<C, A, B> FooEnum<C, A, B> {} + | ^ + | + = help: try `C`, or a name that does not conflict with `FooEnum`'s generic params + +error: `FooUnion` has a similarly named generic type parameter `B` in its declaration, but in a different order + --> $DIR/mismatching_type_param_order.rs:52:31 + | +LL | impl<B: Copy, A> FooUnion<B, A> where A: Copy {} + | ^ + | + = help: try `A`, or a name that does not conflict with `FooUnion`'s generic params + +error: `FooUnion` has a similarly named generic type parameter `A` in its declaration, but in a different order + --> $DIR/mismatching_type_param_order.rs:52:34 + | +LL | impl<B: Copy, A> FooUnion<B, A> where A: Copy {} + | ^ + | + = help: try `B`, or a name that does not conflict with `FooUnion`'s generic params + +error: aborting due to 10 previous errors + |
