summaryrefslogtreecommitdiffstats
path: root/src/tools/clippy/tests/ui/impl_hash_with_borrow_str_and_bytes.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/clippy/tests/ui/impl_hash_with_borrow_str_and_bytes.rs')
-rw-r--r--src/tools/clippy/tests/ui/impl_hash_with_borrow_str_and_bytes.rs136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/tools/clippy/tests/ui/impl_hash_with_borrow_str_and_bytes.rs b/src/tools/clippy/tests/ui/impl_hash_with_borrow_str_and_bytes.rs
new file mode 100644
index 000000000..f6ce6153e
--- /dev/null
+++ b/src/tools/clippy/tests/ui/impl_hash_with_borrow_str_and_bytes.rs
@@ -0,0 +1,136 @@
+#![warn(clippy::impl_hash_borrow_with_str_and_bytes)]
+
+use std::borrow::Borrow;
+use std::hash::{Hash, Hasher};
+
+struct ExampleType {
+ data: String,
+}
+
+impl Hash for ExampleType {
+ //~^ ERROR: can't
+ fn hash<H: Hasher>(&self, state: &mut H) {
+ self.data.hash(state);
+ }
+}
+
+impl Borrow<str> for ExampleType {
+ fn borrow(&self) -> &str {
+ &self.data
+ }
+}
+
+impl Borrow<[u8]> for ExampleType {
+ fn borrow(&self) -> &[u8] {
+ self.data.as_bytes()
+ }
+}
+
+struct ShouldNotRaiseForHash {}
+impl Hash for ShouldNotRaiseForHash {
+ fn hash<H: Hasher>(&self, state: &mut H) {
+ todo!();
+ }
+}
+
+struct ShouldNotRaiseForBorrow {}
+impl Borrow<str> for ShouldNotRaiseForBorrow {
+ fn borrow(&self) -> &str {
+ todo!();
+ }
+}
+impl Borrow<[u8]> for ShouldNotRaiseForBorrow {
+ fn borrow(&self) -> &[u8] {
+ todo!();
+ }
+}
+
+struct ShouldNotRaiseForHashBorrowStr {}
+impl Hash for ShouldNotRaiseForHashBorrowStr {
+ fn hash<H: Hasher>(&self, state: &mut H) {
+ todo!();
+ }
+}
+impl Borrow<str> for ShouldNotRaiseForHashBorrowStr {
+ fn borrow(&self) -> &str {
+ todo!();
+ }
+}
+
+struct ShouldNotRaiseForHashBorrowSlice {}
+impl Hash for ShouldNotRaiseForHashBorrowSlice {
+ fn hash<H: Hasher>(&self, state: &mut H) {
+ todo!();
+ }
+}
+
+impl Borrow<[u8]> for ShouldNotRaiseForHashBorrowSlice {
+ fn borrow(&self) -> &[u8] {
+ todo!();
+ }
+}
+
+#[derive(Hash)]
+//~^ ERROR: can't
+struct Derived {
+ data: String,
+}
+
+impl Borrow<str> for Derived {
+ fn borrow(&self) -> &str {
+ self.data.as_str()
+ }
+}
+
+impl Borrow<[u8]> for Derived {
+ fn borrow(&self) -> &[u8] {
+ self.data.as_bytes()
+ }
+}
+
+struct GenericExampleType<T> {
+ data: T,
+}
+
+impl<T: Hash> Hash for GenericExampleType<T> {
+ fn hash<H: Hasher>(&self, state: &mut H) {
+ self.data.hash(state);
+ }
+}
+
+impl Borrow<str> for GenericExampleType<String> {
+ fn borrow(&self) -> &str {
+ &self.data
+ }
+}
+
+impl Borrow<[u8]> for GenericExampleType<&'static [u8]> {
+ fn borrow(&self) -> &[u8] {
+ self.data
+ }
+}
+
+struct GenericExampleType2<T> {
+ data: T,
+}
+
+impl Hash for GenericExampleType2<String> {
+ //~^ ERROR: can't
+ // this is correctly throwing an error for generic with concrete impl
+ // for all 3 types
+ fn hash<H: Hasher>(&self, state: &mut H) {
+ self.data.hash(state);
+ }
+}
+
+impl Borrow<str> for GenericExampleType2<String> {
+ fn borrow(&self) -> &str {
+ &self.data
+ }
+}
+
+impl Borrow<[u8]> for GenericExampleType2<String> {
+ fn borrow(&self) -> &[u8] {
+ self.data.as_bytes()
+ }
+}