Rollup merge of #103405 - chenyukang:yukang/fix-103381-and-if, r=compiler-errors

Detect incorrect chaining of if and if let conditions and recover

Fixes #103381
This commit is contained in:
Matthias Krüger 2022-11-18 14:13:36 +01:00 committed by GitHub
commit 3efbf30220
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 192 additions and 2 deletions

View file

@ -0,0 +1,59 @@
// run-rustfix
#![feature(let_chains)]
#![allow(unused_variables)]
#![allow(dead_code)]
#![allow(irrefutable_let_patterns)]
fn err_some(b: bool, x: Option<u32>) {
if b && let Some(x) = x {}
//~^ ERROR unexpected `if` in the condition expression
}
fn err_none(b: bool, x: Option<u32>) {
if b && let None = x {}
//~^ ERROR unexpected `if` in the condition expression
}
fn err_bool_1() {
if true && true { true } else { false };
//~^ ERROR unexpected `if` in the condition expression
}
fn err_bool_2() {
if true && false { true } else { false };
//~^ ERROR unexpected `if` in the condition expression
}
fn should_ok_1() {
if true && if let x = 1 { true } else { true } {}
}
fn should_ok_2() {
if true && if let 1 = 1 { true } else { true } {}
}
fn should_ok_3() {
if true && if true { true } else { false } {}
}
fn shoule_match_ok() {
#[cfg(feature = "full")]
{
let a = 1;
let b = 2;
if match a {
1 if b == 1 => true,
_ => false,
} && if a > 1 { true } else { false }
{
true
}
}
}
fn should_ok_in_nested() {
if true && if true { true } else { false } { true } else { false };
}
fn main() {}

View file

@ -0,0 +1,59 @@
// run-rustfix
#![feature(let_chains)]
#![allow(unused_variables)]
#![allow(dead_code)]
#![allow(irrefutable_let_patterns)]
fn err_some(b: bool, x: Option<u32>) {
if b && if let Some(x) = x {}
//~^ ERROR unexpected `if` in the condition expression
}
fn err_none(b: bool, x: Option<u32>) {
if b && if let None = x {}
//~^ ERROR unexpected `if` in the condition expression
}
fn err_bool_1() {
if true && if true { true } else { false };
//~^ ERROR unexpected `if` in the condition expression
}
fn err_bool_2() {
if true && if false { true } else { false };
//~^ ERROR unexpected `if` in the condition expression
}
fn should_ok_1() {
if true && if let x = 1 { true } else { true } {}
}
fn should_ok_2() {
if true && if let 1 = 1 { true } else { true } {}
}
fn should_ok_3() {
if true && if true { true } else { false } {}
}
fn shoule_match_ok() {
#[cfg(feature = "full")]
{
let a = 1;
let b = 2;
if match a {
1 if b == 1 => true,
_ => false,
} && if a > 1 { true } else { false }
{
true
}
}
}
fn should_ok_in_nested() {
if true && if true { true } else { false } { true } else { false };
}
fn main() {}

View file

@ -0,0 +1,50 @@
error: unexpected `if` in the condition expression
--> $DIR/issue-103381.rs:9:12
|
LL | if b && if let Some(x) = x {}
| ^^^^
|
help: remove the `if`
|
LL - if b && if let Some(x) = x {}
LL + if b && let Some(x) = x {}
|
error: unexpected `if` in the condition expression
--> $DIR/issue-103381.rs:14:12
|
LL | if b && if let None = x {}
| ^^^^
|
help: remove the `if`
|
LL - if b && if let None = x {}
LL + if b && let None = x {}
|
error: unexpected `if` in the condition expression
--> $DIR/issue-103381.rs:19:15
|
LL | if true && if true { true } else { false };
| ^^^^
|
help: remove the `if`
|
LL - if true && if true { true } else { false };
LL + if true && true { true } else { false };
|
error: unexpected `if` in the condition expression
--> $DIR/issue-103381.rs:24:15
|
LL | if true && if false { true } else { false };
| ^^^^
|
help: remove the `if`
|
LL - if true && if false { true } else { false };
LL + if true && false { true } else { false };
|
error: aborting due to 4 previous errors