Add #[repr(transparent)] to some libcore types
* `UnsafeCell` * `Cell` * `NonZero*` * `NonNull` * `Unique`
This commit is contained in:
parent
253205658e
commit
530d7bc517
@ -235,6 +235,7 @@ use ptr;
|
|||||||
///
|
///
|
||||||
/// See the [module-level documentation](index.html) for more.
|
/// See the [module-level documentation](index.html) for more.
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
#[repr(transparent)]
|
||||||
pub struct Cell<T> {
|
pub struct Cell<T> {
|
||||||
value: UnsafeCell<T>,
|
value: UnsafeCell<T>,
|
||||||
}
|
}
|
||||||
@ -1282,6 +1283,7 @@ impl<'a, T: ?Sized + fmt::Display> fmt::Display for RefMut<'a, T> {
|
|||||||
/// ```
|
/// ```
|
||||||
#[lang = "unsafe_cell"]
|
#[lang = "unsafe_cell"]
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
#[repr(transparent)]
|
||||||
pub struct UnsafeCell<T: ?Sized> {
|
pub struct UnsafeCell<T: ?Sized> {
|
||||||
value: T,
|
value: T,
|
||||||
}
|
}
|
||||||
|
@ -124,6 +124,7 @@
|
|||||||
#![feature(const_slice_len)]
|
#![feature(const_slice_len)]
|
||||||
#![feature(const_str_as_bytes)]
|
#![feature(const_str_as_bytes)]
|
||||||
#![feature(const_str_len)]
|
#![feature(const_str_len)]
|
||||||
|
#![cfg_attr(stage0, feature(repr_transparent))]
|
||||||
|
|
||||||
#[prelude_import]
|
#[prelude_import]
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
|
@ -16,6 +16,7 @@ use ops::CoerceUnsized;
|
|||||||
/// NULL or 0 that might allow certain optimizations.
|
/// NULL or 0 that might allow certain optimizations.
|
||||||
#[lang = "non_zero"]
|
#[lang = "non_zero"]
|
||||||
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
|
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
|
||||||
|
#[repr(transparent)]
|
||||||
pub(crate) struct NonZero<T>(pub(crate) T);
|
pub(crate) struct NonZero<T>(pub(crate) T);
|
||||||
|
|
||||||
impl<T: CoerceUnsized<U>, U> CoerceUnsized<NonZero<U>> for NonZero<T> {}
|
impl<T: CoerceUnsized<U>, U> CoerceUnsized<NonZero<U>> for NonZero<T> {}
|
||||||
|
@ -48,6 +48,7 @@ macro_rules! nonzero_integers {
|
|||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "nonzero", since = "1.28.0")]
|
#[stable(feature = "nonzero", since = "1.28.0")]
|
||||||
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
|
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
|
||||||
|
#[repr(transparent)]
|
||||||
pub struct $Ty(NonZero<$Int>);
|
pub struct $Ty(NonZero<$Int>);
|
||||||
|
|
||||||
impl $Ty {
|
impl $Ty {
|
||||||
@ -123,6 +124,7 @@ nonzero_integers! {
|
|||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default, Hash)]
|
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default, Hash)]
|
||||||
|
#[repr(transparent)]
|
||||||
pub struct Wrapping<T>(#[stable(feature = "rust1", since = "1.0.0")]
|
pub struct Wrapping<T>(#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
pub T);
|
pub T);
|
||||||
|
|
||||||
|
@ -2692,6 +2692,7 @@ impl<T: ?Sized> PartialOrd for *mut T {
|
|||||||
reason = "use NonNull instead and consider PhantomData<T> \
|
reason = "use NonNull instead and consider PhantomData<T> \
|
||||||
(if you also use #[may_dangle]), Send, and/or Sync")]
|
(if you also use #[may_dangle]), Send, and/or Sync")]
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
|
#[repr(transparent)]
|
||||||
pub struct Unique<T: ?Sized> {
|
pub struct Unique<T: ?Sized> {
|
||||||
pointer: NonZero<*const T>,
|
pointer: NonZero<*const T>,
|
||||||
// NOTE: this marker has no consequences for variance, but is necessary
|
// NOTE: this marker has no consequences for variance, but is necessary
|
||||||
@ -2840,6 +2841,7 @@ impl<'a, T: ?Sized> From<NonNull<T>> for Unique<T> {
|
|||||||
/// such as Box, Rc, Arc, Vec, and LinkedList. This is the case because they
|
/// such as Box, Rc, Arc, Vec, and LinkedList. This is the case because they
|
||||||
/// provide a public API that follows the normal shared XOR mutable rules of Rust.
|
/// provide a public API that follows the normal shared XOR mutable rules of Rust.
|
||||||
#[stable(feature = "nonnull", since = "1.25.0")]
|
#[stable(feature = "nonnull", since = "1.25.0")]
|
||||||
|
#[repr(transparent)]
|
||||||
pub struct NonNull<T: ?Sized> {
|
pub struct NonNull<T: ?Sized> {
|
||||||
pointer: NonZero<*const T>,
|
pointer: NonZero<*const T>,
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user