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:
commit
3efbf30220
6 changed files with 192 additions and 2 deletions
59
src/test/ui/parser/issue-103381.fixed
Normal file
59
src/test/ui/parser/issue-103381.fixed
Normal 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() {}
|
||||
59
src/test/ui/parser/issue-103381.rs
Normal file
59
src/test/ui/parser/issue-103381.rs
Normal 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() {}
|
||||
50
src/test/ui/parser/issue-103381.stderr
Normal file
50
src/test/ui/parser/issue-103381.stderr
Normal 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
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue