// Copyright 2025 The Fuchsia Authors // // Licensed under the 2-Clause BSD License , Apache License, Version 2.0 // , or the MIT // license , at your option. // This file may not be copied, modified, or distributed except according to // those terms. #![cfg(feature = "derive")] // Required for derives on `SliceDst` #![allow(dead_code)] //! Our UI test framework, built on the `trybuild` crate, does not support //! testing for post-monomorphization errors. Instead, we use doctests, which //! are able to test for post-monomorphization errors. use crate::*; #[derive(KnownLayout, FromBytes, IntoBytes, Immutable)] #[repr(C)] #[allow(missing_debug_implementations, missing_copy_implementations)] pub struct SliceDst { pub t: T, pub u: [U], } #[allow(clippy::must_use_candidate, clippy::missing_inline_in_public_items, clippy::todo)] impl SliceDst { pub fn new() -> &'static SliceDst { todo!() } pub fn new_mut() -> &'static mut SliceDst { todo!() } } /// We require that the alignment of the destination type is not larger than the /// alignment of the source type. /// /// ```compile_fail,E0080 /// let increase_alignment: &u16 = zerocopy::transmute_ref!(&[0u8; 2]); /// ``` /// /// ```compile_fail,E0080 /// let mut src = [0u8; 2]; /// let increase_alignment: &mut u16 = zerocopy::transmute_mut!(&mut src); /// ``` enum TransmuteRefMutAlignmentIncrease {} /// We require that the size of the destination type is not larger than the size /// of the source type. /// /// ```compile_fail,E0080 /// let increase_size: &[u8; 2] = zerocopy::transmute_ref!(&0u8); /// ``` /// /// ```compile_fail,E0080 /// let mut src = 0u8; /// let increase_size: &mut [u8; 2] = zerocopy::transmute_mut!(&mut src); /// ``` enum TransmuteRefMutSizeIncrease {} /// We require that the size of the destination type is not smaller than the /// size of the source type. /// /// ```compile_fail,E0080 /// let decrease_size: &u8 = zerocopy::transmute_ref!(&[0u8; 2]); /// ``` /// /// ```compile_fail,E0080 /// let mut src = [0u8; 2]; /// let decrease_size: &mut u8 = zerocopy::transmute_mut!(&mut src); /// ``` enum TransmuteRefMutSizeDecrease {} /// It's not possible in the general case to increase the trailing slice offset /// during a reference transmutation - some pointer metadata values would not be /// supportable, and so such a transmutation would be fallible. /// /// ```compile_fail,E0080 /// use zerocopy::doctests::SliceDst; /// let src: &SliceDst = SliceDst::new(); /// let increase_offset: &SliceDst<[u8; 2], u8> = zerocopy::transmute_ref!(src); /// ``` /// /// ```compile_fail,E0080 /// use zerocopy::doctests::SliceDst; /// let src: &mut SliceDst = SliceDst::new_mut(); /// let increase_offset: &mut SliceDst<[u8; 2], u8> = zerocopy::transmute_mut!(src); /// ``` enum TransmuteRefMutDstOffsetIncrease {} /// Reference transmutes are not possible when the difference between the source /// and destination types' trailing slice offsets is not a multiple of the /// destination type's trailing slice element size. /// /// ```compile_fail,E0080 /// use zerocopy::doctests::SliceDst; /// let src: &SliceDst<[u8; 3], [u8; 2]> = SliceDst::new(); /// let _: &SliceDst<[u8; 2], [u8; 2]> = zerocopy::transmute_ref!(src); /// ``` /// /// ```compile_fail,E0080 /// use zerocopy::doctests::SliceDst; /// let src: &mut SliceDst<[u8; 3], [u8; 2]> = SliceDst::new_mut(); /// let _: &mut SliceDst<[u8; 2], [u8; 2]> = zerocopy::transmute_mut!(src); /// ``` enum TransmuteRefMutDstOffsetNotMultiple {} /// Reference transmutes are not possible when the source's trailing slice /// element size is not a multiple of the destination's. /// /// ```compile_fail,E0080 /// use zerocopy::doctests::SliceDst; /// let src: &SliceDst<(), [u8; 3]> = SliceDst::new(); /// let _: &SliceDst<(), [u8; 2]> = zerocopy::transmute_ref!(src); /// ``` /// /// ```compile_fail,E0080 /// use zerocopy::doctests::SliceDst; /// let src: &mut SliceDst<(), [u8; 3]> = SliceDst::new_mut(); /// let _: &mut SliceDst<(), [u8; 2]> = zerocopy::transmute_mut!(src); /// ``` enum TransmuteRefMutDstElemSizeNotMultiple {}