44 lines
1.0 KiB
Rust
44 lines
1.0 KiB
Rust
// 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() {}
|