@@ -1634,9 +1634,11 @@ impl<'a, K, V> RangeMut<'a, K, V> {
1634
1634
1635
1635
let mut cur_handle = match handle. right_kv ( ) {
1636
1636
Ok ( kv) => {
1637
- let ( k, v) = ptr:: read ( & kv) . into_kv_mut ( ) ;
1638
- self . front = kv. right_edge ( ) ;
1639
- return ( k, v) ;
1637
+ self . front = ptr:: read ( & kv) . right_edge ( ) ;
1638
+ // Doing the descend invalidates the references returned by `into_kv_mut`,
1639
+ // so we have to do this last.
1640
+ let ( k, v) = kv. into_kv_mut ( ) ;
1641
+ return ( k, v) ; // coerce k from `&mut K` to `&K`
1640
1642
}
1641
1643
Err ( last_edge) => {
1642
1644
let next_level = last_edge. into_node ( ) . ascend ( ) . ok ( ) ;
@@ -1647,9 +1649,11 @@ impl<'a, K, V> RangeMut<'a, K, V> {
1647
1649
loop {
1648
1650
match cur_handle. right_kv ( ) {
1649
1651
Ok ( kv) => {
1650
- let ( k, v) = ptr:: read ( & kv) . into_kv_mut ( ) ;
1651
- self . front = first_leaf_edge ( kv. right_edge ( ) . descend ( ) ) ;
1652
- return ( k, v) ;
1652
+ self . front = first_leaf_edge ( ptr:: read ( & kv) . right_edge ( ) . descend ( ) ) ;
1653
+ // Doing the descend invalidates the references returned by `into_kv_mut`,
1654
+ // so we have to do this last.
1655
+ let ( k, v) = kv. into_kv_mut ( ) ;
1656
+ return ( k, v) ; // coerce k from `&mut K` to `&K`
1653
1657
}
1654
1658
Err ( last_edge) => {
1655
1659
let next_level = last_edge. into_node ( ) . ascend ( ) . ok ( ) ;
@@ -1680,9 +1684,11 @@ impl<'a, K, V> RangeMut<'a, K, V> {
1680
1684
1681
1685
let mut cur_handle = match handle. left_kv ( ) {
1682
1686
Ok ( kv) => {
1683
- let ( k, v) = ptr:: read ( & kv) . into_kv_mut ( ) ;
1684
- self . back = kv. left_edge ( ) ;
1685
- return ( k, v) ;
1687
+ self . back = ptr:: read ( & kv) . left_edge ( ) ;
1688
+ // Doing the descend invalidates the references returned by `into_kv_mut`,
1689
+ // so we have to do this last.
1690
+ let ( k, v) = kv. into_kv_mut ( ) ;
1691
+ return ( k, v) ; // coerce k from `&mut K` to `&K`
1686
1692
}
1687
1693
Err ( last_edge) => {
1688
1694
let next_level = last_edge. into_node ( ) . ascend ( ) . ok ( ) ;
@@ -1693,9 +1699,11 @@ impl<'a, K, V> RangeMut<'a, K, V> {
1693
1699
loop {
1694
1700
match cur_handle. left_kv ( ) {
1695
1701
Ok ( kv) => {
1696
- let ( k, v) = ptr:: read ( & kv) . into_kv_mut ( ) ;
1697
- self . back = last_leaf_edge ( kv. left_edge ( ) . descend ( ) ) ;
1698
- return ( k, v) ;
1702
+ self . back = last_leaf_edge ( ptr:: read ( & kv) . left_edge ( ) . descend ( ) ) ;
1703
+ // Doing the descend invalidates the references returned by `into_kv_mut`,
1704
+ // so we have to do this last.
1705
+ let ( k, v) = kv. into_kv_mut ( ) ;
1706
+ return ( k, v) ; // coerce k from `&mut K` to `&K`
1699
1707
}
1700
1708
Err ( last_edge) => {
1701
1709
let next_level = last_edge. into_node ( ) . ascend ( ) . ok ( ) ;
0 commit comments