Auto merge of #81110 - LeSeulArtichaut:fix-unused-unsafe-label, r=RalfJung
Fix `unused_unsafe` label with `unsafe_block_in_unsafe_fn Previously, the following code: ```rust #![feature(unsafe_block_in_unsafe_fn)] unsafe fn foo() { unsafe { unsf() } } unsafe fn unsf() {} ``` Would give the following warning: ``` warning: unnecessary `unsafe` block --> src/lib.rs:4:5 | 4 | unsafe { unsf() } | ^^^^^^ unnecessary `unsafe` block | = note: `#[warn(unused_unsafe)]` on by default ``` which doesn't point out that the block is in an `unsafe fn`. Tracking issue: #71668 cc #79208
This commit is contained in:
commit
47121d6d88
3 changed files with 73 additions and 49 deletions
|
@ -568,24 +568,23 @@ fn is_enclosed(
|
|||
tcx: TyCtxt<'_>,
|
||||
used_unsafe: &FxHashSet<hir::HirId>,
|
||||
id: hir::HirId,
|
||||
) -> Option<(String, hir::HirId)> {
|
||||
unsafe_op_in_unsafe_fn_allowed: bool,
|
||||
) -> Option<(&'static str, hir::HirId)> {
|
||||
let parent_id = tcx.hir().get_parent_node(id);
|
||||
if parent_id != id {
|
||||
if used_unsafe.contains(&parent_id) {
|
||||
Some(("block".to_string(), parent_id))
|
||||
Some(("block", parent_id))
|
||||
} else if let Some(Node::Item(&hir::Item {
|
||||
kind: hir::ItemKind::Fn(ref sig, _, _), ..
|
||||
})) = tcx.hir().find(parent_id)
|
||||
{
|
||||
if sig.header.unsafety == hir::Unsafety::Unsafe
|
||||
&& !tcx.features().unsafe_block_in_unsafe_fn
|
||||
{
|
||||
Some(("fn".to_string(), parent_id))
|
||||
if sig.header.unsafety == hir::Unsafety::Unsafe && unsafe_op_in_unsafe_fn_allowed {
|
||||
Some(("fn", parent_id))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
} else {
|
||||
is_enclosed(tcx, used_unsafe, parent_id)
|
||||
is_enclosed(tcx, used_unsafe, parent_id, unsafe_op_in_unsafe_fn_allowed)
|
||||
}
|
||||
} else {
|
||||
None
|
||||
|
@ -598,7 +597,9 @@ fn report_unused_unsafe(tcx: TyCtxt<'_>, used_unsafe: &FxHashSet<hir::HirId>, id
|
|||
let msg = "unnecessary `unsafe` block";
|
||||
let mut db = lint.build(msg);
|
||||
db.span_label(span, msg);
|
||||
if let Some((kind, id)) = is_enclosed(tcx, used_unsafe, id) {
|
||||
if let Some((kind, id)) =
|
||||
is_enclosed(tcx, used_unsafe, id, unsafe_op_in_unsafe_fn_allowed(tcx, id))
|
||||
{
|
||||
db.span_label(
|
||||
tcx.sess.source_map().guess_head_span(tcx.hir().span(id)),
|
||||
format!("because it's nested under this `unsafe` {}", kind),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue