Coverage Report

Created: 2025-10-10 07:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.27/src/doctests.rs
Line
Count
Source
1
// Copyright 2025 The Fuchsia Authors
2
//
3
// Licensed under the 2-Clause BSD License <LICENSE-BSD or
4
// https://opensource.org/license/bsd-2-clause>, Apache License, Version 2.0
5
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
6
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
7
// This file may not be copied, modified, or distributed except according to
8
// those terms.
9
10
#![cfg(feature = "derive")] // Required for derives on `SliceDst`
11
#![allow(dead_code)]
12
13
//! Our UI test framework, built on the `trybuild` crate, does not support
14
//! testing for post-monomorphization errors. Instead, we use doctests, which
15
//! are able to test for post-monomorphization errors.
16
17
use crate::*;
18
19
#[derive(KnownLayout, FromBytes, IntoBytes, Immutable)]
20
#[repr(C)]
21
#[allow(missing_debug_implementations, missing_copy_implementations)]
22
pub struct SliceDst<T, U> {
23
    pub t: T,
24
    pub u: [U],
25
}
26
27
#[allow(clippy::must_use_candidate, clippy::missing_inline_in_public_items, clippy::todo)]
28
impl<T: FromBytes + IntoBytes, U: FromBytes + IntoBytes> SliceDst<T, U> {
29
0
    pub fn new() -> &'static SliceDst<T, U> {
30
0
        todo!()
31
    }
32
33
0
    pub fn new_mut() -> &'static mut SliceDst<T, U> {
34
0
        todo!()
35
    }
36
}
37
38
/// We require that the alignment of the destination type is not larger than the
39
/// alignment of the source type.
40
///
41
/// ```compile_fail,E0080
42
/// let increase_alignment: &u16 = zerocopy::transmute_ref!(&[0u8; 2]);
43
/// ```
44
///
45
/// ```compile_fail,E0080
46
/// let mut src = [0u8; 2];
47
/// let increase_alignment: &mut u16 = zerocopy::transmute_mut!(&mut src);
48
/// ```
49
enum TransmuteRefMutAlignmentIncrease {}
50
51
/// We require that the size of the destination type is not larger than the size
52
/// of the source type.
53
///
54
/// ```compile_fail,E0080
55
/// let increase_size: &[u8; 2] = zerocopy::transmute_ref!(&0u8);
56
/// ```
57
///
58
/// ```compile_fail,E0080
59
/// let mut src = 0u8;
60
/// let increase_size: &mut [u8; 2] = zerocopy::transmute_mut!(&mut src);
61
/// ```
62
enum TransmuteRefMutSizeIncrease {}
63
64
/// We require that the size of the destination type is not smaller than the
65
/// size of the source type.
66
///
67
/// ```compile_fail,E0080
68
/// let decrease_size: &u8 = zerocopy::transmute_ref!(&[0u8; 2]);
69
/// ```
70
///
71
/// ```compile_fail,E0080
72
/// let mut src = [0u8; 2];
73
/// let decrease_size: &mut u8 = zerocopy::transmute_mut!(&mut src);
74
/// ```
75
enum TransmuteRefMutSizeDecrease {}
76
77
/// It's not possible in the general case to increase the trailing slice offset
78
/// during a reference transmutation - some pointer metadata values would not be
79
/// supportable, and so such a transmutation would be fallible.
80
///
81
/// ```compile_fail,E0080
82
/// use zerocopy::doctests::SliceDst;
83
/// let src: &SliceDst<u8, u8> = SliceDst::new();
84
/// let increase_offset: &SliceDst<[u8; 2], u8> = zerocopy::transmute_ref!(src);
85
/// ```
86
///
87
/// ```compile_fail,E0080
88
/// use zerocopy::doctests::SliceDst;
89
/// let src: &mut SliceDst<u8, u8> = SliceDst::new_mut();
90
/// let increase_offset: &mut SliceDst<[u8; 2], u8> = zerocopy::transmute_mut!(src);
91
/// ```
92
enum TransmuteRefMutDstOffsetIncrease {}
93
94
/// Reference transmutes are not possible when the difference between the source
95
/// and destination types' trailing slice offsets is not a multiple of the
96
/// destination type's trailing slice element size.
97
///
98
/// ```compile_fail,E0080
99
/// use zerocopy::doctests::SliceDst;
100
/// let src: &SliceDst<[u8; 3], [u8; 2]> = SliceDst::new();
101
/// let _: &SliceDst<[u8; 2], [u8; 2]> = zerocopy::transmute_ref!(src);
102
/// ```
103
///
104
/// ```compile_fail,E0080
105
/// use zerocopy::doctests::SliceDst;
106
/// let src: &mut SliceDst<[u8; 3], [u8; 2]> = SliceDst::new_mut();
107
/// let _: &mut SliceDst<[u8; 2], [u8; 2]> = zerocopy::transmute_mut!(src);
108
/// ```
109
enum TransmuteRefMutDstOffsetNotMultiple {}
110
111
/// Reference transmutes are not possible when the source's trailing slice
112
/// element size is not a multiple of the destination's.
113
///
114
/// ```compile_fail,E0080
115
/// use zerocopy::doctests::SliceDst;
116
/// let src: &SliceDst<(), [u8; 3]> = SliceDst::new();
117
/// let _: &SliceDst<(), [u8; 2]> = zerocopy::transmute_ref!(src);
118
/// ```
119
///
120
/// ```compile_fail,E0080
121
/// use zerocopy::doctests::SliceDst;
122
/// let src: &mut SliceDst<(), [u8; 3]> = SliceDst::new_mut();
123
/// let _: &mut SliceDst<(), [u8; 2]> = zerocopy::transmute_mut!(src);
124
/// ```
125
enum TransmuteRefMutDstElemSizeNotMultiple {}