diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2024-05-03 06:04:19 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-03 06:04:19 +0200 |
| commit | e17a222a0a42debb5230e0da0281cff6af29f029 (patch) | |
| tree | 7b14e4b72c9f0603b4b9bbd54ccdf7655e34d606 | |
| parent | 79734f1db8dbe322192dea32c0f6b80ab14c4c1d (diff) | |
| parent | 1a83bea1075cf8068c0a63e72761c6080e904e39 (diff) | |
| download | rust-e17a222a0a42debb5230e0da0281cff6af29f029.tar.gz rust-e17a222a0a42debb5230e0da0281cff6af29f029.zip | |
Rollup merge of #123480 - Nadrieril:impl-all-derefpures, r=compiler-errors
deref patterns: impl `DerefPure` for more std types
Context: [deref patterns](https://github.com/rust-lang/rust/issues/87121). The requirements of `DerefPure` aren't precise yet, but these types unambiguously satisfy them.
Interestingly, a hypothetical `impl DerefMut for Cow` that does a `Clone` would *not* be eligible for `DerefPure` if we allow mixing deref patterns with normal patterns. If the following is exhaustive then the `DerefMut` would cause UB:
```rust
match &mut Cow::Borrowed(&()) {
Cow::Owned(_) => ..., // Doesn't match
deref!(_x) if false => ..., // Causes the variant to switch to `Owned`
Cow::Borrowed(_) => ..., // Doesn't match
// We reach unreachable
}
```
| -rw-r--r-- | library/alloc/src/borrow.rs | 5 | ||||
| -rw-r--r-- | library/core/src/cell.rs | 8 | ||||
| -rw-r--r-- | library/core/src/mem/manually_drop.rs | 5 | ||||
| -rw-r--r-- | library/core/src/pin.rs | 5 |
4 files changed, 19 insertions, 4 deletions
diff --git a/library/alloc/src/borrow.rs b/library/alloc/src/borrow.rs index b6b6246baa6..42f8a08a9e4 100644 --- a/library/alloc/src/borrow.rs +++ b/library/alloc/src/borrow.rs @@ -4,9 +4,9 @@ use core::cmp::Ordering; use core::hash::{Hash, Hasher}; -use core::ops::Deref; #[cfg(not(no_global_oom_handling))] use core::ops::{Add, AddAssign}; +use core::ops::{Deref, DerefPure}; #[stable(feature = "rust1", since = "1.0.0")] pub use core::borrow::{Borrow, BorrowMut}; @@ -343,6 +343,9 @@ where } } +#[unstable(feature = "deref_pure_trait", issue = "87121")] +unsafe impl<B: ?Sized + ToOwned> DerefPure for Cow<'_, B> where B::Owned: Borrow<B> {} + #[stable(feature = "rust1", since = "1.0.0")] impl<B: ?Sized> Eq for Cow<'_, B> where B: Eq + ToOwned {} diff --git a/library/core/src/cell.rs b/library/core/src/cell.rs index ae0436bc520..4b491ffdafa 100644 --- a/library/core/src/cell.rs +++ b/library/core/src/cell.rs @@ -239,7 +239,7 @@ use crate::cmp::Ordering; use crate::fmt::{self, Debug, Display}; use crate::marker::{PhantomData, Unsize}; use crate::mem::{self, size_of}; -use crate::ops::{CoerceUnsized, Deref, DerefMut, DispatchFromDyn}; +use crate::ops::{CoerceUnsized, Deref, DerefMut, DerefPure, DispatchFromDyn}; use crate::ptr::{self, NonNull}; mod lazy; @@ -1452,6 +1452,9 @@ impl<T: ?Sized> Deref for Ref<'_, T> { } } +#[unstable(feature = "deref_pure_trait", issue = "87121")] +unsafe impl<T: ?Sized> DerefPure for Ref<'_, T> {} + impl<'b, T: ?Sized> Ref<'b, T> { /// Copies a `Ref`. /// @@ -1844,6 +1847,9 @@ impl<T: ?Sized> DerefMut for RefMut<'_, T> { } } +#[unstable(feature = "deref_pure_trait", issue = "87121")] +unsafe impl<T: ?Sized> DerefPure for RefMut<'_, T> {} + #[unstable(feature = "coerce_unsized", issue = "18598")] impl<'b, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<RefMut<'b, U>> for RefMut<'b, T> {} diff --git a/library/core/src/mem/manually_drop.rs b/library/core/src/mem/manually_drop.rs index 98cff3493a7..955efb9b0f9 100644 --- a/library/core/src/mem/manually_drop.rs +++ b/library/core/src/mem/manually_drop.rs @@ -1,4 +1,4 @@ -use crate::ops::{Deref, DerefMut}; +use crate::ops::{Deref, DerefMut, DerefPure}; use crate::ptr; /// A wrapper to inhibit compiler from automatically calling `T`’s destructor. @@ -161,3 +161,6 @@ impl<T: ?Sized> DerefMut for ManuallyDrop<T> { &mut self.value } } + +#[unstable(feature = "deref_pure_trait", issue = "87121")] +unsafe impl<T: ?Sized> DerefPure for ManuallyDrop<T> {} diff --git a/library/core/src/pin.rs b/library/core/src/pin.rs index f7463d170fd..d8fc3b7177f 100644 --- a/library/core/src/pin.rs +++ b/library/core/src/pin.rs @@ -923,7 +923,7 @@ use crate::cmp; use crate::fmt; use crate::hash::{Hash, Hasher}; -use crate::ops::{CoerceUnsized, Deref, DerefMut, DispatchFromDyn, Receiver}; +use crate::ops::{CoerceUnsized, Deref, DerefMut, DerefPure, DispatchFromDyn, Receiver}; #[allow(unused_imports)] use crate::{ @@ -1684,6 +1684,9 @@ impl<Ptr: DerefMut<Target: Unpin>> DerefMut for Pin<Ptr> { } } +#[unstable(feature = "deref_pure_trait", issue = "87121")] +unsafe impl<Ptr: DerefPure> DerefPure for Pin<Ptr> {} + #[unstable(feature = "receiver_trait", issue = "none")] impl<Ptr: Receiver> Receiver for Pin<Ptr> {} |
