forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of rust-lang#94974 - c410-f3r:let-chain-dashufwrqwemkf-l…
…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
Showing
2 changed files
with
173 additions
and
0 deletions.
There are no files selected for viewing
54 changes: 54 additions & 0 deletions
54
src/test/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
}; | ||
} | ||
} |
119 changes: 119 additions & 0 deletions
119
...t/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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`. |