Skip to content

Commit

Permalink
Rollup merge of rust-lang#94974 - c410-f3r:let-chain-dashufwrqwemkf-l…
Browse files Browse the repository at this point in the history
…et-else, r=joshtriplett

Ensure that `let_else` does not interact with `let_chains`

As requested on rust-lang#94927.

cc `@joshtriplett` `@estebank`
  • Loading branch information
Dylan-DPC authored Mar 16, 2022
2 parents 0732ea2 + 261d5fc commit aaf2255
Show file tree
Hide file tree
Showing 2 changed files with 173 additions and 0 deletions.
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`.

0 comments on commit aaf2255

Please sign in to comment.