fix wrong suggestions for boxed trait objects instead of impl trait
This commit is contained in:
parent
fc43bd60c0
commit
82f2c08200
7 changed files with 122 additions and 31 deletions
|
|
@ -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() {}
|
||||
|
|
@ -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`.
|
||||
|
|
@ -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() {}
|
||||
|
|
|
|||
|
|
@ -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() {}
|
||||
|
|
|
|||
|
|
@ -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`.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue