• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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