summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2022-01-19 19:19:47 +0100
committerGitHub <noreply@github.com>2022-01-19 19:19:47 +0100
commitdfbb6b246da3758911d5625a3b6ec4ecec9a01ab (patch)
tree727466e77c6132880b74be0980c0bb76685c4d3d
parent715cda2e81c769277e63c08a3a9966f8cdb6b3c5 (diff)
parent731bbae816e49cb404f402e8a5d392059e417ee5 (diff)
downloadrust-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.rs5
-rw-r--r--library/core/src/hash/mod.rs2
-rw-r--r--library/core/src/iter/sources/empty.rs12
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> {