Skip to content

Commit

Permalink
Add error code for missing base expression in struct update syntax
Browse files Browse the repository at this point in the history
  • Loading branch information
clubby789 committed Nov 1, 2023
1 parent 146dafa commit 93813d8
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 6 deletions.
2 changes: 1 addition & 1 deletion compiler/rustc_ast_lowering/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ ast_lowering_bad_return_type_notation_output =
ast_lowering_base_expression_double_dot =
base expression required after `..`
.label = add a base expression here
.suggestion = add a base expression here
ast_lowering_clobber_abi_not_supported =
`clobber_abi` is not supported on this target
Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_ast_lowering/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,10 +113,10 @@ pub struct UnderscoreExprLhsAssign {
}

#[derive(Diagnostic, Clone, Copy)]
#[diag(ast_lowering_base_expression_double_dot)]
#[diag(ast_lowering_base_expression_double_dot, code = "E0796")]
pub struct BaseExpressionDoubleDot {
#[primary_span]
#[label]
#[suggestion(code = "/* expr */", applicability = "has-placeholders", style = "verbose")]
pub span: Span,
}

Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_error_codes/src/error_codes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,7 @@ E0792: include_str!("./error_codes/E0792.md"),
E0793: include_str!("./error_codes/E0793.md"),
E0794: include_str!("./error_codes/E0794.md"),
E0795: include_str!("./error_codes/E0795.md"),
E0796: include_str!("./error_codes/E0796.md"),
}

// Undocumented removed error codes. Note that many removed error codes are kept in the list above
Expand Down
26 changes: 26 additions & 0 deletions compiler/rustc_error_codes/src/error_codes/E0796.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
Struct update syntax was used without a base expression.

Erroneous code example:

```compile_fail,E0796
struct Foo {
fizz: u8,
buzz: u8
}
let f1 = Foo { fizz: 10, buzz: 1};
let f2 = Foo { fizz: 10, .. }; // error
```

Using struct update syntax requires a 'base expression'.
This will be used to fill remaining fields.

```
struct Foo {
fizz: u8,
buzz: u8
}
let f1 = Foo { fizz: 10, buzz: 1};
let f2 = Foo { fizz: 10, ..f1 };
```
11 changes: 8 additions & 3 deletions tests/ui/destructuring-assignment/struct_destructure_fail.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,16 @@ error: functional record updates are not allowed in destructuring assignments
LL | Struct { a, ..d } = Struct { a: 1, b: 2 };
| ^ help: consider removing the trailing pattern

error: base expression required after `..`
error[E0796]: base expression required after `..`
--> $DIR/struct_destructure_fail.rs:15:19
|
LL | Struct { a, .. };
| ^ add a base expression here
| ^
|
help: add a base expression here
|
LL | Struct { a, ../* expr */ };
| ++++++++++

error[E0026]: struct `Struct` does not have a field named `c`
--> $DIR/struct_destructure_fail.rs:10:20
Expand All @@ -41,5 +46,5 @@ LL | Struct { a, .. } = Struct { a: 1, b: 2 };

error: aborting due to 5 previous errors

Some errors have detailed explanations: E0026, E0027.
Some errors have detailed explanations: E0026, E0027, E0796.
For more information about an error, try `rustc --explain E0026`.

0 comments on commit 93813d8

Please sign in to comment.