diff options
| author | bors <bors@rust-lang.org> | 2016-03-27 06:13:53 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2016-03-27 06:13:53 -0700 |
| commit | deee0f73da885a71ebf9c8d29213c663dba467b9 (patch) | |
| tree | fae606c1a9af5ae0f3f0f83edad23d232776b4b6 /src/test | |
| parent | abb3a107e45b93ca5332ab11bfa6cc8d5a882fb4 (diff) | |
| parent | 1e67d8a57099eb9d286b5a4adfa798c1b3d437b9 (diff) | |
| download | rust-deee0f73da885a71ebf9c8d29213c663dba467b9.tar.gz rust-deee0f73da885a71ebf9c8d29213c663dba467b9.zip | |
Auto merge of #32252 - durka:derive-21714, r=alexcrichton
derive: use discriminant_value in #[derive(Hash)] derive: use discriminant_value in #[derive(Hash)] Fixes #21714. Spawned from #32139. r? @alexcrichton
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/run-pass/deriving-hash.rs | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/test/run-pass/deriving-hash.rs b/src/test/run-pass/deriving-hash.rs index a98cfa2393f..91bfc2f9201 100644 --- a/src/test/run-pass/deriving-hash.rs +++ b/src/test/run-pass/deriving-hash.rs @@ -12,6 +12,7 @@ #![feature(hash_default)] use std::hash::{Hash, SipHasher, Hasher}; +use std::mem::size_of; #[derive(Hash)] struct Person { @@ -24,12 +25,30 @@ struct Person { #[derive(Hash)] struct __H__H; #[derive(Hash)] enum Collision<__H> { __H { __H__H: __H } } +#[derive(Hash)] +enum E { A=1, B } + fn hash<T: Hash>(t: &T) -> u64 { let mut s = SipHasher::new_with_keys(0, 0); t.hash(&mut s); s.finish() } +struct FakeHasher<'a>(&'a mut Vec<u8>); +impl<'a> Hasher for FakeHasher<'a> { + fn finish(&self) -> u64 { + unimplemented!() + } + + fn write(&mut self, bytes: &[u8]) { + self.0.extend(bytes); + } +} + +fn fake_hash(v: &mut Vec<u8>, e: E) { + e.hash(&mut FakeHasher(v)); +} + fn main() { let person1 = Person { id: 5, @@ -43,4 +62,11 @@ fn main() { }; assert_eq!(hash(&person1), hash(&person1)); assert!(hash(&person1) != hash(&person2)); + + // test #21714 + let mut va = vec![]; + let mut vb = vec![]; + fake_hash(&mut va, E::A); + fake_hash(&mut vb, E::B); + assert!(va != vb); } |
