Add let-else tests · rust-lang/rust@5b95df4 (original) (raw)
17 files changed
lines changed
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
1 | +// run-rustfix | |
2 | + | |
3 | +#![feature(let_else)] | |
4 | + | |
5 | +fn main() { | |
6 | + let true = (true && false) else { return }; //~ ERROR a `&&` expression cannot be directly assigned in `let...else` | |
7 | + let true = (true | | |
8 | +} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
1 | +// run-rustfix | |
2 | + | |
3 | +#![feature(let_else)] | |
4 | + | |
5 | +fn main() { | |
6 | +let true = true && false else { return }; //~ ERROR a `&&` expression cannot be directly assigned in `let...else` | |
7 | +let true = true | | |
8 | +} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
1 | +error: a `&&` expression cannot be directly assigned in `let...else` | |
2 | + --> $DIR/let-else-bool-binop-init.rs:6:16 | |
3 | + | | |
4 | +LL | let true = true && false else { return }; | |
5 | + | ^^^^^^^^^^^^^ | |
6 | + | | |
7 | +help: wrap the expression in parenthesis | |
8 | + | | |
9 | +LL | let true = (true && false) else { return }; | |
10 | + | + + | |
11 | + | |
12 | +error: a `| | |
13 | + --> $DIR/let-else-bool-binop-init.rs:7:16 | |
14 | + | | |
15 | +LL | let true = true | |
16 | + | ^^^^^^^^^^^^^ | |
17 | + | | |
18 | +help: wrap the expression in parenthesis | |
19 | + | | |
20 | +LL | let true = (true | |
21 | + | + + | |
22 | + | |
23 | +error: aborting due to 2 previous errors | |
24 | + |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
1 | +// run-rustfix | |
2 | + | |
3 | +#![feature(let_else)] | |
4 | + | |
5 | +fn main() { | |
6 | + let Some(1) = ({ Some(1) }) else { | |
7 | + //~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed | |
8 | + return; | |
9 | + }; | |
10 | + let Some(1) = (loop { break Some(1) }) else { | |
11 | + //~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed | |
12 | + return; | |
13 | + }; | |
14 | + let 2 = 1 + (match 1 { n => n }) else { | |
15 | + //~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed | |
16 | + return; | |
17 | + }; | |
18 | + let Some(1) = (unsafe { unsafe_fn() }) else { | |
19 | + //~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed | |
20 | + return; | |
21 | + }; | |
22 | +} | |
23 | + | |
24 | +unsafe fn unsafe_fn() -> T { | |
25 | + unimplemented!(); | |
26 | +} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
1 | +// run-rustfix | |
2 | + | |
3 | +#![feature(let_else)] | |
4 | + | |
5 | +fn main() { | |
6 | +let Some(1) = { Some(1) } else { | |
7 | +//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed | |
8 | +return; | |
9 | +}; | |
10 | +let Some(1) = loop { break Some(1) } else { | |
11 | +//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed | |
12 | +return; | |
13 | +}; | |
14 | +let 2 = 1 + match 1 { n => n } else { | |
15 | +//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed | |
16 | +return; | |
17 | +}; | |
18 | +let Some(1) = unsafe { unsafe_fn() } else { | |
19 | +//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed | |
20 | +return; | |
21 | +}; | |
22 | +} | |
23 | + | |
24 | +unsafe fn unsafe_fn<T>() -> T { | |
25 | +unimplemented!(); | |
26 | +} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
1 | +error: right curly brace `}` before `else` in a `let...else` statement not allowed | |
2 | + --> $DIR/let-else-brace-before-else.rs:6:29 | |
3 | + | | |
4 | +LL | let Some(1) = { Some(1) } else { | |
5 | + | ^ | |
6 | + | | |
7 | +help: try wrapping the expression in parenthesis | |
8 | + | | |
9 | +LL | let Some(1) = ({ Some(1) }) else { | |
10 | + | + + | |
11 | + | |
12 | +error: right curly brace `}` before `else` in a `let...else` statement not allowed | |
13 | + --> $DIR/let-else-brace-before-else.rs:10:40 | |
14 | + | | |
15 | +LL | let Some(1) = loop { break Some(1) } else { | |
16 | + | ^ | |
17 | + | | |
18 | +help: try wrapping the expression in parenthesis | |
19 | + | | |
20 | +LL | let Some(1) = (loop { break Some(1) }) else { | |
21 | + | + + | |
22 | + | |
23 | +error: right curly brace `}` before `else` in a `let...else` statement not allowed | |
24 | + --> $DIR/let-else-brace-before-else.rs:14:34 | |
25 | + | | |
26 | +LL | let 2 = 1 + match 1 { n => n } else { | |
27 | + | ^ | |
28 | + | | |
29 | +help: try wrapping the expression in parenthesis | |
30 | + | | |
31 | +LL | let 2 = 1 + (match 1 { n => n }) else { | |
32 | + | + + | |
33 | + | |
34 | +error: right curly brace `}` before `else` in a `let...else` statement not allowed | |
35 | + --> $DIR/let-else-brace-before-else.rs🔞40 | |
36 | + | | |
37 | +LL | let Some(1) = unsafe { unsafe_fn() } else { | |
38 | + | ^ | |
39 | + | | |
40 | +help: try wrapping the expression in parenthesis | |
41 | + | | |
42 | +LL | let Some(1) = (unsafe { unsafe_fn() }) else { | |
43 | + | + + | |
44 | + | |
45 | +error: aborting due to 4 previous errors | |
46 | + |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
1 | +#![feature(let_else)] | |
2 | + | |
3 | +#![deny(unused_variables)] | |
4 | + | |
5 | +fn main() { | |
6 | +// type annotation, attributes | |
7 | +#[allow(unused_variables)] | |
8 | +let Some(_): Option<u32> = Some(Default::default()) else { | |
9 | +let x = 1; // OK | |
10 | +return; | |
11 | +}; | |
12 | + | |
13 | +let x = 1; //~ ERROR unused variable: `x` | |
14 | +} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
1 | +error: unused variable: `x` | |
2 | + --> $DIR/let-else-check.rs:13:9 | |
3 | + | | |
4 | +LL | let x = 1; | |
5 | + | ^ help: if this is intentional, prefix it with an underscore: `_x` | |
6 | + | | |
7 | +note: the lint level is defined here | |
8 | + --> $DIR/let-else-check.rs:3:9 | |
9 | + | | |
10 | +LL | #![deny(unused_variables)] | |
11 | + | ^^^^^^^^^^^^^^^^ | |
12 | + | |
13 | +error: aborting due to previous error | |
14 | + |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
1 | +// check-pass | |
2 | + | |
3 | +#![feature(let_else)] | |
4 | + | |
5 | +fn main() { | |
6 | +let x = 1 else { return }; //~ WARN irrefutable `let...else` pattern | |
7 | +} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
1 | +warning: irrefutable `let...else` pattern | |
2 | + --> $DIR/let-else-irrefutable.rs:6:5 | |
3 | + | | |
4 | +LL | let x = 1 else { return }; | |
5 | + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
6 | + | | |
7 | + = note: `#[warn(irrefutable_let_patterns)]` on by default | |
8 | + = note: this pattern will always match, so the `else` clause is useless | |
9 | + = help: consider removing the `else` clause | |
10 | + | |
11 | +warning: 1 warning emitted | |
12 | + |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
1 | +#![feature(let_else)] | |
2 | + | |
3 | +fn main() { | |
4 | +let Some(x) = Some(1) else { | |
5 | +return; | |
6 | +} //~ ERROR expected `;`, found keyword `let` | |
7 | +let _ = ""; | |
8 | +let Some(x) = Some(1) else { | |
9 | +panic!(); | |
10 | +} //~ ERROR expected `;`, found `}` | |
11 | +} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
1 | +error: expected `;`, found keyword `let` | |
2 | + --> $DIR/let-else-missing-semicolon.rs:6:6 | |
3 | + | | |
4 | +LL | } | |
5 | + | ^ help: add `;` here | |
6 | +LL | let _ = ""; | |
7 | + | --- unexpected token | |
8 | + | |
9 | +error: expected `;`, found `}` | |
10 | + --> $DIR/let-else-missing-semicolon.rs:10:6 | |
11 | + | | |
12 | +LL | } | |
13 | + | ^ help: add `;` here | |
14 | +LL | } | |
15 | + | - unexpected token | |
16 | + | |
17 | +error: aborting due to 2 previous errors | |
18 | + |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
1 | +#![feature(let_else)] | |
2 | + | |
3 | +fn main() { | |
4 | +let Some(x) = Some(1) else { //~ ERROR does not diverge | |
5 | +Some(2) | |
6 | +}; | |
7 | +let Some(x) = Some(1) else { //~ ERROR does not diverge | |
8 | +if 1 == 1 { | |
9 | +panic!(); | |
10 | +} | |
11 | +}; | |
12 | +let Some(x) = Some(1) else { Some(2) }; //~ ERROR does not diverge | |
13 | +} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
1 | +error[E0308]: `else` clause of `let...else` does not diverge | |
2 | + --> $DIR/let-else-non-diverging.rs:12:32 | |
3 | + | | |
4 | +LL | let Some(x) = Some(1) else { Some(2) }; | |
5 | + | ^^^^^^^^^^^ expected `!`, found enum `Option` | |
6 | + | | |
7 | + = note: expected type `!` | |
8 | + found type `Option<{integer}>` | |
9 | + = help: try adding a diverging expression, such as `return` or `panic!(..)` | |
10 | + = help: ...or use `match` instead of `let...else` | |
11 | + | |
12 | +error[E0308]: `else` clause of `let...else` does not diverge | |
13 | + --> $DIR/let-else-non-diverging.rs:7:32 | |
14 | + | | |
15 | +LL | let Some(x) = Some(1) else { | |
16 | + | ________________________________^ | |
17 | +LL | | |
18 | +LL | | |
19 | +LL | | |
20 | +LL | | |
21 | + | | |
22 | + | | |
23 | + = note: expected type `!` | |
24 | + found type `()` | |
25 | + = help: try adding a diverging expression, such as `return` or `panic!(..)` | |
26 | + = help: ...or use `match` instead of `let...else` | |
27 | + | |
28 | +error[E0308]: `else` clause of `let...else` does not diverge | |
29 | + --> $DIR/let-else-non-diverging.rs:4:32 | |
30 | + | | |
31 | +LL | let Some(x) = Some(1) else { | |
32 | + | ________________________________^ | |
33 | +LL | | |
34 | +LL | | |
35 | + | | |
36 | + | | |
37 | + = note: expected type `!` | |
38 | + found type `Option<{integer}>` | |
39 | + = help: try adding a diverging expression, such as `return` or `panic!(..)` | |
40 | + = help: ...or use `match` instead of `let...else` | |
41 | + | |
42 | +error: aborting due to 3 previous errors | |
43 | + | |
44 | +For more information about this error, try `rustc --explain E0308`. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
1 | +// run-pass | |
2 | + | |
3 | +#![feature(let_else)] | |
4 | + | |
5 | +fn main() { | |
6 | +#[allow(dead_code)] | |
7 | +enum MyEnum { | |
8 | +A(String), | |
9 | +B { f: String }, | |
10 | +C, | |
11 | +} | |
12 | +// ref binding to non-copy value and or-pattern | |
13 | +let (MyEnum::A(ref x) | MyEnum::B { f: ref x }) = (MyEnum::B { f: String::new() }) else { | |
14 | +panic!(); | |
15 | +}; | |
16 | +assert_eq!(x, ""); | |
17 | + | |
18 | +// nested let-else | |
19 | +let mut x = 1; | |
20 | +loop { | |
21 | +let 4 = x else { | |
22 | +let 3 = x else { | |
23 | + x += 1; | |
24 | +continue; | |
25 | +}; | |
26 | +break; | |
27 | +}; | |
28 | +panic!(); | |
29 | +} | |
30 | +assert_eq!(x, 3); | |
31 | + | |
32 | +// else return | |
33 | +let Some(1) = Some(2) else { return }; | |
34 | +panic!(); | |
35 | +} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
1 | +#![feature(let_else)] | |
2 | + | |
3 | +fn main() { | |
4 | +let Some(x) = Some(2) else { | |
5 | +panic!("{}", x); //~ ERROR cannot find value `x` in this scope | |
6 | +}; | |
7 | +} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
1 | +error[E0425]: cannot find value `x` in this scope | |
2 | + --> $DIR/let-else-scope.rs:5:22 | |
3 | + | | |
4 | +LL | panic!("{}", x); | |
5 | + | ^ not found in this scope | |
6 | + | |
7 | +error: aborting due to previous error | |
8 | + | |
9 | +For more information about this error, try `rustc --explain E0425`. |