@@ -777,7 +777,7 @@ fn test_range_backwards_4() {
777777
778778#[ test]
779779#[ should_panic]
780- fn test_range_backwards_5 ( ) {
780+ fn test_range_finding_ill_order_in_map ( ) {
781781 let mut map = BTreeMap :: new ( ) ;
782782 map. insert ( Cyclic3 :: B , ( ) ) ;
783783 // Lacking static_assert, call `range` conditionally, to emphasise that
@@ -788,6 +788,47 @@ fn test_range_backwards_5() {
788788 }
789789}
790790
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+
791832#[ test]
792833fn test_range_1000 ( ) {
793834 // Miri is too slow
@@ -1222,6 +1263,51 @@ fn test_borrow() {
12221263 map. insert ( Rc :: new ( 0 ) , 1 ) ;
12231264 assert_eq ! ( map[ & 0 ] , 1 ) ;
12241265 }
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+ }
12251311}
12261312
12271313#[ test]
0 commit comments