#![warn(
clippy::complexity,
clippy::correctness,
clippy::nursery,
clippy::pedantic,
clippy::perf,
clippy::style,
clippy::suspicious
)]
#![allow(clippy::derive_partial_eq_without_eq)]
use std::ops::Range;
use const_builder::ConstBuilder;
#[derive(Clone, Copy, Debug, PartialEq)]
#[repr(align(512))]
struct HugeAlign<T>(T);
#[derive(Debug, PartialEq, ConstBuilder)]
#[cfg_attr(any(), repr(Rust, packed))]
struct UnconditionalNotPacked<T: ?Sized> {
field: T,
}
#[derive(Debug, PartialEq, ConstBuilder)]
#[cfg_attr(all(), repr(Rust, packed))]
struct UnconditionalPacked<T> {
field: T,
}
#[derive(Debug, PartialEq, ConstBuilder)]
struct UnsafeCopy {
bytes: Box<[u8]>,
ranges: Box<[Range<usize>]>,
}
#[test]
fn unconditional_not_packed() {
let not_packed = UnconditionalNotPacked::builder().field(HugeAlign(16));
assert_eq!(align_of_val(¬_packed), 512);
let not_packed = not_packed.build();
assert_eq!(
not_packed,
UnconditionalNotPacked {
field: HugeAlign(16)
}
);
}
#[test]
fn unconditional_packed() {
let packed = UnconditionalPacked::builder().field(HugeAlign(16));
assert_eq!(align_of_val(&packed), 1);
let packed = packed.build();
assert_eq!(
packed,
UnconditionalPacked {
field: HugeAlign(16)
}
);
}
#[test]
fn unsafe_copy() {
let bytes = include_bytes!("miri.rs");
let src = UnsafeCopyUncheckedBuilder::new()
.bytes(Box::new(*bytes))
.ranges(Box::new([0..1, 1..bytes.len()]));
let copy1 = unsafe { (&raw const src).read() };
let copy2 = unsafe { (&raw const copy1).read() };
let copy3 = unsafe { (&raw const src).read() };
let result = unsafe { copy2.build() };
drop(src);
drop(copy1);
drop(copy3);
assert_eq!(
result,
UnsafeCopy {
bytes: Box::new(*bytes),
ranges: Box::new([0..1, 1..bytes.len()])
}
);
}