@@ -2588,7 +2588,7 @@ fn assert_covariance() {
2588
2588
2589
2589
#[ cfg( test) ]
2590
2590
mod test_set {
2591
- use super :: HashSet ;
2591
+ use super :: { make_hash , Equivalent , HashSet } ;
2592
2592
use crate :: DefaultHashBuilder ;
2593
2593
use std:: vec:: Vec ;
2594
2594
@@ -3062,4 +3062,57 @@ mod test_set {
3062
3062
assert_eq ! ( HashSet :: <u32 >:: new( ) . allocation_size( ) , 0 ) ;
3063
3063
assert ! ( HashSet :: <u32 >:: with_capacity( 1 ) . allocation_size( ) > core:: mem:: size_of:: <u32 >( ) ) ;
3064
3064
}
3065
+
3066
+ #[ test]
3067
+ fn duplicate_insert ( ) {
3068
+ let mut set = HashSet :: new ( ) ;
3069
+ set. insert ( 1 ) ;
3070
+ set. get_or_insert_with ( & 1 , |_| 1 ) ;
3071
+ set. get_or_insert_with ( & 1 , |_| 1 ) ;
3072
+ assert ! ( [ 1 ] . iter( ) . eq( set. iter( ) ) ) ;
3073
+ }
3074
+
3075
+ #[ test]
3076
+ #[ should_panic]
3077
+ fn some_invalid_equivalent ( ) {
3078
+ use core:: hash:: { Hash , Hasher } ;
3079
+ struct Invalid {
3080
+ count : u32 ,
3081
+ other : u32 ,
3082
+ }
3083
+
3084
+ struct InvalidRef {
3085
+ count : u32 ,
3086
+ other : u32 ,
3087
+ }
3088
+
3089
+ impl PartialEq for Invalid {
3090
+ fn eq ( & self , other : & Self ) -> bool {
3091
+ self . count == other. count && self . other == other. other
3092
+ }
3093
+ }
3094
+ impl Eq for Invalid { }
3095
+
3096
+ impl Equivalent < Invalid > for InvalidRef {
3097
+ fn equivalent ( & self , key : & Invalid ) -> bool {
3098
+ self . count == key. count && self . other == key. other
3099
+ }
3100
+ }
3101
+ impl Hash for Invalid {
3102
+ fn hash < H : Hasher > ( & self , state : & mut H ) {
3103
+ self . count . hash ( state) ;
3104
+ }
3105
+ }
3106
+ impl Hash for InvalidRef {
3107
+ fn hash < H : Hasher > ( & self , state : & mut H ) {
3108
+ self . count . hash ( state) ;
3109
+ }
3110
+ }
3111
+ let mut set: HashSet < Invalid > = HashSet :: new ( ) ;
3112
+ let key = InvalidRef { count : 1 , other : 1 } ;
3113
+ let value = Invalid { count : 1 , other : 2 } ;
3114
+ if make_hash ( set. hasher ( ) , & key) == make_hash ( set. hasher ( ) , & value) {
3115
+ set. get_or_insert_with ( & key, |_| value) ;
3116
+ }
3117
+ }
3065
3118
}
0 commit comments