diff options
| author | Ralf Jung <post@ralfj.de> | 2020-09-20 12:08:12 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-09-20 12:08:12 +0200 |
| commit | f5e19a355a2a16e0ed122e3f7728490b9e6357b8 (patch) | |
| tree | ebbafdc843764a89f66e85acc53bf2497964ffea | |
| parent | 10b3595ba6a4c658c9dea105488fc562c815e434 (diff) | |
| parent | 176956c115c2b797471a3f59eef3e17789229007 (diff) | |
| download | rust-f5e19a355a2a16e0ed122e3f7728490b9e6357b8.tar.gz rust-f5e19a355a2a16e0ed122e3f7728490b9e6357b8.zip | |
Rollup merge of #76722 - ssomers:btree_send_sync, r=Mark-Simulacrum
Test and fix Send and Sync traits of BTreeMap artefacts Fixes #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
| -rw-r--r-- | library/alloc/src/collections/btree/borrow.rs | 3 | ||||
| -rw-r--r-- | library/alloc/src/collections/btree/map/tests.rs | 140 |
2 files changed, 143 insertions, 0 deletions
diff --git a/library/alloc/src/collections/btree/borrow.rs b/library/alloc/src/collections/btree/borrow.rs index 5c95acfbe9c..016f139a501 100644 --- a/library/alloc/src/collections/btree/borrow.rs +++ b/library/alloc/src/collections/btree/borrow.rs @@ -16,6 +16,9 @@ pub struct DormantMutRef<'a, T> { _marker: PhantomData<&'a mut T>, } +unsafe impl<'a, T> Sync for DormantMutRef<'a, T> where &'a mut T: Sync {} +unsafe impl<'a, T> Send for DormantMutRef<'a, T> where &'a mut T: Send {} + impl<'a, T> DormantMutRef<'a, T> { /// Capture a unique borrow, and immediately reborrow it. For the compiler, /// the lifetime of the new reference is the same as the lifetime of the diff --git a/library/alloc/src/collections/btree/map/tests.rs b/library/alloc/src/collections/btree/map/tests.rs index af5cf7d7d87..d2cd6b8e524 100644 --- a/library/alloc/src/collections/btree/map/tests.rs +++ b/library/alloc/src/collections/btree/map/tests.rs @@ -1419,6 +1419,146 @@ fn test_variance() { } #[test] +#[allow(dead_code)] +fn test_sync() { + fn map<T: Sync>(v: &BTreeMap<T, T>) -> impl Sync + '_ { + v + } + + fn into_iter<T: Sync>(v: BTreeMap<T, T>) -> impl Sync { + v.into_iter() + } + + fn into_keys<T: Sync + Ord>(v: BTreeMap<T, T>) -> impl Sync { + v.into_keys() + } + + fn into_values<T: Sync + Ord>(v: BTreeMap<T, T>) -> impl Sync { + v.into_values() + } + + fn drain_filter<T: Sync + Ord>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ { + v.drain_filter(|_, _| false) + } + + fn iter<T: Sync>(v: &BTreeMap<T, T>) -> impl Sync + '_ { + v.iter() + } + + fn iter_mut<T: Sync>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ { + v.iter_mut() + } + + fn keys<T: Sync>(v: &BTreeMap<T, T>) -> impl Sync + '_ { + v.keys() + } + + fn values<T: Sync>(v: &BTreeMap<T, T>) -> impl Sync + '_ { + v.values() + } + + fn values_mut<T: Sync>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ { + v.values_mut() + } + + fn range<T: Sync + Ord>(v: &BTreeMap<T, T>) -> impl Sync + '_ { + v.range(..) + } + + fn range_mut<T: Sync + Ord>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ { + v.range_mut(..) + } + + fn entry<T: Sync + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ { + v.entry(Default::default()) + } + + fn occupied_entry<T: Sync + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ { + match v.entry(Default::default()) { + Occupied(entry) => entry, + _ => unreachable!(), + } + } + + fn vacant_entry<T: Sync + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Sync + '_ { + match v.entry(Default::default()) { + Vacant(entry) => entry, + _ => unreachable!(), + } + } +} + +#[test] +#[allow(dead_code)] +fn test_send() { + fn map<T: Send>(v: BTreeMap<T, T>) -> impl Send { + v + } + + fn into_iter<T: Send>(v: BTreeMap<T, T>) -> impl Send { + v.into_iter() + } + + fn into_keys<T: Send + Ord>(v: BTreeMap<T, T>) -> impl Send { + v.into_keys() + } + + fn into_values<T: Send + Ord>(v: BTreeMap<T, T>) -> impl Send { + v.into_values() + } + + fn drain_filter<T: Send + Ord>(v: &mut BTreeMap<T, T>) -> impl Send + '_ { + v.drain_filter(|_, _| false) + } + + fn iter<T: Send + Sync>(v: &BTreeMap<T, T>) -> impl Send + '_ { + v.iter() + } + + fn iter_mut<T: Send + Sync>(v: &mut BTreeMap<T, T>) -> impl Send + '_ { + v.iter_mut() + } + + fn keys<T: Send + Sync>(v: &BTreeMap<T, T>) -> impl Send + '_ { + v.keys() + } + + fn values<T: Send + Sync>(v: &BTreeMap<T, T>) -> impl Send + '_ { + v.values() + } + + fn values_mut<T: Send + Sync>(v: &mut BTreeMap<T, T>) -> impl Send + '_ { + v.values_mut() + } + + fn range<T: Send + Sync + Ord>(v: &BTreeMap<T, T>) -> impl Send + '_ { + v.range(..) + } + + fn range_mut<T: Send + Sync + Ord>(v: &mut BTreeMap<T, T>) -> impl Send + '_ { + v.range_mut(..) + } + + fn entry<T: Send + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Send + '_ { + v.entry(Default::default()) + } + + fn occupied_entry<T: Send + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Send + '_ { + match v.entry(Default::default()) { + Occupied(entry) => entry, + _ => unreachable!(), + } + } + + fn vacant_entry<T: Send + Ord + Default>(v: &mut BTreeMap<T, T>) -> impl Send + '_ { + match v.entry(Default::default()) { + Vacant(entry) => entry, + _ => unreachable!(), + } + } +} + +#[test] fn test_occupied_entry_key() { let mut a = BTreeMap::new(); let key = "hello there"; |
