X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;ds=sidebyside;f=compiler%2Frustc_mir_build%2Fsrc%2Flints.rs;h=b21ca6028a221510c20d5a2be8f4bb4507996ef7;hb=10b722cc79c52a242d8671243b46e0319296cb30;hp=e4c2d2dce67c7d3883b5614c3e23599a74626e59;hpb=14ef447d1237a2534f3acc19a2f986b217ef274d;p=rust.git diff --git a/compiler/rustc_mir_build/src/lints.rs b/compiler/rustc_mir_build/src/lints.rs index e4c2d2dce67..b21ca6028a2 100644 --- a/compiler/rustc_mir_build/src/lints.rs +++ b/compiler/rustc_mir_build/src/lints.rs @@ -11,9 +11,8 @@ crate fn check<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>) { let def_id = body.source.def_id().expect_local(); - let hir_id = tcx.hir().local_def_id_to_hir_id(def_id); - if let Some(fn_kind) = tcx.hir().get(hir_id).fn_kind() { + if let Some(fn_kind) = tcx.hir().get_by_def_id(def_id).fn_kind() { if let FnKind::Closure = fn_kind { // closures can't recur, so they don't matter. return; @@ -34,6 +33,9 @@ if let Some(NonRecursive) = TriColorDepthFirstSearch::new(&body).run_from_start(&mut vis) { return; } + if vis.reachable_recursive_calls.is_empty() { + return; + } vis.reachable_recursive_calls.sort(); @@ -149,13 +151,14 @@ fn node_settled(&mut self, bb: BasicBlock) -> ControlFlow { } fn ignore_edge(&mut self, bb: BasicBlock, target: BasicBlock) -> bool { + let terminator = self.body[bb].terminator(); + if terminator.unwind() == Some(&Some(target)) && terminator.successors().count() > 1 { + return true; + } // Don't traverse successors of recursive calls or false CFG edges. match self.body[bb].terminator().kind { TerminatorKind::Call { ref func, .. } => self.is_recursive_call(func), - - TerminatorKind::FalseUnwind { unwind: Some(imaginary_target), .. } - | TerminatorKind::FalseEdge { imaginary_target, .. } => imaginary_target == target, - + TerminatorKind::FalseEdge { imaginary_target, .. } => imaginary_target == target, _ => false, } }