32 lines
1.0 KiB
Rust
32 lines
1.0 KiB
Rust
// edition:2021
|
|
|
|
// Given how the closure desugaring is implemented (at least at the time of writing this test),
|
|
// we don't need to truncate the captured path to a reference into a packed-struct if the field
|
|
// being referenced will be moved into the closure, since it's safe to move out a field from a
|
|
// packed-struct.
|
|
//
|
|
// However to avoid surprises for the user, or issues when the closure is
|
|
// inlined we will truncate the capture to access just the struct regardless of if the field
|
|
// might get moved into the closure.
|
|
//
|
|
// It is possible for someone to try writing the code that relies on the desugaring to create a ref
|
|
// into a packed-struct. Here we test that the compiler still detects that case.
|
|
fn test_missing_unsafe_warning_on_repr_packed() {
|
|
#[repr(packed)]
|
|
struct Foo { x: String }
|
|
|
|
let foo = Foo { x: String::new() };
|
|
|
|
let c = || {
|
|
println!("{}", foo.x);
|
|
//~^ ERROR: reference to packed field is unaligned
|
|
let _z = foo.x;
|
|
};
|
|
|
|
c();
|
|
}
|
|
|
|
fn main() {
|
|
test_missing_unsafe_warning_on_repr_packed();
|
|
}
|