333388fd3c
There was an incomplete version of the check in parsing and a second version in AST validation. This meant that some, but not all, invalid uses were allowed inside macros/disabled cfgs. It also means that later passes have a hard time knowing when the let expression is in a valid location, sometimes causing ICEs. - Add a field to ExprKind::Let in AST/HIR to mark whether it's in a valid location. - Suppress later errors and MIR construction for invalid let expressions.
55 lines
1.4 KiB
Rust
55 lines
1.4 KiB
Rust
#![feature(let_chains)]
|
|
|
|
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 mismatched types
|
|
//~| ERROR mismatched types
|
|
//~| ERROR expected expression, found `let` statement
|
|
return;
|
|
};
|
|
|
|
if let Some(n) = opt else {
|
|
//~^ ERROR this `if` expression is missing a block after the condition
|
|
return;
|
|
};
|
|
if let Some(n) = opt && n == 1 else {
|
|
//~^ ERROR this `if` expression is missing a block after the condition
|
|
return;
|
|
};
|
|
if let Some(n) = opt && let another = n else {
|
|
//~^ ERROR this `if` expression is missing a block after the condition
|
|
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;
|
|
};
|
|
}
|
|
}
|