Assign E0784 to union expression error

This commit is contained in:
Guillaume Gomez 2021-08-02 16:33:37 +02:00
parent 76d247c00a
commit c364a4e30f
3 changed files with 41 additions and 2 deletions

View File

@ -478,6 +478,7 @@ E0780: include_str!("./error_codes/E0780.md"),
E0781: include_str!("./error_codes/E0781.md"), E0781: include_str!("./error_codes/E0781.md"),
E0782: include_str!("./error_codes/E0782.md"), E0782: include_str!("./error_codes/E0782.md"),
E0783: include_str!("./error_codes/E0783.md"), E0783: include_str!("./error_codes/E0783.md"),
E0784: include_str!("./error_codes/E0784.md"),
; ;
// E0006, // merged with E0005 // E0006, // merged with E0005
// E0008, // cannot bind by-move into a pattern guard // E0008, // cannot bind by-move into a pattern guard
@ -636,7 +637,7 @@ E0783: include_str!("./error_codes/E0783.md"),
E0711, // a feature has been declared with conflicting stability attributes E0711, // a feature has been declared with conflicting stability attributes
E0717, // rustc_promotable without stability attribute E0717, // rustc_promotable without stability attribute
// E0721, // `await` keyword // E0721, // `await` keyword
// E0723, unstable feature in `const` context // E0723, unstable feature in `const` context
E0726, // non-explicit (not `'_`) elided lifetime in unsupported position E0726, // non-explicit (not `'_`) elided lifetime in unsupported position
// E0738, // Removed; errored on `#[track_caller] fn`s in `extern "Rust" { ... }`. // E0738, // Removed; errored on `#[track_caller] fn`s in `extern "Rust" { ... }`.
E0772, // `'static' obligation coming from `impl dyn Trait {}` or `impl Foo for dyn Bar {}`. E0772, // `'static' obligation coming from `impl dyn Trait {}` or `impl Foo for dyn Bar {}`.

View File

@ -0,0 +1,32 @@
A union expression does not have exactly one field.
Erroneous code example:
```compile_fail,E0784
union Bird {
pigeon: u8,
turtledove: u16,
}
let bird = Bird {}; // error
let bird = Bird { pigeon: 0, turtledove: 1 }; // error
```
The key property of unions is that all fields of a union share common storage.
As a result, writes to one field of a union can overwrite its other fields, and
size of a union is determined by the size of its largest field.
You can find more information about the union types in the [Rust reference].
Working example:
```
union Bird {
pigeon: u8,
turtledove: u16,
}
let bird = Bird { pigeon: 0 }; // OK
```
[Rust reference]: https://doc.rust-lang.org/reference/items/unions.html

View File

@ -1304,7 +1304,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// Make sure the programmer specified correct number of fields. // Make sure the programmer specified correct number of fields.
if kind_name == "union" { if kind_name == "union" {
if ast_fields.len() != 1 { if ast_fields.len() != 1 {
tcx.sess.span_err(span, "union expressions should have exactly one field"); struct_span_err!(
tcx.sess,
span,
E0784,
"union expressions should have exactly one field",
)
.emit();
} }
} else if check_completeness && !error_happened && !remaining_fields.is_empty() { } else if check_completeness && !error_happened && !remaining_fields.is_empty() {
let no_accessible_remaining_fields = remaining_fields let no_accessible_remaining_fields = remaining_fields