rust/tests/ui/unsafe-fields/unsafe-fields-crate.rs
Jack Wrenn a122dde217 do not implement unsafe auto traits for types with unsafe fields
If a type has unsafe fields, its safety invariants are not simply
the conjunction of its field types' safety invariants. Consequently,
it's invalid to reason about the safety properties of these types
in a purely structural manner — i.e., the manner in which `auto`
traits are implemented.

Makes progress towards #132922.
2024-12-05 23:52:21 +00:00

63 lines
1.3 KiB
Rust

//@ compile-flags: --crate-type=lib
//@ aux-build: unsafe-fields-crate-dep.rs
extern crate unsafe_fields_crate_dep;
use unsafe_fields_crate_dep::WithUnsafeField;
fn new_without_unsafe() -> WithUnsafeField {
WithUnsafeField {
//~^ ERROR
unsafe_field: 0,
safe_field: 0,
}
}
fn operate_on_safe_field(s: &mut WithUnsafeField) {
s.safe_field = 2;
&s.safe_field;
s.safe_field;
}
fn set_unsafe_field(s: &mut WithUnsafeField) {
unsafe {
s.unsafe_field = 2;
}
}
fn read_unsafe_field(s: &WithUnsafeField) -> u32 {
unsafe { s.unsafe_field }
}
fn ref_unsafe_field(s: &WithUnsafeField) -> &u32 {
unsafe { &s.unsafe_field }
}
fn destructure(s: &WithUnsafeField) {
unsafe {
let WithUnsafeField { safe_field, unsafe_field } = s;
}
}
fn set_unsafe_field_without_unsafe(s: &mut WithUnsafeField) {
s.unsafe_field = 2;
//~^ ERROR
}
fn read_unsafe_field_without_unsafe(s: &WithUnsafeField) -> u32 {
s.unsafe_field
//~^ ERROR
}
fn ref_unsafe_field_without_unsafe(s: &WithUnsafeField) -> &u32 {
&s.unsafe_field
//~^ ERROR
}
fn destructure_without_unsafe(s: &WithUnsafeField) {
let WithUnsafeField { safe_field, unsafe_field } = s;
//~^ ERROR
let WithUnsafeField { safe_field, .. } = s;
}