Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ensure that let_else does not interact with let_chains #94974

Merged
merged 1 commit into from
Mar 16, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#![feature(let_chains, let_else)]

fn main() {
let opt = Some(1i32);

let Some(n) = opt else {
return;
};
let Some(n) = opt && n == 1 else {
//~^ ERROR a `&&` expression cannot be directly assigned in `let...else`
//~| ERROR mismatched types
//~| ERROR mismatched types
return;
};
let Some(n) = opt && let another = n else {
//~^ ERROR a `&&` expression cannot be directly assigned in `let...else`
//~| ERROR `let` expressions are not supported here
//~| ERROR mismatched types
//~| ERROR mismatched types
return;
};

if let Some(n) = opt else {
//~^ ERROR missing condition for `if` expression
return;
};
if let Some(n) = opt && n == 1 else {
//~^ ERROR missing condition for `if` expression
return;
};
if let Some(n) = opt && let another = n else {
//~^ ERROR missing condition for `if` expression
return;
};

{
while let Some(n) = opt else {
//~^ ERROR expected `{`, found keyword `else`
return;
};
}
{
while let Some(n) = opt && n == 1 else {
//~^ ERROR expected `{`, found keyword `else`
return;
};
}
{
while let Some(n) = opt && let another = n else {
//~^ ERROR expected `{`, found keyword `else`
return;
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
error: a `&&` expression cannot be directly assigned in `let...else`
--> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:9:19
|
LL | let Some(n) = opt && n == 1 else {
| ^^^^^^^^^^^^^
|
help: wrap the expression in parentheses
|
LL | let Some(n) = (opt && n == 1) else {
| + +

error: a `&&` expression cannot be directly assigned in `let...else`
--> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:15:19
|
LL | let Some(n) = opt && let another = n else {
| ^^^^^^^^^^^^^^^^^^^^^^
|
help: wrap the expression in parentheses
|
LL | let Some(n) = (opt && let another = n) else {
| + +

error: missing condition for `if` expression
--> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:23:7
|
LL | if let Some(n) = opt else {
| ^ expected if condition here

error: missing condition for `if` expression
--> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:27:7
|
LL | if let Some(n) = opt && n == 1 else {
| ^ expected if condition here

error: missing condition for `if` expression
--> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:31:7
|
LL | if let Some(n) = opt && let another = n else {
| ^ expected if condition here

error: expected `{`, found keyword `else`
--> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:37:33
|
LL | while let Some(n) = opt else {
| ----- ----------------- ^^^^ expected `{`
| | |
| | this `while` condition successfully parsed
| while parsing the body of this `while` expression

error: expected `{`, found keyword `else`
--> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:43:43
|
LL | while let Some(n) = opt && n == 1 else {
| ----- --------------------------- ^^^^ expected `{`
| | |
| | this `while` condition successfully parsed
| while parsing the body of this `while` expression

error: expected `{`, found keyword `else`
--> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:49:52
|
LL | while let Some(n) = opt && let another = n else {
| ----- ------------------------------------ ^^^^ expected `{`
| | |
| | this `while` condition successfully parsed
| while parsing the body of this `while` expression

error: `let` expressions are not supported here
--> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:15:26
|
LL | let Some(n) = opt && let another = n else {
| ^^^^^^^^^^^^^^^
|
= note: only supported directly in conditions of `if` and `while` expressions
= note: as well as when nested within `&&` and parentheses in those conditions

error[E0308]: mismatched types
--> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:9:19
|
LL | let Some(n) = opt && n == 1 else {
| ^^^ expected `bool`, found enum `Option`
|
= note: expected type `bool`
found enum `Option<i32>`

error[E0308]: mismatched types
--> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:9:9
|
LL | let Some(n) = opt && n == 1 else {
| ^^^^^^^ ------------- this expression has type `bool`
| |
| expected `bool`, found enum `Option`
|
= note: expected type `bool`
found enum `Option<_>`

error[E0308]: mismatched types
--> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:15:19
|
LL | let Some(n) = opt && let another = n else {
| ^^^ expected `bool`, found enum `Option`
|
= note: expected type `bool`
found enum `Option<i32>`

error[E0308]: mismatched types
--> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:15:9
|
LL | let Some(n) = opt && let another = n else {
| ^^^^^^^ ---------------------- this expression has type `bool`
| |
| expected `bool`, found enum `Option`
|
= note: expected type `bool`
found enum `Option<_>`

error: aborting due to 13 previous errors

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