mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-30 03:57:37 +00:00

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.
76 lines
2.7 KiB
Plaintext
76 lines
2.7 KiB
Plaintext
error[E0740]: field must implement `Copy` or be wrapped in `ManuallyDrop<...>` to be unsafe
|
|
--> $DIR/unsafe-fields.rs:20:5
|
|
|
|
|
LL | unsafe unsafe_noncopy_field: Vec<u32>,
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
= note: unsafe fields must not have drop side-effects, which is currently enforced via either `Copy` or `ManuallyDrop<...>`
|
|
help: wrap the field type in `ManuallyDrop<...>`
|
|
|
|
|
LL | unsafe unsafe_noncopy_field: std::mem::ManuallyDrop<Vec<u32>>,
|
|
| +++++++++++++++++++++++ +
|
|
|
|
error[E0133]: use of unsafe field is unsafe and requires unsafe block
|
|
--> $DIR/unsafe-fields.rs:15:30
|
|
|
|
|
LL | let A::WithUnsafeField { unsafe_field, safe_field } = a;
|
|
| ^^^^^^^^^^^^ use of unsafe field
|
|
|
|
|
= note: unsafe fields may carry library invariants
|
|
|
|
error[E0133]: initializing type with an unsafe field is unsafe and requires unsafe block
|
|
--> $DIR/unsafe-fields.rs:43:9
|
|
|
|
|
LL | / WithUnsafeField {
|
|
LL | | unsafe_field: 0,
|
|
LL | | safe_field: 0,
|
|
LL | | }
|
|
| |_________^ initialization of struct with unsafe field
|
|
|
|
|
= note: unsafe fields may carry library invariants
|
|
|
|
error[E0133]: use of unsafe field is unsafe and requires unsafe block
|
|
--> $DIR/unsafe-fields.rs:80:9
|
|
|
|
|
LL | self.unsafe_field = 2;
|
|
| ^^^^^^^^^^^^^^^^^ use of unsafe field
|
|
|
|
|
= note: unsafe fields may carry library invariants
|
|
|
|
error[E0133]: use of unsafe field is unsafe and requires unsafe block
|
|
--> $DIR/unsafe-fields.rs:85:9
|
|
|
|
|
LL | self.unsafe_field
|
|
| ^^^^^^^^^^^^^^^^^ use of unsafe field
|
|
|
|
|
= note: unsafe fields may carry library invariants
|
|
|
|
error[E0133]: use of unsafe field is unsafe and requires unsafe block
|
|
--> $DIR/unsafe-fields.rs:90:10
|
|
|
|
|
LL | &self.unsafe_field
|
|
| ^^^^^^^^^^^^^^^^^ use of unsafe field
|
|
|
|
|
= note: unsafe fields may carry library invariants
|
|
|
|
error[E0133]: use of unsafe field is unsafe and requires unsafe block
|
|
--> $DIR/unsafe-fields.rs:95:32
|
|
|
|
|
LL | let Self { safe_field, unsafe_field } = self;
|
|
| ^^^^^^^^^^^^ use of unsafe field
|
|
|
|
|
= note: unsafe fields may carry library invariants
|
|
|
|
error[E0133]: use of unsafe field is unsafe and requires unsafe block
|
|
--> $DIR/unsafe-fields.rs:106:20
|
|
|
|
|
LL | &raw const self.unsafe_field
|
|
| ^^^^^^^^^^^^^^^^^ use of unsafe field
|
|
|
|
|
= note: unsafe fields may carry library invariants
|
|
|
|
error: aborting due to 8 previous errors
|
|
|
|
Some errors have detailed explanations: E0133, E0740.
|
|
For more information about an error, try `rustc --explain E0133`.
|