forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathderiving-with-repr-packed.rs
43 lines (36 loc) · 1.03 KB
/
deriving-with-repr-packed.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Check that deriving certain builtin traits on certain packed structs cause
// errors. To avoid potentially misaligned references, field copies must be
// used, which involves adding `T: Copy` bounds.
#[derive(Copy, Clone, Default, PartialEq, Eq)]
#[repr(packed)]
pub struct Foo<T>(T, T, T);
// This one is fine because the fields all impl `Copy`.
#[derive(Default, Hash)]
#[repr(packed)]
pub struct Bar(u32, u32, u32);
// This one is fine because it's not packed.
#[derive(Debug, Default)]
struct Y(usize);
// This one has an error because `Y` doesn't impl `Copy`.
// Note: there is room for improvement in the error message.
#[derive(Debug, Default)]
#[repr(packed)]
struct X(Y);
//~^ ERROR cannot move out of `self` which is behind a shared reference
#[derive(Debug)]
#[repr(packed)]
struct FlexZeroSlice {
width: u8,
data: [u8],
//~^ ERROR cannot move
//~| ERROR cannot move
}
#[derive(Debug)]
#[repr(packed)]
struct WithStr {
width: u8,
data: str,
//~^ ERROR cannot move
//~| ERROR cannot move
}
fn main() {}