diagnostic: suggest parens when users want logical ops, but get closures

This commit is contained in:
Michael Howell 2022-02-24 17:02:38 -07:00
parent 4b043faba3
commit fd35770e8d
4 changed files with 151 additions and 3 deletions

View file

@ -37,4 +37,31 @@ fn qux() -> u32 {
//~^ ERROR mismatched types
}
fn space_cadet() -> bool {
({ true }) | { true } //~ ERROR E0308
//~^ ERROR expected parameter name
}
fn revenge_from_mars() -> bool {
({ true }) && { true } //~ ERROR E0308
//~^ ERROR mismatched types
}
fn attack_from_mars() -> bool {
({ true }) || { true } //~ ERROR E0308
//~^ ERROR mismatched types
}
// This gets corrected by adding a semicolon, instead of parens.
// It's placed here to help keep track of the way this diagnostic
// needs to interact with type checking to avoid MachineApplicable
// suggestions that actually break stuff.
//
// If you're wondering what happens if that `foo()` is a `true` like
// all the ones above use? Nothing. It makes neither suggestion in
// that case.
fn asteroids() -> impl FnOnce() -> bool {
{ foo(); } || { true } //~ ERROR E0308
}
fn main() {}

View file

@ -37,4 +37,31 @@ fn qux() -> u32 {
//~^ ERROR mismatched types
}
fn space_cadet() -> bool {
{ true } | { true } //~ ERROR E0308
//~^ ERROR expected parameter name
}
fn revenge_from_mars() -> bool {
{ true } && { true } //~ ERROR E0308
//~^ ERROR mismatched types
}
fn attack_from_mars() -> bool {
{ true } || { true } //~ ERROR E0308
//~^ ERROR mismatched types
}
// This gets corrected by adding a semicolon, instead of parens.
// It's placed here to help keep track of the way this diagnostic
// needs to interact with type checking to avoid MachineApplicable
// suggestions that actually break stuff.
//
// If you're wondering what happens if that `foo()` is a `true` like
// all the ones above use? Nothing. It makes neither suggestion in
// that case.
fn asteroids() -> impl FnOnce() -> bool {
{ foo() } || { true } //~ ERROR E0308
}
fn main() {}

View file

@ -44,6 +44,25 @@ LL | _ => 1,
LL ~ }) > 0
|
error: expected parameter name, found `{`
--> $DIR/expr-as-stmt.rs:41:16
|
LL | { true } | { true }
| ^ expected parameter name
|
help: parentheses are required to parse this as an expression
|
LL | ({ true }) | { true }
| + +
error[E0308]: mismatched types
--> $DIR/expr-as-stmt.rs:64:7
|
LL | { foo() } || { true }
| ^^^^^- help: consider using a semicolon here: `;`
| |
| expected `()`, found `i32`
error[E0308]: mismatched types
--> $DIR/expr-as-stmt.rs:8:6
|
@ -121,7 +140,68 @@ help: parentheses are required to parse this as an expression
LL | ({2}) - 2
| + +
error: aborting due to 11 previous errors
error[E0308]: mismatched types
--> $DIR/expr-as-stmt.rs:41:7
|
LL | { true } | { true }
| ^^^^ expected `()`, found `bool`
|
help: you might have meant to return this value
|
LL | { return true; } | { true }
| ++++++ +
error[E0308]: mismatched types
--> $DIR/expr-as-stmt.rs:46:7
|
LL | { true } && { true }
| ^^^^ expected `()`, found `bool`
|
help: you might have meant to return this value
|
LL | { return true; } && { true }
| ++++++ +
error[E0308]: mismatched types
--> $DIR/expr-as-stmt.rs:46:14
|
LL | fn revenge_from_mars() -> bool {
| ---- expected `bool` because of return type
LL | { true } && { true }
| ^^^^^^^^^^^ expected `bool`, found `&&bool`
|
help: parentheses are required to parse this as an expression
|
LL | ({ true }) && { true }
| + +
error[E0308]: mismatched types
--> $DIR/expr-as-stmt.rs:51:7
|
LL | { true } || { true }
| ^^^^ expected `()`, found `bool`
|
help: you might have meant to return this value
|
LL | { return true; } || { true }
| ++++++ +
error[E0308]: mismatched types
--> $DIR/expr-as-stmt.rs:51:14
|
LL | fn attack_from_mars() -> bool {
| ---- expected `bool` because of return type
LL | { true } || { true }
| ^^^^^^^^^^^ expected `bool`, found closure
|
= note: expected type `bool`
found closure `[closure@$DIR/expr-as-stmt.rs:51:14: 51:25]`
help: parentheses are required to parse this as an expression
|
LL | ({ true }) || { true }
| + +
error: aborting due to 18 previous errors
Some errors have detailed explanations: E0308, E0600, E0614.
For more information about an error, try `rustc --explain E0308`.