Add more tests for mismatched Option/Result return types.

This commit is contained in:
Mara Bos 2022-01-19 13:11:48 +01:00
parent 003c892f9f
commit 85cc4710ef
2 changed files with 68 additions and 8 deletions

View File

@ -23,6 +23,21 @@ fn b() -> Result<(), ()> {
//~| HELP try adding an expression //~| HELP try adding an expression
} }
fn c() -> Option<()> {
for _ in [1, 2] {
//~^ ERROR mismatched types
f();
}
//~^ HELP try adding an expression
}
fn d() -> Option<()> {
c()?
//~^ ERROR incompatible types
//~| HELP try removing this `?`
//~| HELP try adding an expression
}
fn main() { fn main() {
let _: Option<()> = while false {}; let _: Option<()> = while false {};
//~^ ERROR mismatched types //~^ ERROR mismatched types

View File

@ -37,7 +37,52 @@ LL + Ok(())
| |
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/compatible-variants.rs:27:25 --> $DIR/compatible-variants.rs:27:5
|
LL | fn c() -> Option<()> {
| ---------- expected `Option<()>` because of return type
LL | / for _ in [1, 2] {
LL | |
LL | | f();
LL | | }
| |_____^ expected enum `Option`, found `()`
|
= note: expected enum `Option<()>`
found unit type `()`
help: try adding an expression at the end of the block
|
LL ~ }
LL + None
|
LL ~ }
LL + Some(())
|
error[E0308]: `?` operator has incompatible types
--> $DIR/compatible-variants.rs:35:5
|
LL | c()?
| ^^^^ expected enum `Option`, found `()`
|
= note: `?` operator cannot convert from `()` to `Option<()>`
= note: expected enum `Option<()>`
found unit type `()`
help: try removing this `?`
|
LL - c()?
LL + c()
|
help: try adding an expression at the end of the block
|
LL ~ c()?;
LL + None
|
LL ~ c()?;
LL + Some(())
|
error[E0308]: mismatched types
--> $DIR/compatible-variants.rs:42:25
| |
LL | let _: Option<()> = while false {}; LL | let _: Option<()> = while false {};
| ---------- ^^^^^^^^^^^^^^ expected enum `Option`, found `()` | ---------- ^^^^^^^^^^^^^^ expected enum `Option`, found `()`
@ -52,7 +97,7 @@ LL | let _: Option<()> = Some(while false {});
| +++++ + | +++++ +
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/compatible-variants.rs:31:9 --> $DIR/compatible-variants.rs:46:9
| |
LL | while false {} LL | while false {}
| ^^^^^^^^^^^^^^ expected enum `Option`, found `()` | ^^^^^^^^^^^^^^ expected enum `Option`, found `()`
@ -69,7 +114,7 @@ LL + Some(())
| |
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/compatible-variants.rs:35:31 --> $DIR/compatible-variants.rs:50:31
| |
LL | let _: Result<i32, i32> = 1; LL | let _: Result<i32, i32> = 1;
| ---------------- ^ expected enum `Result`, found integer | ---------------- ^ expected enum `Result`, found integer
@ -86,7 +131,7 @@ LL | let _: Result<i32, i32> = Err(1);
| ++++ + | ++++ +
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/compatible-variants.rs:38:26 --> $DIR/compatible-variants.rs:53:26
| |
LL | let _: Option<i32> = 1; LL | let _: Option<i32> = 1;
| ----------- ^ expected enum `Option`, found integer | ----------- ^ expected enum `Option`, found integer
@ -101,7 +146,7 @@ LL | let _: Option<i32> = Some(1);
| +++++ + | +++++ +
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/compatible-variants.rs:41:28 --> $DIR/compatible-variants.rs:56:28
| |
LL | let _: Hey<i32, i32> = 1; LL | let _: Hey<i32, i32> = 1;
| ------------- ^ expected enum `Hey`, found integer | ------------- ^ expected enum `Hey`, found integer
@ -118,7 +163,7 @@ LL | let _: Hey<i32, i32> = Hey::B(1);
| +++++++ + | +++++++ +
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/compatible-variants.rs:44:29 --> $DIR/compatible-variants.rs:59:29
| |
LL | let _: Hey<i32, bool> = false; LL | let _: Hey<i32, bool> = false;
| -------------- ^^^^^ expected enum `Hey`, found `bool` | -------------- ^^^^^ expected enum `Hey`, found `bool`
@ -133,7 +178,7 @@ LL | let _: Hey<i32, bool> = Hey::B(false);
| +++++++ + | +++++++ +
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/compatible-variants.rs:48:19 --> $DIR/compatible-variants.rs:63:19
| |
LL | let _ = Foo { bar }; LL | let _ = Foo { bar };
| ^^^ expected enum `Option`, found `i32` | ^^^ expected enum `Option`, found `i32`
@ -145,6 +190,6 @@ help: try wrapping the expression in `Some`
LL | let _ = Foo { bar: Some(bar) }; LL | let _ = Foo { bar: Some(bar) };
| ++++++++++ + | ++++++++++ +
error: aborting due to 9 previous errors error: aborting due to 11 previous errors
For more information about this error, try `rustc --explain E0308`. For more information about this error, try `rustc --explain E0308`.