Skip to content

Commit db15253

Browse files
authored
Rollup merge of rust-lang#76722 - ssomers:btree_send_sync, r=Mark-Simulacrum
Test and fix Send and Sync traits of BTreeMap artefacts Fixes rust-lang#76686. I'm not quite sure what all this implies. E.g. comparing with the definitions for `NodeRef` in node.rs, maybe an extra bound `T: 'a` is useful for something. The test compiles on stable/beta (apart from `drain_filter`) so I bet `Sync` is equally desirable. r? @Mark-Simulacrum
2 parents 0e0576f + 176956c commit db15253

File tree

2 files changed

+143
-0
lines changed

2 files changed

+143
-0
lines changed

library/alloc/src/collections/btree/borrow.rs

+3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ pub struct DormantMutRef<'a, T> {
1616
_marker: PhantomData<&'a mut T>,
1717
}
1818

19+
unsafe impl<'a, T> Sync for DormantMutRef<'a, T> where &'a mut T: Sync {}
20+
unsafe impl<'a, T> Send for DormantMutRef<'a, T> where &'a mut T: Send {}
21+
1922
impl<'a, T> DormantMutRef<'a, T> {
2023
/// Capture a unique borrow, and immediately reborrow it. For the compiler,
2124
/// the lifetime of the new reference is the same as the lifetime of the

library/alloc/src/collections/btree/map/tests.rs

+140
Original file line numberDiff line numberDiff line change
@@ -1418,6 +1418,146 @@ fn test_variance() {
14181418
}
14191419
}
14201420

1421+
#[test]
1422+
#[allow(dead_code)]
1423+
fn test_sync() {
1424+
fn map<T: Sync>(v: &BTreeMap<T, T>) -> impl Sync + '_ {
1425+
v
1426+
}
1427+
1428+
fn into_iter<T: Sync>(v: BTreeMap<T, T>) -> impl Sync {
1429+
v.into_iter()
1430+
}
1431+
1432+
fn into_keys<T: Sync + Ord>(v: BTreeMap<T, T>) -> impl Sync {
1433+
v.into_keys()
1434+
}
1435+
1436+
fn into_values<T: Sync + Ord>(v: BTreeMap<T, T>) -> impl Sync {
1437+
v.into_values()
1438+
}
1439+
1440+
fn drain_filter<T: Sync + Ord>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ {
1441+
v.drain_filter(|_, _| false)
1442+
}
1443+
1444+
fn iter<T: Sync>(v: &BTreeMap<T, T>) -> impl Sync + '_ {
1445+
v.iter()
1446+
}
1447+
1448+
fn iter_mut<T: Sync>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ {
1449+
v.iter_mut()
1450+
}
1451+
1452+
fn keys<T: Sync>(v: &BTreeMap<T, T>) -> impl Sync + '_ {
1453+
v.keys()
1454+
}
1455+
1456+
fn values<T: Sync>(v: &BTreeMap<T, T>) -> impl Sync + '_ {
1457+
v.values()
1458+
}
1459+
1460+
fn values_mut<T: Sync>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ {
1461+
v.values_mut()
1462+
}
1463+
1464+
fn range<T: Sync + Ord>(v: &BTreeMap<T, T>) -> impl Sync + '_ {
1465+
v.range(..)
1466+
}
1467+
1468+
fn range_mut<T: Sync + Ord>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ {
1469+
v.range_mut(..)
1470+
}
1471+
1472+
fn entry<T: Sync + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ {
1473+
v.entry(Default::default())
1474+
}
1475+
1476+
fn occupied_entry<T: Sync + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ {
1477+
match v.entry(Default::default()) {
1478+
Occupied(entry) => entry,
1479+
_ => unreachable!(),
1480+
}
1481+
}
1482+
1483+
fn vacant_entry<T: Sync + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ {
1484+
match v.entry(Default::default()) {
1485+
Vacant(entry) => entry,
1486+
_ => unreachable!(),
1487+
}
1488+
}
1489+
}
1490+
1491+
#[test]
1492+
#[allow(dead_code)]
1493+
fn test_send() {
1494+
fn map<T: Send>(v: BTreeMap<T, T>) -> impl Send {
1495+
v
1496+
}
1497+
1498+
fn into_iter<T: Send>(v: BTreeMap<T, T>) -> impl Send {
1499+
v.into_iter()
1500+
}
1501+
1502+
fn into_keys<T: Send + Ord>(v: BTreeMap<T, T>) -> impl Send {
1503+
v.into_keys()
1504+
}
1505+
1506+
fn into_values<T: Send + Ord>(v: BTreeMap<T, T>) -> impl Send {
1507+
v.into_values()
1508+
}
1509+
1510+
fn drain_filter<T: Send + Ord>(v: &mut BTreeMap<T, T>) -> impl Send + '_ {
1511+
v.drain_filter(|_, _| false)
1512+
}
1513+
1514+
fn iter<T: Send + Sync>(v: &BTreeMap<T, T>) -> impl Send + '_ {
1515+
v.iter()
1516+
}
1517+
1518+
fn iter_mut<T: Send + Sync>(v: &mut BTreeMap<T, T>) -> impl Send + '_ {
1519+
v.iter_mut()
1520+
}
1521+
1522+
fn keys<T: Send + Sync>(v: &BTreeMap<T, T>) -> impl Send + '_ {
1523+
v.keys()
1524+
}
1525+
1526+
fn values<T: Send + Sync>(v: &BTreeMap<T, T>) -> impl Send + '_ {
1527+
v.values()
1528+
}
1529+
1530+
fn values_mut<T: Send + Sync>(v: &mut BTreeMap<T, T>) -> impl Send + '_ {
1531+
v.values_mut()
1532+
}
1533+
1534+
fn range<T: Send + Sync + Ord>(v: &BTreeMap<T, T>) -> impl Send + '_ {
1535+
v.range(..)
1536+
}
1537+
1538+
fn range_mut<T: Send + Sync + Ord>(v: &mut BTreeMap<T, T>) -> impl Send + '_ {
1539+
v.range_mut(..)
1540+
}
1541+
1542+
fn entry<T: Send + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Send + '_ {
1543+
v.entry(Default::default())
1544+
}
1545+
1546+
fn occupied_entry<T: Send + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Send + '_ {
1547+
match v.entry(Default::default()) {
1548+
Occupied(entry) => entry,
1549+
_ => unreachable!(),
1550+
}
1551+
}
1552+
1553+
fn vacant_entry<T: Send + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Send + '_ {
1554+
match v.entry(Default::default()) {
1555+
Vacant(entry) => entry,
1556+
_ => unreachable!(),
1557+
}
1558+
}
1559+
}
1560+
14211561
#[test]
14221562
fn test_occupied_entry_key() {
14231563
let mut a = BTreeMap::new();

0 commit comments

Comments
 (0)