Skip to content

Commit

Permalink
Add new tests for compatible variant diagnostics.
Browse files Browse the repository at this point in the history
  • Loading branch information
m-ou-se committed Nov 16, 2021
1 parent 4877756 commit 5a25751
Show file tree
Hide file tree
Showing 2 changed files with 180 additions and 0 deletions.
43 changes: 43 additions & 0 deletions src/test/ui/did_you_mean/compatible-variants.rs
@@ -0,0 +1,43 @@
enum Hey<A, B> {
A(A),
B(B),
}

fn f() {}

fn a() -> Option<()> {
while false {
//~^ ERROR mismatched types
f();
}
//~^ HELP try adding an expression
}

fn b() -> Result<(), ()> {
f()
//~^ ERROR mismatched types
//~| HELP try adding an expression
}

fn main() {
let _: Option<()> = while false {};
//~^ ERROR mismatched types
//~| HELP try wrapping
let _: Option<()> = {
while false {}
//~^ ERROR mismatched types
//~| HELP try adding an expression
};
let _: Result<i32, i32> = 1;
//~^ ERROR mismatched types
//~| HELP try wrapping
let _: Option<i32> = 1;
//~^ ERROR mismatched types
//~| HELP try wrapping
let _: Hey<i32, i32> = 1;
//~^ ERROR mismatched types
//~| HELP try wrapping
let _: Hey<i32, bool> = false;
//~^ ERROR mismatched types
//~| HELP try wrapping
}
137 changes: 137 additions & 0 deletions src/test/ui/did_you_mean/compatible-variants.stderr
@@ -0,0 +1,137 @@
error[E0308]: mismatched types
--> $DIR/compatible-variants.rs:9:5
|
LL | fn a() -> Option<()> {
| ---------- expected `Option<()>` because of return type
LL | / while false {
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]: mismatched types
--> $DIR/compatible-variants.rs:17:5
|
LL | fn b() -> Result<(), ()> {
| -------------- expected `Result<(), ()>` because of return type
LL | f()
| ^^^ expected enum `Result`, found `()`
|
= note: expected enum `Result<(), ()>`
found unit type `()`
help: try adding an expression at the end of the block
|
LL ~ f();
LL + Ok(())
|

error[E0308]: mismatched types
--> $DIR/compatible-variants.rs:23:25
|
LL | let _: Option<()> = while false {};
| ---------- ^^^^^^^^^^^^^^ expected enum `Option`, found `()`
| |
| expected due to this
|
= note: expected enum `Option<()>`
found unit type `()`
help: try wrapping the expression in `Some`
|
LL | let _: Option<()> = Some(while false {});
| +++++ +

error[E0308]: mismatched types
--> $DIR/compatible-variants.rs:27:9
|
LL | while false {}
| ^^^^^^^^^^^^^^ expected enum `Option`, found `()`
|
= note: expected enum `Option<()>`
found unit type `()`
help: try adding an expression at the end of the block
|
LL ~ while false {}
LL + None
|
LL ~ while false {}
LL + Some(())
|

error[E0308]: mismatched types
--> $DIR/compatible-variants.rs:31:31
|
LL | let _: Result<i32, i32> = 1;
| ---------------- ^ expected enum `Result`, found integer
| |
| expected due to this
|
= note: expected enum `Result<i32, i32>`
found type `{integer}`
help: try wrapping the expression in a variant of `Result`
|
LL | let _: Result<i32, i32> = Ok(1);
| +++ +
LL | let _: Result<i32, i32> = Err(1);
| ++++ +

error[E0308]: mismatched types
--> $DIR/compatible-variants.rs:34:26
|
LL | let _: Option<i32> = 1;
| ----------- ^ expected enum `Option`, found integer
| |
| expected due to this
|
= note: expected enum `Option<i32>`
found type `{integer}`
help: try wrapping the expression in `Some`
|
LL | let _: Option<i32> = Some(1);
| +++++ +

error[E0308]: mismatched types
--> $DIR/compatible-variants.rs:37:28
|
LL | let _: Hey<i32, i32> = 1;
| ------------- ^ expected enum `Hey`, found integer
| |
| expected due to this
|
= note: expected enum `Hey<i32, i32>`
found type `{integer}`
help: try wrapping the expression in a variant of `Hey`
|
LL | let _: Hey<i32, i32> = Hey::A(1);
| +++++++ +
LL | let _: Hey<i32, i32> = Hey::B(1);
| +++++++ +

error[E0308]: mismatched types
--> $DIR/compatible-variants.rs:40:29
|
LL | let _: Hey<i32, bool> = false;
| -------------- ^^^^^ expected enum `Hey`, found `bool`
| |
| expected due to this
|
= note: expected enum `Hey<i32, bool>`
found type `bool`
help: try wrapping the expression in `Hey::B`
|
LL | let _: Hey<i32, bool> = Hey::B(false);
| +++++++ +

error: aborting due to 8 previous errors

For more information about this error, try `rustc --explain E0308`.

0 comments on commit 5a25751

Please sign in to comment.