Skip to content

Commit 956e5c1

Browse files
committed
Move lint_never_type_fallback_flowing_into_unsafe_code into a separate fn
1 parent 1a73979 commit 956e5c1

File tree

1 file changed

+40
-35
lines changed

1 file changed

+40
-35
lines changed

compiler/rustc_hir_typeck/src/fallback.rs

+40-35
Original file line numberDiff line numberDiff line change
@@ -364,41 +364,11 @@ impl<'tcx> FnCtxt<'_, 'tcx> {
364364
};
365365

366366
let mut fallback_to = |ty| {
367-
let unsafe_infer_vars = unsafe_infer_vars.get_or_init(|| {
368-
let unsafe_infer_vars = compute_unsafe_infer_vars(self.root_ctxt, self.body_id);
369-
debug!(?unsafe_infer_vars);
370-
unsafe_infer_vars
371-
});
372-
373-
let affected_unsafe_infer_vars =
374-
graph::depth_first_search_as_undirected(&coercion_graph, root_vid)
375-
.filter_map(|x| unsafe_infer_vars.get(&x).copied())
376-
.collect::<Vec<_>>();
377-
378-
for (hir_id, span, reason) in affected_unsafe_infer_vars {
379-
self.tcx.emit_node_span_lint(
380-
lint::builtin::NEVER_TYPE_FALLBACK_FLOWING_INTO_UNSAFE,
381-
hir_id,
382-
span,
383-
match reason {
384-
UnsafeUseReason::Call => {
385-
errors::NeverTypeFallbackFlowingIntoUnsafe::Call
386-
}
387-
UnsafeUseReason::Method => {
388-
errors::NeverTypeFallbackFlowingIntoUnsafe::Method
389-
}
390-
UnsafeUseReason::Path => {
391-
errors::NeverTypeFallbackFlowingIntoUnsafe::Path
392-
}
393-
UnsafeUseReason::UnionField => {
394-
errors::NeverTypeFallbackFlowingIntoUnsafe::UnionField
395-
}
396-
UnsafeUseReason::Deref => {
397-
errors::NeverTypeFallbackFlowingIntoUnsafe::Deref
398-
}
399-
},
400-
);
401-
}
367+
self.lint_never_type_fallback_flowing_into_unsafe_code(
368+
&unsafe_infer_vars,
369+
&coercion_graph,
370+
root_vid,
371+
);
402372

403373
diverging_fallback.insert(diverging_ty, ty);
404374
};
@@ -464,6 +434,41 @@ impl<'tcx> FnCtxt<'_, 'tcx> {
464434
diverging_fallback
465435
}
466436

437+
fn lint_never_type_fallback_flowing_into_unsafe_code(
438+
&self,
439+
unsafe_infer_vars: &OnceCell<UnordMap<ty::TyVid, (HirId, Span, UnsafeUseReason)>>,
440+
coercion_graph: &VecGraph<ty::TyVid, true>,
441+
root_vid: ty::TyVid,
442+
) {
443+
let unsafe_infer_vars = unsafe_infer_vars.get_or_init(|| {
444+
let unsafe_infer_vars = compute_unsafe_infer_vars(self.root_ctxt, self.body_id);
445+
debug!(?unsafe_infer_vars);
446+
unsafe_infer_vars
447+
});
448+
449+
let affected_unsafe_infer_vars =
450+
graph::depth_first_search_as_undirected(&coercion_graph, root_vid)
451+
.filter_map(|x| unsafe_infer_vars.get(&x).copied())
452+
.collect::<Vec<_>>();
453+
454+
for (hir_id, span, reason) in affected_unsafe_infer_vars {
455+
self.tcx.emit_node_span_lint(
456+
lint::builtin::NEVER_TYPE_FALLBACK_FLOWING_INTO_UNSAFE,
457+
hir_id,
458+
span,
459+
match reason {
460+
UnsafeUseReason::Call => errors::NeverTypeFallbackFlowingIntoUnsafe::Call,
461+
UnsafeUseReason::Method => errors::NeverTypeFallbackFlowingIntoUnsafe::Method,
462+
UnsafeUseReason::Path => errors::NeverTypeFallbackFlowingIntoUnsafe::Path,
463+
UnsafeUseReason::UnionField => {
464+
errors::NeverTypeFallbackFlowingIntoUnsafe::UnionField
465+
}
466+
UnsafeUseReason::Deref => errors::NeverTypeFallbackFlowingIntoUnsafe::Deref,
467+
},
468+
);
469+
}
470+
}
471+
467472
/// Returns a graph whose nodes are (unresolved) inference variables and where
468473
/// an edge `?A -> ?B` indicates that the variable `?A` is coerced to `?B`.
469474
fn create_coercion_graph(&self) -> VecGraph<ty::TyVid, true> {

0 commit comments

Comments
 (0)