]> git.lizzy.rs Git - rust.git/commitdiff
Fix false positive in derive_hash_xor_eq
authorPhilipp Hansch <dev@phansch.net>
Fri, 1 Nov 2019 19:12:08 +0000 (20:12 +0100)
committerPhilipp Hansch <dev@phansch.net>
Mon, 11 Nov 2019 06:59:53 +0000 (07:59 +0100)
This fixes a false positive in derive_hash_xor_eq where the lint was
triggering on user-defined traits called `Hash`.

clippy_lints/src/derive.rs
tests/ui/derive_hash_xor_eq.rs
tests/ui/derive_hash_xor_eq.stderr

index fa981ce78d9a2b5c568e69cc95de9afc17a794e3..f60ed90cd7c1e3eaaf76cb8d0128a1b1574b956a 100644 (file)
@@ -90,6 +90,7 @@ fn check_hash_peq<'a, 'tcx>(
     if_chain! {
         if match_path(&trait_ref.path, &paths::HASH);
         if let Some(peq_trait_def_id) = cx.tcx.lang_items().eq_trait();
+        if !&trait_ref.trait_def_id().is_local();
         then {
             // Look for the PartialEq implementations for `ty`
             cx.tcx.for_each_relevant_impl(peq_trait_def_id, ty, |impl_id| {
index c0be787f5e40f95e86f81df3663f590b6ad256d6..10abe22d53e5c1338c8f136eacc301e8c77e4128 100644 (file)
@@ -1,5 +1,3 @@
-use std::hash::{Hash, Hasher};
-
 #[derive(PartialEq, Hash)]
 struct Foo;
 
@@ -30,8 +28,27 @@ fn eq(&self, _: &Baz) -> bool {
 #[derive(PartialEq)]
 struct Bah;
 
-impl Hash for Bah {
-    fn hash<H: Hasher>(&self, _: &mut H) {}
+impl std::hash::Hash for Bah {
+    fn hash<H: std::hash::Hasher>(&self, _: &mut H) {}
+}
+
+#[derive(PartialEq)]
+struct Foo2;
+
+trait Hash {}
+
+// We don't want to lint on user-defined traits called `Hash`
+impl Hash for Foo2 {}
+
+mod use_hash {
+    use std::hash::{Hash, Hasher};
+
+    #[derive(PartialEq)]
+    struct Foo3;
+
+    impl Hash for Foo3 {
+        fn hash<H: std::hash::Hasher>(&self, _: &mut H) {}
+    }
 }
 
 fn main() {}
index c3d451aaed68e7f6f86214caa8d8305260ad650e..10c38bb42e39baaebb5cfe21e7e0500e08d3d75d 100644 (file)
@@ -1,12 +1,12 @@
 error: you are deriving `Hash` but have implemented `PartialEq` explicitly
-  --> $DIR/derive_hash_xor_eq.rs:12:10
+  --> $DIR/derive_hash_xor_eq.rs:10:10
    |
 LL | #[derive(Hash)]
    |          ^^^^
    |
    = note: `#[deny(clippy::derive_hash_xor_eq)]` on by default
 note: `PartialEq` implemented here
-  --> $DIR/derive_hash_xor_eq.rs:15:1
+  --> $DIR/derive_hash_xor_eq.rs:13:1
    |
 LL | / impl PartialEq for Bar {
 LL | |     fn eq(&self, _: &Bar) -> bool {
@@ -16,13 +16,13 @@ LL | | }
    | |_^
 
 error: you are deriving `Hash` but have implemented `PartialEq` explicitly
-  --> $DIR/derive_hash_xor_eq.rs:21:10
+  --> $DIR/derive_hash_xor_eq.rs:19:10
    |
 LL | #[derive(Hash)]
    |          ^^^^
    |
 note: `PartialEq` implemented here
-  --> $DIR/derive_hash_xor_eq.rs:24:1
+  --> $DIR/derive_hash_xor_eq.rs:22:1
    |
 LL | / impl PartialEq<Baz> for Baz {
 LL | |     fn eq(&self, _: &Baz) -> bool {
@@ -32,18 +32,32 @@ LL | | }
    | |_^
 
 error: you are implementing `Hash` explicitly but have derived `PartialEq`
-  --> $DIR/derive_hash_xor_eq.rs:33:1
+  --> $DIR/derive_hash_xor_eq.rs:31:1
    |
-LL | / impl Hash for Bah {
-LL | |     fn hash<H: Hasher>(&self, _: &mut H) {}
+LL | / impl std::hash::Hash for Bah {
+LL | |     fn hash<H: std::hash::Hasher>(&self, _: &mut H) {}
 LL | | }
    | |_^
    |
 note: `PartialEq` implemented here
-  --> $DIR/derive_hash_xor_eq.rs:30:10
+  --> $DIR/derive_hash_xor_eq.rs:28:10
    |
 LL | #[derive(PartialEq)]
    |          ^^^^^^^^^
 
-error: aborting due to 3 previous errors
+error: you are implementing `Hash` explicitly but have derived `PartialEq`
+  --> $DIR/derive_hash_xor_eq.rs:49:5
+   |
+LL | /     impl Hash for Foo3 {
+LL | |         fn hash<H: std::hash::Hasher>(&self, _: &mut H) {}
+LL | |     }
+   | |_____^
+   |
+note: `PartialEq` implemented here
+  --> $DIR/derive_hash_xor_eq.rs:46:14
+   |
+LL |     #[derive(PartialEq)]
+   |              ^^^^^^^^^
+
+error: aborting due to 4 previous errors