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 {static_assertions::assert_impl_all, zerocopy::KnownLayout}; 13 14 #[derive(Clone, Copy, KnownLayout)] 15 union Zst { 16 a: (), 17 } 18 19 assert_impl_all!(Zst: KnownLayout); 20 21 #[derive(KnownLayout)] 22 union One { 23 a: bool, 24 } 25 26 assert_impl_all!(One: KnownLayout); 27 28 #[derive(KnownLayout)] 29 union Two { 30 a: bool, 31 b: Zst, 32 } 33 34 assert_impl_all!(Two: KnownLayout); 35 36 #[derive(KnownLayout)] 37 union TypeParams<'a, T: Copy, I: Iterator> 38 where 39 I::Item: Copy, 40 { 41 a: T, 42 c: I::Item, 43 d: u8, 44 e: PhantomData<&'a [u8]>, 45 f: PhantomData<&'static str>, 46 g: PhantomData<String>, 47 } 48 49 assert_impl_all!(TypeParams<'static, (), IntoIter<()>>: KnownLayout); 50 51 // Deriving `KnownLayout` should work if the union has bounded parameters. 52 53 #[derive(KnownLayout)] 54 #[repr(C)] 55 union WithParams<'a: 'b, 'b: 'a, const N: usize, T: 'a + 'b + KnownLayout> 56 where 57 'a: 'b, 58 'b: 'a, 59 T: 'a + 'b + Copy + KnownLayout, 60 { 61 a: [T; N], 62 b: PhantomData<&'a &'b ()>, 63 } 64 65 assert_impl_all!(WithParams<'static, 'static, 42, u8>: KnownLayout); 66