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`.