1 // Copyright 2019 The Fuchsia Authors 2 // 3 // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 4 // <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT 5 // license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option. 6 // This file may not be copied, modified, or distributed except according to 7 // those terms. 8 9 // See comment in `include.rs` for why we disable the prelude. 10 #![no_implicit_prelude] 11 #![allow(warnings)] 12 13 include!("include.rs"); 14 15 #[derive(imp::FromZeros)] 16 #[repr(C)] 17 enum Foo { 18 A, 19 } 20 21 util_assert_impl_all!(Foo: imp::FromZeros); 22 23 #[derive(imp::FromZeros)] 24 #[repr(C)] 25 enum Bar { 26 A = 0, 27 } 28 29 util_assert_impl_all!(Bar: imp::FromZeros); 30 31 #[derive(imp::FromZeros)] 32 #[repr(C)] 33 enum TwoVariantsHasExplicitZero { 34 A = 1, 35 B = 0, 36 } 37 38 util_assert_impl_all!(TwoVariantsHasExplicitZero: imp::FromZeros); 39 40 #[derive(imp::FromZeros)] 41 #[repr(i8)] 42 enum ImplicitNonFirstVariantIsZero { 43 A = -1, 44 B, 45 } 46 47 util_assert_impl_all!(ImplicitNonFirstVariantIsZero: imp::FromZeros); 48 49 #[derive(imp::FromZeros)] 50 #[repr(u64)] 51 enum LargeDiscriminant { 52 A = 0xFFFF_FFFF_FFFF_FFFF, 53 B = 0x0000_0000_0000_0000, 54 } 55 56 util_assert_impl_all!(LargeDiscriminant: imp::FromZeros); 57 58 #[derive(imp::FromZeros)] 59 #[repr(C)] 60 enum FirstVariantIsZeroable { 61 A(u32), 62 B { foo: u32 }, 63 } 64 65 util_assert_impl_all!(FirstVariantIsZeroable: imp::FromZeros); 66 67 #[derive(imp::FromZeros)] 68 #[repr(u8)] 69 enum FirstVariantIsZeroableSecondIsNot { 70 A(bool), 71 B(::core::num::NonZeroU8), 72 } 73 74 util_assert_impl_all!(FirstVariantIsZeroableSecondIsNot: imp::FromZeros); 75 76 // MSRV does not support data-carrying enum variants with explicit discriminants 77 #[cfg(not(__ZEROCOPY_TOOLCHAIN = "msrv"))] 78 mod msrv_only { 79 use super::*; 80 81 #[derive(imp::FromZeros)] 82 #[repr(u8)] 83 enum ImplicitFirstVariantIsZeroable { 84 A(bool), 85 B(::core::num::NonZeroU8) = 1, 86 } 87 88 util_assert_impl_all!(ImplicitFirstVariantIsZeroable: imp::FromZeros); 89 90 #[derive(imp::FromZeros)] 91 #[repr(i8)] 92 enum ImplicitNonFirstVariantIsZeroable { 93 A(::core::num::NonZeroU8) = 1, 94 B = -1, 95 C(bool), 96 } 97 98 util_assert_impl_all!(ImplicitNonFirstVariantIsZeroable: imp::FromZeros); 99 } 100