-
Notifications
You must be signed in to change notification settings - Fork 12.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of #74173 - estebank:struct-pat-as-enum, r=petrochenkov
Detect tuple struct incorrectly used as struct pat Subpart of #74005. r? @petrochenkov
- Loading branch information
Showing
10 changed files
with
137 additions
and
49 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
A tuple struct or tuple variant was used in a pattern as if it were a | ||
struct or struct variant. | ||
|
||
Erroneous code example: | ||
|
||
```compile_fail,E0769 | ||
enum E { | ||
A(i32), | ||
} | ||
let e = E::A(42); | ||
match e { | ||
E::A { number } => println!("{}", x), | ||
} | ||
``` | ||
|
||
To fix this error, you can use the tuple pattern: | ||
|
||
``` | ||
# enum E { | ||
# A(i32), | ||
# } | ||
# let e = E::A(42); | ||
match e { | ||
E::A(number) => println!("{}", number), | ||
} | ||
``` | ||
|
||
Alternatively, you can also use the struct pattern by using the correct | ||
field names and binding them to new identifiers: | ||
|
||
``` | ||
# enum E { | ||
# A(i32), | ||
# } | ||
# let e = E::A(42); | ||
match e { | ||
E::A { 0: number } => println!("{}", number), | ||
} | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
17 changes: 4 additions & 13 deletions
17
src/test/ui/missing/missing-fields-in-struct-pattern.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,9 @@ | ||
error[E0026]: struct `S` does not have fields named `a`, `b`, `c`, `d` | ||
--> $DIR/missing-fields-in-struct-pattern.rs:4:16 | ||
| | ||
LL | if let S { a, b, c, d } = S(1, 2, 3, 4) { | ||
| ^ ^ ^ ^ struct `S` does not have these fields | ||
|
||
error[E0027]: pattern does not mention fields `0`, `1`, `2`, `3` | ||
error[E0769]: tuple variant `S` written as struct variant | ||
--> $DIR/missing-fields-in-struct-pattern.rs:4:12 | ||
| | ||
LL | if let S { a, b, c, d } = S(1, 2, 3, 4) { | ||
| ^^^^^^^^^^^^^^^^ missing fields `0`, `1`, `2`, `3` | ||
| | ||
= note: trying to match a tuple variant with a struct variant pattern | ||
| ^^^^^^^^^^^^^^^^ help: use the tuple variant pattern syntax instead: `S(a, b, c, d)` | ||
|
||
error: aborting due to 2 previous errors | ||
error: aborting due to previous error | ||
|
||
Some errors have detailed explanations: E0026, E0027. | ||
For more information about an error, try `rustc --explain E0026`. | ||
For more information about this error, try `rustc --explain E0769`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,9 @@ | ||
error[E0026]: variant `X::Y` does not have a field named `number` | ||
--> $DIR/issue-41314.rs:7:16 | ||
| | ||
LL | X::Y { number } => {} | ||
| ^^^^^^ variant `X::Y` does not have this field | ||
|
||
error[E0027]: pattern does not mention field `0` | ||
error[E0769]: tuple variant `X::Y` written as struct variant | ||
--> $DIR/issue-41314.rs:7:9 | ||
| | ||
LL | X::Y { number } => {} | ||
| ^^^^^^^^^^^^^^^ missing field `0` | ||
| | ||
= note: trying to match a tuple variant with a struct variant pattern | ||
| ^^^^^^^^^^^^^^^ help: use the tuple variant pattern syntax instead: `X::Y(number)` | ||
|
||
error: aborting due to 2 previous errors | ||
error: aborting due to previous error | ||
|
||
Some errors have detailed explanations: E0026, E0027. | ||
For more information about an error, try `rustc --explain E0026`. | ||
For more information about this error, try `rustc --explain E0769`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters