126 lines
4.3 KiB
Rust
126 lines
4.3 KiB
Rust
// Copyright 2025 The Fuchsia Authors
|
|
//
|
|
// Licensed under the 2-Clause BSD License <LICENSE-BSD or
|
|
// https://opensource.org/license/bsd-2-clause>, Apache License, Version 2.0
|
|
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
|
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, 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<T, U> {
|
|
pub t: T,
|
|
pub u: [U],
|
|
}
|
|
|
|
#[allow(clippy::must_use_candidate, clippy::missing_inline_in_public_items, clippy::todo)]
|
|
impl<T: FromBytes + IntoBytes, U: FromBytes + IntoBytes> SliceDst<T, U> {
|
|
pub fn new() -> &'static SliceDst<T, U> {
|
|
todo!()
|
|
}
|
|
|
|
pub fn new_mut() -> &'static mut SliceDst<T, U> {
|
|
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<u8, u8> = SliceDst::new();
|
|
/// let increase_offset: &SliceDst<[u8; 2], u8> = zerocopy::transmute_ref!(src);
|
|
/// ```
|
|
///
|
|
/// ```compile_fail,E0080
|
|
/// use zerocopy::doctests::SliceDst;
|
|
/// let src: &mut SliceDst<u8, u8> = 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 {}
|