@@ -777,7 +777,7 @@ fn test_range_backwards_4() {
777
777
778
778
#[ test]
779
779
#[ should_panic]
780
- fn test_range_backwards_5 ( ) {
780
+ fn test_range_finding_ill_order_in_map ( ) {
781
781
let mut map = BTreeMap :: new ( ) ;
782
782
map. insert ( Cyclic3 :: B , ( ) ) ;
783
783
// Lacking static_assert, call `range` conditionally, to emphasise that
@@ -788,6 +788,47 @@ fn test_range_backwards_5() {
788
788
}
789
789
}
790
790
791
+ #[ test]
792
+ #[ should_panic]
793
+ fn test_range_finding_ill_order_in_range_ord ( ) {
794
+ // Has proper order the first time asked, then flips around.
795
+ struct EvilTwin ( i32 ) ;
796
+
797
+ impl PartialOrd for EvilTwin {
798
+ fn partial_cmp ( & self , other : & Self ) -> Option < Ordering > {
799
+ Some ( self . cmp ( other) )
800
+ }
801
+ }
802
+
803
+ static COMPARES : AtomicUsize = AtomicUsize :: new ( 0 ) ;
804
+ impl Ord for EvilTwin {
805
+ fn cmp ( & self , other : & Self ) -> Ordering {
806
+ let ord = self . 0 . cmp ( & other. 0 ) ;
807
+ if COMPARES . fetch_add ( 1 , SeqCst ) > 0 { ord. reverse ( ) } else { ord }
808
+ }
809
+ }
810
+
811
+ impl PartialEq for EvilTwin {
812
+ fn eq ( & self , other : & Self ) -> bool {
813
+ self . 0 . eq ( & other. 0 )
814
+ }
815
+ }
816
+
817
+ impl Eq for EvilTwin { }
818
+
819
+ #[ derive( PartialEq , Eq , PartialOrd , Ord ) ]
820
+ struct CompositeKey ( i32 , EvilTwin ) ;
821
+
822
+ impl Borrow < EvilTwin > for CompositeKey {
823
+ fn borrow ( & self ) -> & EvilTwin {
824
+ & self . 1
825
+ }
826
+ }
827
+
828
+ let map = ( 0 ..12 ) . map ( |i| ( CompositeKey ( i, EvilTwin ( i) ) , ( ) ) ) . collect :: < BTreeMap < _ , _ > > ( ) ;
829
+ map. range ( EvilTwin ( 5 ) ..=EvilTwin ( 7 ) ) ;
830
+ }
831
+
791
832
#[ test]
792
833
fn test_range_1000 ( ) {
793
834
// Miri is too slow
@@ -1222,6 +1263,51 @@ fn test_borrow() {
1222
1263
map. insert ( Rc :: new ( 0 ) , 1 ) ;
1223
1264
assert_eq ! ( map[ & 0 ] , 1 ) ;
1224
1265
}
1266
+
1267
+ #[ allow( dead_code) ]
1268
+ fn get < T : Ord > ( v : & BTreeMap < Box < T > , ( ) > , t : & T ) {
1269
+ v. get ( t) ;
1270
+ }
1271
+
1272
+ #[ allow( dead_code) ]
1273
+ fn get_mut < T : Ord > ( v : & mut BTreeMap < Box < T > , ( ) > , t : & T ) {
1274
+ v. get_mut ( t) ;
1275
+ }
1276
+
1277
+ #[ allow( dead_code) ]
1278
+ fn get_key_value < T : Ord > ( v : & BTreeMap < Box < T > , ( ) > , t : & T ) {
1279
+ v. get_key_value ( t) ;
1280
+ }
1281
+
1282
+ #[ allow( dead_code) ]
1283
+ fn contains_key < T : Ord > ( v : & BTreeMap < Box < T > , ( ) > , t : & T ) {
1284
+ v. contains_key ( t) ;
1285
+ }
1286
+
1287
+ #[ allow( dead_code) ]
1288
+ fn range < T : Ord > ( v : & BTreeMap < Box < T > , ( ) > , t : T ) {
1289
+ v. range ( t..) ;
1290
+ }
1291
+
1292
+ #[ allow( dead_code) ]
1293
+ fn range_mut < T : Ord > ( v : & mut BTreeMap < Box < T > , ( ) > , t : T ) {
1294
+ v. range_mut ( t..) ;
1295
+ }
1296
+
1297
+ #[ allow( dead_code) ]
1298
+ fn remove < T : Ord > ( v : & mut BTreeMap < Box < T > , ( ) > , t : & T ) {
1299
+ v. remove ( t) ;
1300
+ }
1301
+
1302
+ #[ allow( dead_code) ]
1303
+ fn remove_entry < T : Ord > ( v : & mut BTreeMap < Box < T > , ( ) > , t : & T ) {
1304
+ v. remove_entry ( t) ;
1305
+ }
1306
+
1307
+ #[ allow( dead_code) ]
1308
+ fn split_off < T : Ord > ( v : & mut BTreeMap < Box < T > , ( ) > , t : & T ) {
1309
+ v. split_off ( t) ;
1310
+ }
1225
1311
}
1226
1312
1227
1313
#[ test]
0 commit comments