diff options
author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-01-19 19:19:47 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-19 19:19:47 +0100 |
commit | dfbb6b246da3758911d5625a3b6ec4ecec9a01ab (patch) | |
tree | 727466e77c6132880b74be0980c0bb76685c4d3d | |
parent | 715cda2e81c769277e63c08a3a9966f8cdb6b3c5 (diff) | |
parent | 731bbae816e49cb404f402e8a5d392059e417ee5 (diff) | |
download | rust-dfbb6b246da3758911d5625a3b6ec4ecec9a01ab.tar.gz |
Rollup merge of #92630 - steffahn:lift_bounds_on_BuildHasherDefault, r=yaahc
Change PhantomData type for `BuildHasherDefault` (and more)
Changes `PhantomData<H>` to `PhantomData<fn() -> H>` for `BuildHasherDefault`. This preserves the covariance of `H`, while it lifts the currently inferred unnecessary bounds like [`H: Send` for `BuildHasherDefault<H>: Send`](https://doc.rust-lang.org/1.57.0/std/hash/struct.BuildHasherDefault.html#impl-Send), etc.
_Edit:_ Also does a similar change for `iter::Empty` and `future::Pending`.
-rw-r--r-- | library/core/src/future/pending.rs | 5 | ||||
-rw-r--r-- | library/core/src/hash/mod.rs | 2 | ||||
-rw-r--r-- | library/core/src/iter/sources/empty.rs | 12 |
3 files changed, 8 insertions, 11 deletions
diff --git a/library/core/src/future/pending.rs b/library/core/src/future/pending.rs index 560dd25ecff..2877e66eca8 100644 --- a/library/core/src/future/pending.rs +++ b/library/core/src/future/pending.rs @@ -12,7 +12,7 @@ use crate::task::{Context, Poll}; #[stable(feature = "future_readiness_fns", since = "1.48.0")] #[must_use = "futures do nothing unless you `.await` or poll them"] pub struct Pending<T> { - _data: marker::PhantomData<T>, + _data: marker::PhantomData<fn() -> T>, } /// Creates a future which never resolves, representing a computation that never @@ -44,9 +44,6 @@ impl<T> Future for Pending<T> { } #[stable(feature = "future_readiness_fns", since = "1.48.0")] -impl<T> Unpin for Pending<T> {} - -#[stable(feature = "future_readiness_fns", since = "1.48.0")] impl<T> Debug for Pending<T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("Pending").finish() diff --git a/library/core/src/hash/mod.rs b/library/core/src/hash/mod.rs index 3ff84cc9672..53de8b42c05 100644 --- a/library/core/src/hash/mod.rs +++ b/library/core/src/hash/mod.rs @@ -602,7 +602,7 @@ pub trait BuildHasher { /// [`HashSet`]: ../../std/collections/struct.HashSet.html /// [zero-sized]: https://doc.rust-lang.org/nomicon/exotic-sizes.html#zero-sized-types-zsts #[stable(since = "1.7.0", feature = "build_hasher")] -pub struct BuildHasherDefault<H>(marker::PhantomData<H>); +pub struct BuildHasherDefault<H>(marker::PhantomData<fn() -> H>); #[stable(since = "1.9.0", feature = "core_impl_debug")] impl<H> fmt::Debug for BuildHasherDefault<H> { diff --git a/library/core/src/iter/sources/empty.rs b/library/core/src/iter/sources/empty.rs index 7abe01d17c9..98734c527f2 100644 --- a/library/core/src/iter/sources/empty.rs +++ b/library/core/src/iter/sources/empty.rs @@ -22,17 +22,17 @@ pub const fn empty<T>() -> Empty<T> { Empty(marker::PhantomData) } +// Newtype for use in `PhantomData` to avoid +// > error: const-stable function cannot use `#[feature(const_fn_fn_ptr_basics)]` +// in `const fn empty<T>()` above. +struct FnReturning<T>(fn() -> T); + /// An iterator that yields nothing. /// /// This `struct` is created by the [`empty()`] function. See its documentation for more. #[must_use = "iterators are lazy and do nothing unless consumed"] #[stable(feature = "iter_empty", since = "1.2.0")] -pub struct Empty<T>(marker::PhantomData<T>); - -#[stable(feature = "iter_empty_send_sync", since = "1.42.0")] -unsafe impl<T> Send for Empty<T> {} -#[stable(feature = "iter_empty_send_sync", since = "1.42.0")] -unsafe impl<T> Sync for Empty<T> {} +pub struct Empty<T>(marker::PhantomData<FnReturning<T>>); #[stable(feature = "core_impl_debug", since = "1.9.0")] impl<T> fmt::Debug for Empty<T> { |