rust-clippy/tests/ui/same_name_method.rs
Nicholas Nethercote ae0f0fd655 Don't hash lints differently to non-lints.
`Diagnostic::keys`, which is used for hashing and equating diagnostics,
has a surprising behaviour: it ignores children, but only for lints.
This was added in #88493 to fix some duplicated diagnostics, but it
doesn't seem necessary any more.

This commit removes the special case and only four tests have changed
output, with additional errors. And those additional errors aren't
exact duplicates, they're just similar. For example, in
src/tools/clippy/tests/ui/same_name_method.rs we currently have this
error:
```
error: method's name is the same as an existing method in a trait
  --> $DIR/same_name_method.rs:75:13
   |
LL |             fn foo() {}
   |             ^^^^^^^^^^^
   |
note: existing `foo` defined here
  --> $DIR/same_name_method.rs:79:9
   |
LL |         impl T1 for S {}
   |         ^^^^^^^^^^^^^^^^
```
and with this change we also get this error:
```
error: method's name is the same as an existing method in a trait
  --> $DIR/same_name_method.rs:75:13
   |
LL |             fn foo() {}
   |             ^^^^^^^^^^^
   |
note: existing `foo` defined here
  --> $DIR/same_name_method.rs:81:9
   |
LL |         impl T2 for S {}
   |         ^^^^^^^^^^^^^^^^
```
I think printing this second argument is reasonable, possibly even
preferable to hiding it. And the other cases are similar.
2024-01-31 08:25:29 +11:00

133 lines
2.2 KiB
Rust

#![feature(lint_reasons)]
#![warn(clippy::same_name_method)]
#![allow(dead_code, non_camel_case_types)]
trait T1 {
fn foo() {}
}
trait T2 {
fn foo() {}
}
mod should_lint {
mod test_basic_case {
use crate::T1;
struct S;
impl S {
fn foo() {}
//~^ ERROR: method's name is the same as an existing method in a trait
}
impl T1 for S {
fn foo() {}
}
}
mod test_derive {
#[derive(Clone)]
struct S;
impl S {
fn clone() {}
//~^ ERROR: method's name is the same as an existing method in a trait
}
}
mod with_generic {
use crate::T1;
struct S<U>(U);
impl<U> S<U> {
fn foo() {}
//~^ ERROR: method's name is the same as an existing method in a trait
}
impl<U: Copy> T1 for S<U> {
fn foo() {}
}
}
mod default_method {
use crate::T1;
struct S;
impl S {
fn foo() {}
//~^ ERROR: method's name is the same as an existing method in a trait
}
impl T1 for S {}
}
mod multiple_conflicting_traits {
use crate::{T1, T2};
struct S;
impl S {
fn foo() {}
//~^ ERROR: method's name is the same as an existing method in a trait
//~| ERROR: method's name is the same as an existing method in a trait
}
impl T1 for S {}
impl T2 for S {}
}
}
mod should_not_lint {
mod not_lint_two_trait_method {
use crate::{T1, T2};
struct S;
impl T1 for S {
fn foo() {}
}
impl T2 for S {
fn foo() {}
}
}
mod only_lint_on_method {
trait T3 {
type foo;
}
struct S;
impl S {
fn foo() {}
}
impl T3 for S {
type foo = usize;
}
}
}
mod check_expect_suppression {
use crate::T1;
struct S;
impl S {
#[expect(clippy::same_name_method)]
fn foo() {}
}
impl T1 for S {
fn foo() {}
}
}
fn main() {}