You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Rollup merge of rust-lang#134008 - jswrenn:unsafe-fields-copy, r=compiler-errors
Make `Copy` unsafe to implement for ADTs with `unsafe` fields
As a rule, the application of `unsafe` to a declaration requires that use-sites of that declaration also entail `unsafe`. For example, a field declared `unsafe` may only be read in the lexical context of an `unsafe` block.
For nearly all safe traits, the safety obligations of fields are explicitly discharged when they are mentioned in method definitions. For example, idiomatically implementing `Clone` (a safe trait) for a type with unsafe fields will require `unsafe` to clone those fields.
Prior to this commit, `Copy` violated this rule. The trait is marked safe, and although it has no explicit methods, its implementation permits reads of `Self`.
This commit resolves this by making `Copy` conditionally safe to implement. It remains safe to implement for ADTs without unsafe fields, but unsafe to implement for ADTs with unsafe fields.
Tracking: rust-lang#132922
r? ```@compiler-errors```
error[E0200]: the trait `Copy` requires an `unsafe impl` declaration
2
+
--> $DIR/copy-trait.rs:21:5
3
+
|
4
+
LL | impl Copy for UnsafeEnum {}
5
+
| ^^^^^^^^^^^^^^^^^^^^^^^^
6
+
|
7
+
= note: the trait `Copy` cannot be safely implemented for `bad_safe_impl::UnsafeEnum` because it has unsafe fields. Review the invariants of those fields before adding an `unsafe impl`
8
+
help: add `unsafe` to this trait implementation
9
+
|
10
+
LL | unsafe impl Copy for UnsafeEnum {}
11
+
| ++++++
12
+
13
+
error[E0199]: implementing the trait `Copy` is not unsafe
14
+
--> $DIR/copy-trait.rs:39:5
15
+
|
16
+
LL | unsafe impl Copy for SafeEnum {}
17
+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
18
+
|
19
+
help: remove `unsafe` from this trait implementation
20
+
|
21
+
LL - unsafe impl Copy for SafeEnum {}
22
+
LL + impl Copy for SafeEnum {}
23
+
|
24
+
25
+
error: aborting due to 2 previous errors
26
+
27
+
Some errors have detailed explanations: E0199, E0200.
28
+
For more information about an error, try `rustc --explain E0199`.
0 commit comments