#![no_std]
#[cfg(feature = "alloc")]
extern crate alloc;
extern crate self as rust_spec;
#[cfg(feature = "alloc")]
use alloc::boxed::Box;
use core::{convert::Infallible, ops::Add, ptr::NonNull};
#[cfg(feature = "alloc")]
use crate::drop::{CustomDrop, DropKind};
use crate::{
drop::{NeedsDrop, NoDrop},
layout::NonRobust,
mutability::PointerMutability,
niche::{NullableRepresentation, WithNiche, WithoutNiche},
size::PointerLayout,
};
#[cfg(feature = "derive")]
pub use rust_spec_derive::RustSpec;
mod core_impls;
pub mod drop;
pub mod layout;
pub mod mutability;
pub mod niche;
mod primitives;
pub mod size;
mod tuple;
type Sum<A, B> = <A as Add<B>>::Output;
#[doc(hidden)]
pub type Maximum<A, B> = <A as Max<B>>::Output;
pub enum Stable {}
pub enum Unstable {}
pub enum Opaque {}
pub enum NonOpaque {}
pub enum Zero {}
pub struct Gt<T>(core::marker::PhantomData<T>, Infallible);
#[doc(hidden)]
pub enum One {}
#[doc(hidden)]
pub trait Max<Rhs> {
type Output;
}
impl<Rhs> Max<Rhs> for One {
type Output = Rhs;
}
impl<Rhs> Max<Rhs> for Gt<One> {
type Output = Gt<One>;
}
pub unsafe trait RustSpec {
type Layout;
type Size;
#[doc(hidden)]
type __Alignment;
type Trap;
type Niche;
type Drop;
type Mutability;
type Opacity;
#[doc(hidden)]
type __IndirectTrap;
}
unsafe impl<R: ?Sized> RustSpec for NonNull<R>
where
R: RustSpec<Size: PointerLayout, Mutability: PointerMutability>,
<R::Size as PointerLayout>::Output: Add<R::Layout>,
{
type Layout = Sum<<R::Size as PointerLayout>::Output, R::Layout>;
type Size = size::Sized<Gt<Zero>>;
type __Alignment = <usize as RustSpec>::__Alignment;
type Trap = NonRobust;
type Niche = WithNiche<<R::Size as PointerLayout>::Output>;
type Drop = NoDrop;
type Mutability = <R::Mutability as PointerMutability>::Output;
type Opacity = NonOpaque;
type __IndirectTrap = R::Trap;
}
unsafe impl<R> RustSpec for Option<R>
where
R: RustSpec<Niche: NullableRepresentation, Drop: drop::DropKind>,
<R::Niche as NullableRepresentation>::Layout: Add<R::Layout>,
<R::Niche as NullableRepresentation>::Trap: Add<R::__IndirectTrap>,
{
type Layout = Sum<<R::Niche as NullableRepresentation>::Layout, R::Layout>;
type Size = size::Sized<Gt<Zero>>;
type __Alignment = R::__Alignment;
type Trap = Sum<<R::Niche as NullableRepresentation>::Trap, R::__IndirectTrap>;
type Niche = <R::Niche as NullableRepresentation>::Niche;
type Drop = NeedsDrop<R::Drop>;
type Mutability = R::Mutability;
type Opacity = NonOpaque;
type __IndirectTrap = R::__IndirectTrap;
}
unsafe impl<R: ?Sized> RustSpec for &R
where
R: RustSpec<Size: PointerLayout, Mutability: PointerMutability>,
<R::Size as PointerLayout>::Output: Add<R::Layout>,
{
type Layout = Sum<<R::Size as PointerLayout>::Output, R::Layout>;
type Size = size::Sized<Gt<Zero>>;
type __Alignment = <usize as RustSpec>::__Alignment;
type Trap = layout::NonRobust;
type Niche = WithNiche<<R::Size as PointerLayout>::Output>;
type Drop = drop::NoDrop;
type Mutability = <R::Mutability as PointerMutability>::Output;
type Opacity = NonOpaque;
type __IndirectTrap = R::Trap;
}
unsafe impl<R: ?Sized> RustSpec for &mut R
where
R: RustSpec<Size: PointerLayout, Mutability: PointerMutability>,
<R::Size as PointerLayout>::Output: Add<R::Layout>,
{
type Layout = Sum<<R::Size as PointerLayout>::Output, R::Layout>;
type Size = size::Sized<Gt<Zero>>;
type __Alignment = <usize as RustSpec>::__Alignment;
type Trap = layout::NonRobust;
type Niche = WithNiche<<R::Size as PointerLayout>::Output>;
type Drop = drop::NoDrop;
type Mutability = <R::Mutability as PointerMutability>::Output;
type Opacity = NonOpaque;
type __IndirectTrap = R::Trap;
}
#[cfg(feature = "alloc")]
unsafe impl<R: ?Sized> RustSpec for Box<R>
where
R: RustSpec<Size: PointerLayout, Drop: DropKind, Mutability: PointerMutability>,
<R::Size as PointerLayout>::Output: Add<R::Layout>,
{
type Layout = Sum<<R::Size as PointerLayout>::Output, R::Layout>;
type Size = size::Sized<Gt<Zero>>;
type __Alignment = <usize as RustSpec>::__Alignment;
type Trap = layout::NonRobust;
type Niche = WithNiche<<R::Size as PointerLayout>::Output>;
type Drop = CustomDrop<NeedsDrop<R::Drop>>;
type Mutability = <R::Mutability as PointerMutability>::Output;
type Opacity = NonOpaque;
type __IndirectTrap = R::Trap;
}
unsafe impl<R: ?Sized> RustSpec for *const R
where
R: RustSpec<Size: PointerLayout, Mutability: PointerMutability>,
<R::Size as PointerLayout>::Output: Add<R::Layout>,
{
type Layout = Sum<<R::Size as PointerLayout>::Output, R::Layout>;
type Size = size::Sized<crate::Gt<Zero>>;
type __Alignment = <usize as RustSpec>::__Alignment;
type Trap = R::Trap;
type Niche = WithoutNiche;
type Drop = NoDrop;
type Mutability = <R::Mutability as PointerMutability>::Output;
type Opacity = NonOpaque;
type __IndirectTrap = R::Trap;
}
unsafe impl<R: ?Sized> RustSpec for *mut R
where
R: RustSpec<Size: PointerLayout, Mutability: PointerMutability>,
<R::Size as PointerLayout>::Output: Add<R::Layout>,
{
type Layout = Sum<<R::Size as PointerLayout>::Output, R::Layout>;
type Size = size::Sized<crate::Gt<Zero>>;
type __Alignment = <usize as RustSpec>::__Alignment;
type Trap = R::Trap;
type Niche = WithoutNiche;
type Drop = NoDrop;
type Mutability = <R::Mutability as PointerMutability>::Output;
type Opacity = NonOpaque;
type __IndirectTrap = R::Trap;
}
#[cfg(test)]
mod tests {
#[cfg(feature = "alloc")]
use alloc::vec::Vec;
use static_assertions::assert_impl_all;
use super::*;
use {
layout::{NonRobust, Robust},
mutability::{Exclusive, WithoutInterior},
niche::{WithNiche, WithoutNiche},
size::{Gt, Sized as RustSpecSized},
};
#[test]
fn indirect_trap_follows_supported_pointers_only() {
assert_impl_all!(&u8: RustSpec<__IndirectTrap = Robust>);
assert_impl_all!(&bool: RustSpec<__IndirectTrap = NonRobust>);
assert_impl_all!(&&u8: RustSpec<__IndirectTrap = NonRobust>);
assert_impl_all!(Option<&u8>: RustSpec<__IndirectTrap = Robust>);
assert_impl_all!(*const bool: RustSpec<__IndirectTrap = NonRobust>);
}
#[test]
fn transparent_type() {
assert_impl_all!(bool:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = One,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = Robust,
>,
);
assert_impl_all!(&bool:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Stable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(&mut bool:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Stable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(Box<bool>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Stable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(&[bool]:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(&mut [bool]:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(Box<[bool]>:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(Vec<bool>:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!([bool; 2]:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = One,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = Robust,
>,
);
}
#[test]
fn option_stable_niche_layout() {
use core::num::NonZeroU8;
assert_impl_all!(Option<NonZeroU8>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = One,
Trap = Robust,
Niche = WithoutNiche,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = Robust,
>,
);
assert_impl_all!(Option<&u8>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = Robust,
Niche = WithoutNiche,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = Robust,
>,
);
assert_impl_all!(Option<&(u8, u8, u8)>:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = Robust,
Niche = WithoutNiche,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = Robust,
>,
);
assert_impl_all!(Option<&NonZeroU8>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithoutNiche,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
}
#[test]
fn result_stable_niche_layout() {
use core::num::NonZeroU8;
assert_impl_all!(Result<NonZeroU8, ()>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = One,
Trap = Robust,
Niche = WithoutNiche,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = Robust,
>,
);
assert_impl_all!(Result<&u8, ()>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = Robust,
Niche = WithoutNiche,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = Robust,
>,
);
assert_impl_all!(Result<&NonZeroU8, ()>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithoutNiche,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(Result<(), NonZeroU8>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = One,
Trap = Robust,
Niche = WithoutNiche,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = Robust,
>,
);
assert_impl_all!(Result<&mut u8, ()>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = Robust,
Niche = WithoutNiche,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = Robust,
>,
);
}
#[test]
fn robust_ref() {
assert_impl_all!(&&u8:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Stable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(&mut &u8:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Stable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(Box<&bool>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Stable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(&[&u8]:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(&mut [&u8]:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(Box<[&u8]>:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(Vec<&u8>:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!([&u8; 2]:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = Robust,
>,
);
assert_impl_all!(Option<&u8>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = Robust,
Niche = WithoutNiche,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = Robust,
>,
);
}
#[test]
fn transparent_ref() {
assert_impl_all!(&&bool:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Stable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(&mut &bool:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Stable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(Box<&bool>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Stable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(&[&bool]:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(&mut [&bool]:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(Box<[&bool]>:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(Vec<&bool>:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!([&bool; 2]:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(Option<&bool>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithoutNiche,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
}
#[test]
fn robust_ref_mut() {
assert_impl_all!(&&mut u8:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Stable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(&mut &mut u8:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Stable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(Box<&mut u8>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Stable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(&[&mut u8]:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(&mut [&mut u8]:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(Box<[&mut u8]>:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(Vec<&mut u8>:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!([&mut u8; 2]:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = Robust,
>,
);
assert_impl_all!(Option<&mut u8>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = Robust,
Niche = WithoutNiche,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = Robust,
>,
);
}
#[test]
fn transparent_ref_mut() {
assert_impl_all!(&&mut bool:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Stable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(&mut &mut bool:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Stable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(Box<&mut bool>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Stable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(&[&mut bool]:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(&mut [&mut bool]:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(Box<[&mut bool]>:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
#[cfg(feature = "alloc")]
assert_impl_all!(Vec<&mut bool>:
RustSpec<
Layout = Unstable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!([&mut bool; 2]:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithNiche<Unstable>,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
assert_impl_all!(Option<&mut bool>:
RustSpec<
Layout = Stable,
Size = RustSpecSized<Gt<Zero>>,
__Alignment = <usize as RustSpec>::__Alignment,
Trap = NonRobust,
Niche = WithoutNiche,
Mutability = Exclusive<WithoutInterior>,
__IndirectTrap = NonRobust,
>,
);
}
}