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 // An enum is `IntoBytes` if if has a defined repr. 16 17 #[derive(imp::IntoBytes)] 18 #[repr(C)] 19 enum C { 20 A, 21 } 22 23 util_assert_impl_all!(C: imp::IntoBytes); 24 25 #[derive(imp::IntoBytes)] 26 #[repr(u8)] 27 enum U8 { 28 A, 29 } 30 31 util_assert_impl_all!(U8: imp::IntoBytes); 32 33 #[derive(imp::IntoBytes)] 34 #[repr(u16)] 35 enum U16 { 36 A, 37 } 38 39 util_assert_impl_all!(U16: imp::IntoBytes); 40 41 #[derive(imp::IntoBytes)] 42 #[repr(u32)] 43 enum U32 { 44 A, 45 } 46 47 util_assert_impl_all!(U32: imp::IntoBytes); 48 49 #[derive(imp::IntoBytes)] 50 #[repr(u64)] 51 enum U64 { 52 A, 53 } 54 55 util_assert_impl_all!(U64: imp::IntoBytes); 56 57 #[derive(imp::IntoBytes)] 58 #[repr(usize)] 59 enum Usize { 60 A, 61 } 62 63 util_assert_impl_all!(Usize: imp::IntoBytes); 64 65 #[derive(imp::IntoBytes)] 66 #[repr(i8)] 67 enum I8 { 68 A, 69 } 70 71 util_assert_impl_all!(I8: imp::IntoBytes); 72 73 #[derive(imp::IntoBytes)] 74 #[repr(i16)] 75 enum I16 { 76 A, 77 } 78 79 util_assert_impl_all!(I16: imp::IntoBytes); 80 81 #[derive(imp::IntoBytes)] 82 #[repr(i32)] 83 enum I32 { 84 A, 85 } 86 87 util_assert_impl_all!(I32: imp::IntoBytes); 88 89 #[derive(imp::IntoBytes)] 90 #[repr(i64)] 91 enum I64 { 92 A, 93 } 94 95 util_assert_impl_all!(I64: imp::IntoBytes); 96 97 #[derive(imp::IntoBytes)] 98 #[repr(isize)] 99 enum Isize { 100 A, 101 } 102 103 util_assert_impl_all!(Isize: imp::IntoBytes); 104 105 #[derive(imp::IntoBytes)] 106 #[repr(u8)] 107 enum HasData { 108 A(u8), 109 B(i8), 110 } 111 112 util_assert_impl_all!(HasData: imp::IntoBytes); 113 114 #[derive(imp::IntoBytes)] 115 #[repr(u32)] 116 enum HasData32 { 117 A(u32), 118 B(i32), 119 C([u8; 4]), 120 D([u16; 2]), 121 } 122 123 util_assert_impl_all!(HasData: imp::IntoBytes); 124 125 // After #1752 landed but before #1758 was fixed, this failed to compile because 126 // the padding check treated the tag type as being `#[repr(u8, align(2))] struct 127 // Tag { A }`, which is two bytes long, rather than the correct `#[repr(u8)] 128 // struct Tag { A }`, which is one byte long. 129 #[derive(imp::IntoBytes)] 130 #[repr(u8, align(2))] 131 enum BadTagWouldHavePadding { 132 A(u8, u16), 133 } 134