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 #[macro_use]
10 extern crate zerocopy;
11 
12 #[path = "../util.rs"]
13 mod util;
14 
15 use zerocopy::KnownLayout;
16 
17 use self::util::AU16;
18 
main()19 fn main() {}
20 
21 //
22 // KnownLayout errors
23 //
24 
25 struct NotKnownLayout;
26 
27 struct NotKnownLayoutDst([u8]);
28 
29 // | `repr(C)`? | generic? | `KnownLayout`? | `Sized`? | Type Name |
30 // |          N |        N |              N |        N |      KL00 |
31 #[derive(KnownLayout)]
32 struct KL00(u8, NotKnownLayoutDst);
33 
34 // | `repr(C)`? | generic? | `KnownLayout`? | `Sized`? | Type Name |
35 // |          N |        N |              Y |        N |      KL02 |
36 #[derive(KnownLayout)]
37 struct KL02(u8, [u8]);
38 
39 // | `repr(C)`? | generic? | `KnownLayout`? | `Sized`? | Type Name |
40 // |          Y |        N |              N |        N |      KL08 |
41 #[derive(KnownLayout)]
42 #[repr(C)]
43 struct KL08(u8, NotKnownLayoutDst);
44 
45 // | `repr(C)`? | generic? | `KnownLayout`? | `Sized`? | Type Name |
46 // |          Y |        N |              N |        Y |      KL09 |
47 #[derive(KnownLayout)]
48 #[repr(C)]
49 struct KL09(NotKnownLayout, NotKnownLayout);
50 
51 //
52 // AsBytes errors
53 //
54 
55 #[derive(AsBytes)]
56 #[repr(C)]
57 struct AsBytes1<T>(T);
58 
59 #[derive(AsBytes)]
60 #[repr(C)]
61 struct AsBytes2 {
62     foo: u8,
63     bar: AU16,
64 }
65 
66 #[derive(AsBytes)]
67 #[repr(C, packed(2))]
68 struct AsBytes3 {
69     foo: u8,
70     // We'd prefer to use AU64 here, but you can't use aligned types in
71     // packed structs.
72     bar: u64,
73 }
74 
75 //
76 // Unaligned errors
77 //
78 
79 #[derive(Unaligned)]
80 #[repr(C, align(2))]
81 struct Unaligned1;
82 
83 #[derive(Unaligned)]
84 #[repr(transparent, align(2))]
85 struct Unaligned2 {
86     foo: u8,
87 }
88 
89 #[derive(Unaligned)]
90 #[repr(packed, align(2))]
91 struct Unaligned3;
92 
93 #[derive(Unaligned)]
94 #[repr(align(1), align(2))]
95 struct Unaligned4;
96 
97 #[derive(Unaligned)]
98 #[repr(align(2), align(4))]
99 struct Unaligned5;
100