pub trait StructuralEq { }
🔬This is a nightly-only experimental API. (structural_match)
Expand description

Required trait for constants used in pattern matches.

Any type that derives Eq automatically implements this trait, regardless of whether its type parameters implement Eq.

This is a hack to work around a limitation in our type system.

Background

We want to require that types of consts used in pattern matches have the attribute #[derive(PartialEq, Eq)].

In a more ideal world, we could check that requirement by just checking that the given type implements both the StructuralPartialEq trait and the Eq trait. However, you can have ADTs that do derive(PartialEq, Eq), and be a case that we want the compiler to accept, and yet the constant’s type fails to implement Eq.

Namely, a case like this:

#[derive(PartialEq, Eq)]
struct Wrap<X>(X);

fn higher_order(_: &()) { }

const CFN: Wrap<fn(&())> = Wrap(higher_order);

#[allow(pointer_structural_match)]
fn main() {
    match CFN {
        CFN => {}
        _ => {}
    }
}

(The problem in the above code is that Wrap<fn(&())> does not implement PartialEq, nor Eq, because for<'a> fn(&'a _) does not implement those traits.)

Therefore, we cannot rely on naive check for StructuralPartialEq and mere Eq.

As a hack to work around this, we use two separate traits injected by each of the two derives (#[derive(PartialEq)] and #[derive(Eq)]) and check that both of them are present as part of structural-match checking.

Implementors§

source§

impl StructuralEq for hashbrown_tstd::TryReserveError

source§

impl StructuralEq for OCallError

source§

impl StructuralEq for AddressKind

source§

impl StructuralEq for MapAddr

source§

impl StructuralEq for FutexClockId

source§

impl StructuralEq for FutexOp

source§

impl StructuralEq for PageType

source§

impl StructuralEq for Feature

source§

impl StructuralEq for Version

source§

impl StructuralEq for ExceptionType

source§

impl StructuralEq for ExceptionVector

source§

impl StructuralEq for HandleResult

source§

impl StructuralEq for PceError

source§

impl StructuralEq for QcnlError

source§

impl StructuralEq for Quote3Error

source§

impl StructuralEq for SgxStatus

source§

impl StructuralEq for DirIndex

source§

impl StructuralEq for EcResult

source§

impl StructuralEq for RsaKeyType

source§

impl StructuralEq for RsaResult

source§

impl StructuralEq for PckCertFlag

source§

impl StructuralEq for ProdType

source§

impl StructuralEq for QeType

source§

impl StructuralEq for QlAttestationAlgorithmId

source§

impl StructuralEq for QlCertKeyType

source§

impl StructuralEq for QlConfigVersion

source§

impl StructuralEq for QlLogLevel

source§

impl StructuralEq for QlPathType

source§

impl StructuralEq for QlQvResult

source§

impl StructuralEq for QlRequestPolicy

source§

impl StructuralEq for QvPathType

source§

impl StructuralEq for DhSessionRole

source§

impl StructuralEq for EnclaveMode

source§

impl StructuralEq for KeyName

source§

impl StructuralEq for ProtectPerm

source§

impl StructuralEq for RaKeyType

source§

impl StructuralEq for QuoteSignType

source§

impl StructuralEq for SwitchlessWokerEvent

source§

impl StructuralEq for SwitchlessWokerType

source§

impl StructuralEq for SgxDeviceStatus

source§

impl StructuralEq for AsciiChar

1.0.0 · source§

impl StructuralEq for sgx_tstd::cmp::Ordering

source§

impl StructuralEq for TryReserveErrorKind

source§

impl StructuralEq for VarError

1.28.0 · source§

impl StructuralEq for sgx_tstd::fmt::Alignment

source§

impl StructuralEq for ErrorKind

source§

impl StructuralEq for SeekFrom

1.7.0 · source§

impl StructuralEq for IpAddr

source§

impl StructuralEq for Ipv6MulticastScope

source§

impl StructuralEq for Shutdown

1.0.0 · source§

impl StructuralEq for SocketAddr

1.0.0 · source§

impl StructuralEq for FpCategory

1.55.0 · source§

impl StructuralEq for IntErrorKind

source§

impl StructuralEq for SearchStep

1.0.0 · source§

impl StructuralEq for sgx_tstd::sync::atomic::Ordering

source§

impl StructuralEq for TcsPolicy

source§

impl StructuralEq for Which

source§

impl StructuralEq for bool

source§

impl StructuralEq for char

source§

impl StructuralEq for i8

source§

impl StructuralEq for i16

source§

impl StructuralEq for i32

source§

impl StructuralEq for i64

source§

impl StructuralEq for i128

source§

impl StructuralEq for isize

source§

impl StructuralEq for str

source§

impl StructuralEq for u8

source§

impl StructuralEq for u16

source§

impl StructuralEq for u32

source§

impl StructuralEq for u64

source§

impl StructuralEq for u128

source§

impl StructuralEq for ()

source§

impl StructuralEq for usize

source§

impl StructuralEq for AlighAllocErr

source§

impl StructuralEq for AlignLayout

source§

impl StructuralEq for AlignLayoutErr

source§

impl StructuralEq for AlignReq

source§

impl StructuralEq for sgx_oc::linux::ocall::cpuid::CpuidResult

source§

impl StructuralEq for MsgHdrFlags

source§

impl StructuralEq for RsrvMemAllocErr

source§

impl StructuralEq for FutexFlags

source§

impl StructuralEq for PageFlags

source§

impl StructuralEq for PageInfo

source§

impl StructuralEq for PageRange

source§

impl StructuralEq for TcsId

source§

impl StructuralEq for Handle

source§

impl StructuralEq for Ec256PrivateKey

source§

impl StructuralEq for Ec256PublicKey

source§

impl StructuralEq for Ec256SharedKey

source§

impl StructuralEq for Ec256Signature

source§

impl StructuralEq for Rsa2048Key

source§

impl StructuralEq for Rsa2048Param

source§

impl StructuralEq for Rsa2048PrivKey

source§

impl StructuralEq for Rsa2048PubKey

source§

impl StructuralEq for Rsa2048Signature

source§

impl StructuralEq for Rsa3072Key

source§

impl StructuralEq for Rsa3072Param

source§

impl StructuralEq for Rsa3072PrivKey

source§

impl StructuralEq for Rsa3072PubKey

source§

impl StructuralEq for Rsa3072Signature

source§

impl StructuralEq for Sha1Hash

source§

impl StructuralEq for Sha256Hash

source§

impl StructuralEq for Sha384Hash

source§

impl StructuralEq for Sm3Hash

source§

impl StructuralEq for PceInfo

source§

impl StructuralEq for QlQe3Id

source§

impl StructuralEq for QuoteHeader

source§

impl StructuralEq for AttKeyId

source§

impl StructuralEq for BaseName

source§

impl StructuralEq for QuoteNonce

source§

impl StructuralEq for Spid

source§

impl StructuralEq for UpdateInfoBit

source§

impl StructuralEq for EnclaveIdentity

source§

impl StructuralEq for timespec

source§

impl StructuralEq for TeeAttributes

source§

impl StructuralEq for TeeCpuSvn

source§

impl StructuralEq for TeeMeasurement

source§

impl StructuralEq for TeeReportType

source§

impl StructuralEq for Attributes

source§

impl StructuralEq for AttributesFlags

source§

impl StructuralEq for CpuSvn

source§

impl StructuralEq for KeyId

source§

impl StructuralEq for KeyPolicy

source§

impl StructuralEq for Measurement

source§

impl StructuralEq for MiscAttribute

source§

impl StructuralEq for MiscSelect

source§

impl StructuralEq for SwitchlessWokerStats

source§

impl StructuralEq for Quote4Header

source§

impl StructuralEq for TeeTcbSvn

source§

impl StructuralEq for AllocError

1.28.0 · source§

impl StructuralEq for Layout

1.50.0 · source§

impl StructuralEq for LayoutError

1.0.0 · source§

impl StructuralEq for TypeId

1.34.0 · source§

impl StructuralEq for CharTryFromError

1.9.0 · source§

impl StructuralEq for DecodeUtf16Error

1.20.0 · source§

impl StructuralEq for ParseCharError

1.59.0 · source§

impl StructuralEq for TryFromCharError

1.57.0 · source§

impl StructuralEq for sgx_tstd::collections::TryReserveError

1.64.0 · source§

impl StructuralEq for CString

1.69.0 · source§

impl StructuralEq for FromBytesUntilNulError

1.64.0 · source§

impl StructuralEq for FromBytesWithNulError

1.64.0 · source§

impl StructuralEq for FromVecWithNulError

1.64.0 · source§

impl StructuralEq for IntoStringError

1.64.0 · source§

impl StructuralEq for NulError

1.0.0 · source§

impl StructuralEq for Error

source§

impl StructuralEq for Assume

1.0.0 · source§

impl StructuralEq for AddrParseError

1.0.0 · source§

impl StructuralEq for Ipv4Addr

1.0.0 · source§

impl StructuralEq for Ipv6Addr

1.0.0 · source§

impl StructuralEq for SocketAddrV4

1.0.0 · source§

impl StructuralEq for SocketAddrV6

1.34.0 · source§

impl StructuralEq for NonZeroI8

1.34.0 · source§

impl StructuralEq for NonZeroI16

1.34.0 · source§

impl StructuralEq for NonZeroI32

1.34.0 · source§

impl StructuralEq for NonZeroI64

1.34.0 · source§

impl StructuralEq for NonZeroI128

1.34.0 · source§

impl StructuralEq for NonZeroIsize

1.28.0 · source§

impl StructuralEq for NonZeroU8

1.28.0 · source§

impl StructuralEq for NonZeroU16

1.28.0 · source§

impl StructuralEq for NonZeroU32

1.28.0 · source§

impl StructuralEq for NonZeroU64

1.28.0 · source§

impl StructuralEq for NonZeroU128

1.28.0 · source§

impl StructuralEq for NonZeroUsize

1.0.0 · source§

impl StructuralEq for ParseFloatError

1.0.0 · source§

impl StructuralEq for ParseIntError

1.34.0 · source§

impl StructuralEq for TryFromIntError

1.0.0 · source§

impl StructuralEq for RangeFull

source§

impl StructuralEq for StripPrefixError

source§

impl StructuralEq for sgx_tstd::ptr::Alignment

1.0.0 · source§

impl StructuralEq for ParseBoolError

1.0.0 · source§

impl StructuralEq for Utf8Error

1.0.0 · source§

impl StructuralEq for FromUtf8Error

1.0.0 · source§

impl StructuralEq for String

source§

impl StructuralEq for WaitTimeoutResult

source§

impl StructuralEq for ThreadId

1.3.0 · source§

impl StructuralEq for Duration

source§

impl StructuralEq for Instant

source§

impl StructuralEq for SystemTime

1.66.0 · source§

impl StructuralEq for TryFromFloatSecsError

source§

impl StructuralEq for FileType

source§

impl StructuralEq for Permissions

1.27.0 · source§

impl StructuralEq for core::core_arch::x86::cpuid::CpuidResult

1.33.0 · source§

impl StructuralEq for PhantomPinned

source§

impl<'a> StructuralEq for Component<'a>

source§

impl<'a> StructuralEq for Prefix<'a>

1.10.0 · source§

impl<'a> StructuralEq for Location<'a>

source§

impl<'a> StructuralEq for PrefixComponent<'a>

source§

impl<'a> StructuralEq for Utf8Chunk<'a>

1.55.0 · source§

impl<B, C> StructuralEq for ControlFlow<B, C>

1.0.0 · source§

impl<Idx> StructuralEq for Range<Idx>

1.0.0 · source§

impl<Idx> StructuralEq for RangeFrom<Idx>

1.26.0 · source§

impl<Idx> StructuralEq for RangeInclusive<Idx>

1.0.0 · source§

impl<Idx> StructuralEq for RangeTo<Idx>

1.26.0 · source§

impl<Idx> StructuralEq for RangeToInclusive<Idx>

1.17.0 · source§

impl<T> StructuralEq for Bound<T>

1.0.0 · source§

impl<T> StructuralEq for Option<T>

1.36.0 · source§

impl<T> StructuralEq for Poll<T>

source§

impl<T> StructuralEq for &Twhere T: ?Sized,

source§

impl<T> StructuralEq for [T]

source§

impl<T> StructuralEq for (T₁, T₂, …, Tₙ)

This trait is implemented for tuples up to twelve items long.

1.19.0 · source§

impl<T> StructuralEq for Reverse<T>

source§

impl<T> StructuralEq for Cursor<T>

1.20.0 · source§

impl<T> StructuralEq for ManuallyDrop<T>where T: ?Sized,

1.0.0 · source§

impl<T> StructuralEq for Wrapping<T>

1.74.0 · source§

impl<T> StructuralEq for Saturating<T>

source§

impl<T> StructuralEq for PhantomData<T>where T: ?Sized,

1.0.0 · source§

impl<T, E> StructuralEq for Result<T, E>

source§

impl<T, const N: usize> StructuralEq for [T; N]

source§

impl<Y, R> StructuralEq for CoroutineState<Y, R>