Auto merge of #12206 - y21:issue12205, r=Alexendoo
[`never_loop`]: recognize desugared `try` blocks Fixes #12205 The old code assumed that only blocks with an explicit label can be jumped to (using `break`). This is mostly correct except for `try` desugaring, where the `?` operator is rewritten to a `break` to that block, even without a label on the block. `Block::targeted_by_break` is a little more accurate than just checking if a block has a label in that regard, so we should just use that instead changelog: [`never_loop`]: avoid linting when `?` is used inside of a try block
This commit is contained in:
commit
18e1f25a9f
@ -201,12 +201,12 @@ fn never_loop_expr<'tcx>(
|
||||
})
|
||||
})
|
||||
},
|
||||
ExprKind::Block(b, l) => {
|
||||
if l.is_some() {
|
||||
ExprKind::Block(b, _) => {
|
||||
if b.targeted_by_break {
|
||||
local_labels.push((b.hir_id, false));
|
||||
}
|
||||
let ret = never_loop_block(cx, b, local_labels, main_loop_id);
|
||||
let jumped_to = l.is_some() && local_labels.pop().unwrap().1;
|
||||
let jumped_to = b.targeted_by_break && local_labels.pop().unwrap().1;
|
||||
match ret {
|
||||
NeverLoopResult::Diverging if jumped_to => NeverLoopResult::Normal,
|
||||
_ => ret,
|
||||
|
@ -1,4 +1,4 @@
|
||||
#![feature(inline_const)]
|
||||
#![feature(inline_const, try_blocks)]
|
||||
#![allow(
|
||||
clippy::eq_op,
|
||||
clippy::single_match,
|
||||
@ -400,6 +400,15 @@ pub fn test32() {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn issue12205() -> Option<()> {
|
||||
loop {
|
||||
let _: Option<_> = try {
|
||||
None?;
|
||||
return Some(());
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
test1();
|
||||
test2();
|
||||
|
Loading…
x
Reference in New Issue
Block a user