77 lines
1.6 KiB
Rust
77 lines
1.6 KiB
Rust
// Test unreachable_code lint for `try {}` block ok-wrapping. See issues #54165, #63324.
|
|
|
|
//@ compile-flags: --edition 2018
|
|
//@ check-pass
|
|
#![feature(try_blocks)]
|
|
#![warn(unreachable_code)]
|
|
|
|
fn err() -> Result<u32, ()> {
|
|
Err(())
|
|
}
|
|
|
|
// In the following cases unreachable code is autogenerated and should not be reported.
|
|
|
|
fn test_ok_wrapped_divergent_expr_1() {
|
|
let res: Result<u32, ()> = try {
|
|
loop {
|
|
err()?;
|
|
}
|
|
};
|
|
println!("res: {:?}", res);
|
|
}
|
|
|
|
fn test_ok_wrapped_divergent_expr_2() {
|
|
let _: Result<u32, ()> = try {
|
|
return
|
|
};
|
|
}
|
|
|
|
fn test_autogenerated_unit_after_divergent_expr() {
|
|
let _: Result<(), ()> = try {
|
|
return;
|
|
};
|
|
}
|
|
|
|
// In the following cases unreachable code should be reported.
|
|
|
|
fn test_try_block_after_divergent_stmt() {
|
|
let _: Result<u32, ()> = {
|
|
return;
|
|
|
|
try {
|
|
loop {
|
|
err()?;
|
|
}
|
|
}
|
|
//~^^^^^ WARNING unreachable expression
|
|
};
|
|
}
|
|
|
|
fn test_wrapped_divergent_expr() {
|
|
let _: Result<u32, ()> = {
|
|
Err(return)
|
|
//~^ WARNING unreachable call
|
|
};
|
|
}
|
|
|
|
fn test_expr_after_divergent_stmt_in_try_block() {
|
|
let res: Result<u32, ()> = try {
|
|
loop {
|
|
err()?;
|
|
}
|
|
|
|
42
|
|
//~^ WARNING unreachable expression
|
|
};
|
|
println!("res: {:?}", res);
|
|
}
|
|
|
|
fn main() {
|
|
test_ok_wrapped_divergent_expr_1();
|
|
test_ok_wrapped_divergent_expr_2();
|
|
test_autogenerated_unit_after_divergent_expr();
|
|
test_try_block_after_divergent_stmt();
|
|
test_wrapped_divergent_expr();
|
|
test_expr_after_divergent_stmt_in_try_block();
|
|
}
|