1 // Copyright 2022 The Fuchsia Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #![allow(warnings)] 6 7 #[macro_use] 8 mod util; 9 10 use std::{marker::PhantomData, option::IntoIter}; 11 12 use { 13 static_assertions::assert_impl_all, 14 zerocopy::{DstLayout, KnownLayout}, 15 }; 16 17 use crate::util::AU16; 18 19 #[derive(KnownLayout)] 20 struct Zst; 21 22 assert_impl_all!(Zst: KnownLayout); 23 24 #[derive(KnownLayout)] 25 struct One { 26 a: bool, 27 } 28 29 assert_impl_all!(One: KnownLayout); 30 31 #[derive(KnownLayout)] 32 struct Two { 33 a: bool, 34 b: Zst, 35 } 36 37 assert_impl_all!(Two: KnownLayout); 38 39 #[derive(KnownLayout)] 40 struct TypeParams<'a, T, I: Iterator> { 41 a: I::Item, 42 b: u8, 43 c: PhantomData<&'a [u8]>, 44 d: PhantomData<&'static str>, 45 e: PhantomData<String>, 46 f: T, 47 } 48 49 assert_impl_all!(TypeParams<'static, (), IntoIter<()>>: KnownLayout); 50 assert_impl_all!(TypeParams<'static, AU16, IntoIter<()>>: KnownLayout); 51 52 // Deriving `KnownLayout` should work if the struct has bounded parameters. 53 54 #[derive(KnownLayout)] 55 #[repr(C)] 56 struct WithParams<'a: 'b, 'b: 'a, const N: usize, T: 'a + 'b + KnownLayout>( 57 [T; N], 58 PhantomData<&'a &'b ()>, 59 ) 60 where 61 'a: 'b, 62 'b: 'a, 63 T: 'a + 'b + KnownLayout; 64 65 assert_impl_all!(WithParams<'static, 'static, 42, u8>: KnownLayout); 66