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 {
@@ -20,12 +21,30 @@ struct Person {
20
21
phone : usize ,
21
22
}
22
23
24
+ #[ derive( Hash ) ]
25
+ enum E { A =1 , B }
26
+
23
27
fn hash < T : Hash > ( t : & T ) -> u64 {
24
28
let mut s = SipHasher :: new_with_keys ( 0 , 0 ) ;
25
29
t. hash ( & mut s) ;
26
30
s. finish ( )
27
31
}
28
32
33
+ struct FakeHasher < ' a > ( & ' a mut Vec < u8 > ) ;
34
+ impl < ' a > Hasher for FakeHasher < ' a > {
35
+ fn finish ( & self ) -> u64 {
36
+ unimplemented ! ( )
37
+ }
38
+
39
+ fn write ( & mut self , bytes : & [ u8 ] ) {
40
+ self . 0 . extend ( bytes) ;
41
+ }
42
+ }
43
+
44
+ fn fake_hash ( v : & mut Vec < u8 > , e : E ) {
45
+ e. hash ( & mut FakeHasher ( v) ) ;
46
+ }
47
+
29
48
fn main ( ) {
30
49
let person1 = Person {
31
50
id : 5 ,
@@ -39,4 +58,11 @@ fn main() {
39
58
} ;
40
59
assert_eq ! ( hash( & person1) , hash( & person1) ) ;
41
60
assert ! ( hash( & person1) != hash( & person2) ) ;
61
+
62
+ // test #21714
63
+ let mut va = vec ! [ ] ;
64
+ let mut vb = vec ! [ ] ;
65
+ fake_hash ( & mut va, E :: A ) ;
66
+ fake_hash ( & mut vb, E :: B ) ;
67
+ assert ! ( va != vb) ;
42
68
}
You can’t perform that action at this time.
0 commit comments