File tree 1 file changed +26
-0
lines changed
1 file changed +26
-0
lines changed Original file line number Diff line number Diff line change 12
12
#![ feature( hash_default) ]
13
13
14
14
use std:: hash:: { Hash , SipHasher , Hasher } ;
15
+ use std:: mem:: size_of;
15
16
16
17
#[ derive( Hash ) ]
17
18
struct Person {
@@ -24,12 +25,30 @@ struct Person {
24
25
#[ derive( Hash ) ] struct __H__H ;
25
26
#[ derive( Hash ) ] enum Collision < __H > { __H { __H__H : __H } }
26
27
28
+ #[ derive( Hash ) ]
29
+ enum E { A =1 , B }
30
+
27
31
fn hash < T : Hash > ( t : & T ) -> u64 {
28
32
let mut s = SipHasher :: new_with_keys ( 0 , 0 ) ;
29
33
t. hash ( & mut s) ;
30
34
s. finish ( )
31
35
}
32
36
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
+
33
52
fn main ( ) {
34
53
let person1 = Person {
35
54
id : 5 ,
@@ -43,4 +62,11 @@ fn main() {
43
62
} ;
44
63
assert_eq ! ( hash( & person1) , hash( & person1) ) ;
45
64
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) ;
46
72
}
You can’t perform that action at this time.
0 commit comments