Rollup merge of #90627 - camelid:suggest-box-deref, r=davidtwco
Suggest dereference of `Box` when inner type is expected
For example:
enum Ty {
Unit,
List(Box<Ty>),
}
fn foo(x: Ty) -> Ty {
match x {
Ty::Unit => Ty::Unit,
Ty::List(elem) => foo(elem),
}
}
Before, the only suggestion was to rewrap `inner` with `Ty::Wrapper`,
which is unhelpful and confusing:
error[E0308]: mismatched types
--> src/test/ui/suggestions/boxed-variant-field.rs:9:31
|
9 | Ty::List(elem) => foo(elem),
| ^^^^
| |
| expected enum `Ty`, found struct `Box`
| help: try using a variant of the expected enum: `Ty::List(elem)`
|
= note: expected enum `Ty`
found struct `Box<Ty>`
Now, rustc will first suggest dereferencing the `Box`, which is most
likely what the user intended:
error[E0308]: mismatched types
--> src/test/ui/suggestions/boxed-variant-field.rs:9:31
|
9 | Ty::List(elem) => foo(elem),
| ^^^^ expected enum `Ty`, found struct `Box`
|
= note: expected enum `Ty`
found struct `Box<Ty>`
help: try dereferencing the `Box`
|
9 | Ty::List(elem) => foo(*elem),
| +
help: try using a variant of the expected enum
|
9 | Ty::List(elem) => foo(Ty::List(elem)),
| ~~~~~~~~~~~~~~
r? ``@davidtwco``
This commit is contained in:
commit
1d9fe9cd06
4 changed files with 58 additions and 0 deletions
16
src/test/ui/suggestions/boxed-variant-field.rs
Normal file
16
src/test/ui/suggestions/boxed-variant-field.rs
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
enum Ty {
|
||||
Unit,
|
||||
List(Box<Ty>),
|
||||
}
|
||||
|
||||
fn foo(x: Ty) -> Ty {
|
||||
match x {
|
||||
Ty::Unit => Ty::Unit,
|
||||
Ty::List(elem) => foo(elem),
|
||||
//~^ ERROR mismatched types
|
||||
//~| HELP try dereferencing the `Box`
|
||||
//~| HELP try using a variant of the expected enum
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
20
src/test/ui/suggestions/boxed-variant-field.stderr
Normal file
20
src/test/ui/suggestions/boxed-variant-field.stderr
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
error[E0308]: mismatched types
|
||||
--> $DIR/boxed-variant-field.rs:9:31
|
||||
|
|
||||
LL | Ty::List(elem) => foo(elem),
|
||||
| ^^^^ expected enum `Ty`, found struct `Box`
|
||||
|
|
||||
= note: expected enum `Ty`
|
||||
found struct `Box<Ty>`
|
||||
help: try dereferencing the `Box`
|
||||
|
|
||||
LL | Ty::List(elem) => foo(*elem),
|
||||
| +
|
||||
help: try using a variant of the expected enum
|
||||
|
|
||||
LL | Ty::List(elem) => foo(Ty::List(elem)),
|
||||
| ~~~~~~~~~~~~~~
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
||||
|
|
@ -6,6 +6,10 @@ LL | want_foo(b);
|
|||
|
|
||||
= note: expected struct `Foo`
|
||||
found struct `Box<Foo>`
|
||||
help: try dereferencing the `Box`
|
||||
|
|
||||
LL | want_foo(*b);
|
||||
| +
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue