diff --git a/library/alloc/src/collections/btree/map.rs b/library/alloc/src/collections/btree/map.rs index adde491020cf1..bc64585ae23f9 100644 --- a/library/alloc/src/collections/btree/map.rs +++ b/library/alloc/src/collections/btree/map.rs @@ -1,3 +1,6 @@ +#[cfg(test)] +mod tests; + use core::borrow::Borrow; use core::cmp::Ordering; use core::fmt::{self, Debug}; @@ -2220,5 +2223,52 @@ impl BTreeMap { } } -#[cfg(test)] -mod tests; +#[allow(dead_code)] +fn assert_covariance() { + // Lifetime and both type parameters should be covariant for these types. + fn map<'new>(v: BTreeMap<&'static str, &'static str>) -> BTreeMap<&'new str, &'new str> { + v + } + fn iter<'new>( + v: Iter<'static, &'static str, &'static str>, + ) -> Iter<'new, &'new str, &'new str> { + v + } + fn into_iter<'new>(v: IntoIter<&'static str, &'static str>) -> IntoIter<&'new str, &'new str> { + v + } + fn keys<'new>( + v: Keys<'static, &'static str, &'static str>, + ) -> Keys<'new, &'new str, &'new str> { + v + } + fn values<'new>( + v: Values<'static, &'static str, &'static str>, + ) -> Values<'new, &'new str, &'new str> { + v + } + fn into_keys<'new>(v: IntoKeys<&'static str, &'static str>) -> IntoKeys<&'new str, &'new str> { + v + } + fn into_values<'new>( + v: IntoValues<&'static str, &'static str>, + ) -> IntoValues<&'new str, &'new str> { + v + } + fn range<'new>( + v: Range<'static, &'static str, &'static str>, + ) -> Range<'new, &'new str, &'new str> { + v + } + + // Lifetime should be covariant for these types. + fn iter_mut<'new>(v: IterMut<'static, u8, u8>) -> IterMut<'new, u8, u8> { + v + } + fn values_mut<'new>(v: ValuesMut<'static, u8, u8>) -> ValuesMut<'new, u8, u8> { + v + } + fn range_mut<'new>(v: RangeMut<'static, u8, u8>) -> RangeMut<'new, u8, u8> { + v + } +} diff --git a/library/alloc/src/collections/btree/set.rs b/library/alloc/src/collections/btree/set.rs index 0c268ad32b261..c33c44ac82b23 100644 --- a/library/alloc/src/collections/btree/set.rs +++ b/library/alloc/src/collections/btree/set.rs @@ -1,6 +1,9 @@ // This is pretty much entirely stolen from TreeSet, since BTreeMap has an identical interface // to TreeMap +#[cfg(test)] +mod tests; + use core::borrow::Borrow; use core::cmp::Ordering::{Equal, Greater, Less}; use core::cmp::{max, min}; @@ -1601,5 +1604,18 @@ impl<'a, T: Ord> Iterator for Union<'a, T> { #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for Union<'_, T> {} -#[cfg(test)] -mod tests; +#[allow(dead_code)] +fn assert_covariance() { + fn set<'new>(v: BTreeSet<&'static str>) -> BTreeSet<&'new str> { + v + } + fn iter<'new>(v: Iter<'static, &'static str>) -> Iter<'new, &'new str> { + v + } + fn into_iter<'new>(v: IntoIter<&'static str>) -> IntoIter<&'new str> { + v + } + fn range<'new>(v: Range<'static, &'static str>) -> Range<'new, &'new str> { + v + } +}