fix wrong suggestions for boxed trait objects instead of impl trait

This commit is contained in:
Takayuki Maeda 2022-08-01 20:22:50 +09:00
parent fc43bd60c0
commit 82f2c08200
7 changed files with 122 additions and 31 deletions

View file

@ -0,0 +1,23 @@
struct S;
struct Y;
trait Trait {}
impl Trait for Y {}
fn foo() -> impl Trait {
if true {
S
} else {
Y //~ ERROR `if` and `else` have incompatible types
}
}
fn bar() -> impl Trait {
match true {
true => S,
false => Y, //~ ERROR `match` arms have incompatible types
}
}
fn main() {}

View file

@ -0,0 +1,26 @@
error[E0308]: `if` and `else` have incompatible types
--> $DIR/do-not-suggest-boxed-trait-objects-instead-of-impl-trait.rs:12:9
|
LL | / if true {
LL | | S
| | - expected because of this
LL | | } else {
LL | | Y
| | ^ expected struct `S`, found struct `Y`
LL | | }
| |_____- `if` and `else` have incompatible types
error[E0308]: `match` arms have incompatible types
--> $DIR/do-not-suggest-boxed-trait-objects-instead-of-impl-trait.rs:19:18
|
LL | / match true {
LL | | true => S,
| | - this is found to be of type `S`
LL | | false => Y,
| | ^ expected struct `S`, found struct `Y`
LL | | }
| |_____- `match` arms have incompatible types
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0308`.

View file

@ -10,7 +10,7 @@ trait Trait {}
impl Trait for S {}
impl Trait for Y {}
fn baz() -> Box<dyn Trait> {
fn foo() -> Box<dyn Trait> {
if true {
Box::new(S)
} else {
@ -18,4 +18,11 @@ fn baz() -> Box<dyn Trait> {
}
}
fn bar() -> Box<dyn Trait> {
match true {
true => Box::new(S),
false => Box::new(Y), //~ ERROR `match` arms have incompatible types
}
}
fn main() {}

View file

@ -10,7 +10,7 @@ trait Trait {}
impl Trait for S {}
impl Trait for Y {}
fn baz() -> impl Trait {
fn foo() -> impl Trait {
if true {
S
} else {
@ -18,4 +18,11 @@ fn baz() -> impl Trait {
}
}
fn bar() -> impl Trait {
match true {
true => S,
false => Y, //~ ERROR `match` arms have incompatible types
}
}
fn main() {}

View file

@ -12,7 +12,7 @@ LL | | }
|
help: you could change the return type to be a boxed trait object
|
LL | fn baz() -> Box<dyn Trait> {
LL | fn foo() -> Box<dyn Trait> {
| ~~~~~~~ +
help: if you change the return type to expect trait objects, box the returned expressions
|
@ -21,6 +21,27 @@ LL | } else {
LL ~ Box::new(Y)
|
error: aborting due to previous error
error[E0308]: `match` arms have incompatible types
--> $DIR/suggest-boxed-trait-objects-instead-of-impl-trait.rs:24:18
|
LL | / match true {
LL | | true => S,
| | - this is found to be of type `S`
LL | | false => Y,
| | ^ expected struct `S`, found struct `Y`
LL | | }
| |_____- `match` arms have incompatible types
|
help: you could change the return type to be a boxed trait object
|
LL | fn bar() -> Box<dyn Trait> {
| ~~~~~~~ +
help: if you change the return type to expect trait objects, box the returned expressions
|
LL ~ true => Box::new(S),
LL ~ false => Box::new(Y),
|
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0308`.