Skip to content

Commit c60c0cb

Browse files
committed
add tests
1 parent 3f85ff4 commit c60c0cb

File tree

3 files changed

+108
-4
lines changed

3 files changed

+108
-4
lines changed

src/test/ui/try-block/try-block-bad-type.stderr

+4-4
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,18 @@ LL | let res: Result<i32, i32> = try { };
3232
found type `()`
3333

3434
error[E0277]: the trait bound `(): std::ops::Try` is not satisfied
35-
--> $DIR/try-block-bad-type.rs:17:23
35+
--> $DIR/try-block-bad-type.rs:17:25
3636
|
3737
LL | let res: () = try { };
38-
| ^^^ the trait `std::ops::Try` is not implemented for `()`
38+
| ^ the trait `std::ops::Try` is not implemented for `()`
3939
|
4040
= note: required by `std::ops::Try::from_ok`
4141

4242
error[E0277]: the trait bound `i32: std::ops::Try` is not satisfied
43-
--> $DIR/try-block-bad-type.rs:19:24
43+
--> $DIR/try-block-bad-type.rs:19:26
4444
|
4545
LL | let res: i32 = try { 5 };
46-
| ^^^^^ the trait `std::ops::Try` is not implemented for `i32`
46+
| ^ the trait `std::ops::Try` is not implemented for `i32`
4747
|
4848
= note: required by `std::ops::Try::from_ok`
4949

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// Test unreachable_code lint for `try {}` block ok-wrapping. See issues #54165, #63324.
2+
3+
// compile-flags: --edition 2018
4+
// check-pass
5+
#![feature(try_blocks)]
6+
#![warn(unreachable_code)]
7+
8+
fn err() -> Result<u32, ()> {
9+
Err(())
10+
}
11+
12+
// In the following cases unreachable code is autogenerated and should not be reported.
13+
14+
fn test_ok_wrapped_divergent_expr_1() {
15+
let res: Result<u32, ()> = try {
16+
loop {
17+
err()?;
18+
}
19+
};
20+
println!("res: {:?}", res);
21+
}
22+
23+
fn test_ok_wrapped_divergent_expr_2() {
24+
let _: Result<u32, ()> = try {
25+
return
26+
};
27+
}
28+
29+
fn test_autogenerated_unit_after_divergent_expr() {
30+
let _: Result<(), ()> = try {
31+
return;
32+
};
33+
}
34+
35+
// In the following cases unreachable code should be reported.
36+
37+
fn test_try_block_after_divergent_stmt() {
38+
let _: Result<u32, ()> = {
39+
return;
40+
41+
try {
42+
loop {
43+
err()?;
44+
}
45+
}
46+
// ~^^^^^ WARNING unreachable expression
47+
};
48+
}
49+
50+
fn test_wrapped_divergent_expr() {
51+
let _: Result<u32, ()> = {
52+
Err(return)
53+
// ~^ WARNING unreachable call
54+
};
55+
}
56+
57+
fn test_expr_after_divergent_stmt_in_try_block() {
58+
let res: Result<u32, ()> = try {
59+
loop {
60+
err()?;
61+
}
62+
63+
42
64+
// ~^ WARNING unreachable expression
65+
};
66+
println!("res: {:?}", res);
67+
}
68+
69+
fn main() {
70+
test_ok_wrapped_divergent_expr_1();
71+
test_ok_wrapped_divergent_expr_2();
72+
test_autogenerated_unit_after_divergent_expr();
73+
test_try_block_after_divergent_stmt();
74+
test_wrapped_divergent_expr();
75+
test_expr_after_divergent_stmt_in_try_block();
76+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
warning: unreachable expression
2+
--> $DIR/try-block-unreachable-code-lint.rs:41:9
3+
|
4+
LL | / try {
5+
LL | | loop {
6+
LL | | err()?;
7+
LL | | }
8+
LL | | }
9+
| |_________^
10+
|
11+
note: lint level defined here
12+
--> $DIR/try-block-unreachable-code-lint.rs:6:9
13+
|
14+
LL | #![warn(unreachable_code)]
15+
| ^^^^^^^^^^^^^^^^
16+
17+
warning: unreachable call
18+
--> $DIR/try-block-unreachable-code-lint.rs:52:9
19+
|
20+
LL | Err(return)
21+
| ^^^
22+
23+
warning: unreachable expression
24+
--> $DIR/try-block-unreachable-code-lint.rs:63:9
25+
|
26+
LL | 42
27+
| ^^
28+

0 commit comments

Comments
 (0)