Skip to content

Commit 01c0723

Browse files
committed
add #[derive(Hash)] test for #21714
1 parent 68de28b commit 01c0723

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

src/test/run-pass/deriving-hash.rs

+26
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#![feature(hash_default)]
1313

1414
use std::hash::{Hash, SipHasher, Hasher};
15+
use std::mem::size_of;
1516

1617
#[derive(Hash)]
1718
struct Person {
@@ -24,12 +25,30 @@ struct Person {
2425
#[derive(Hash)] struct __H__H;
2526
#[derive(Hash)] enum Collision<__H> { __H { __H__H: __H } }
2627

28+
#[derive(Hash)]
29+
enum E { A=1, B }
30+
2731
fn hash<T: Hash>(t: &T) -> u64 {
2832
let mut s = SipHasher::new_with_keys(0, 0);
2933
t.hash(&mut s);
3034
s.finish()
3135
}
3236

37+
struct FakeHasher<'a>(&'a mut Vec<u8>);
38+
impl<'a> Hasher for FakeHasher<'a> {
39+
fn finish(&self) -> u64 {
40+
unimplemented!()
41+
}
42+
43+
fn write(&mut self, bytes: &[u8]) {
44+
self.0.extend(bytes);
45+
}
46+
}
47+
48+
fn fake_hash(v: &mut Vec<u8>, e: E) {
49+
e.hash(&mut FakeHasher(v));
50+
}
51+
3352
fn main() {
3453
let person1 = Person {
3554
id: 5,
@@ -43,4 +62,11 @@ fn main() {
4362
};
4463
assert_eq!(hash(&person1), hash(&person1));
4564
assert!(hash(&person1) != hash(&person2));
65+
66+
// test #21714
67+
let mut va = vec![];
68+
let mut vb = vec![];
69+
fake_hash(&mut va, E::A);
70+
fake_hash(&mut vb, E::B);
71+
assert!(va != vb);
4672
}

0 commit comments

Comments
 (0)