Skip to content

Commit 5b95df4

Browse files
committed
Add let-else tests
1 parent df9a2e0 commit 5b95df4

17 files changed

+322
-0
lines changed
Original file line numberDiff line numberDiff 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 || false) else { return }; //~ ERROR a `||` expression cannot be directly assigned in `let...else`
8+
}
Original file line numberDiff line numberDiff 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 || false else { return }; //~ ERROR a `||` expression cannot be directly assigned in `let...else`
8+
}
Original file line numberDiff line numberDiff 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 `||` expression cannot be directly assigned in `let...else`
13+
--> $DIR/let-else-bool-binop-init.rs:7:16
14+
|
15+
LL | let true = true || false else { return };
16+
| ^^^^^^^^^^^^^
17+
|
18+
help: wrap the expression in parenthesis
19+
|
20+
LL | let true = (true || false) else { return };
21+
| + +
22+
23+
error: aborting due to 2 previous errors
24+
Original file line numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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:18: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+
+14
Original file line numberDiff line numberDiff 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+
}
+14
Original file line numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 | | if 1 == 1 {
18+
LL | | panic!();
19+
LL | | }
20+
LL | | };
21+
| |_____^ expected `!`, found `()`
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 | | Some(2)
34+
LL | | };
35+
| |_____^ expected `!`, found enum `Option`
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`.
+35
Original file line numberDiff line numberDiff 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+
}
+7
Original file line numberDiff line numberDiff 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 numberDiff line numberDiff 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`.

0 commit comments

Comments
 (0)