Skip to content

unsafe_op_in_unsafe_fn causes unnecessary unsafe warnings #132856

Open
@ehuss

Description

@ehuss

I tried this code:

#![warn(unsafe_op_in_unsafe_fn)]
pub unsafe fn f() {
    let _ = std::mem::zeroed::<i16>();
    unsafe {
        let _ = std::mem::zeroed::<i32>();
    }
}

This causes a diagnostic suggestion to rewrite it to:

#![warn(unsafe_op_in_unsafe_fn)]
pub unsafe fn f() { unsafe {
    let _ = std::mem::zeroed::<i16>();
    unsafe {
        let _ = std::mem::zeroed::<i32>();
    }
}}

However, this in turn causes more warnings which cannot be auto-fixed:

warning: unnecessary `unsafe` block
 --> src/main.rs:4:5
  |
2 | pub unsafe fn f() { unsafe {
  |                     ------ because it's nested under this `unsafe` block
3 |     let _ = std::mem::zeroed::<i16>();
4 |     unsafe {
  |     ^^^^^^ unnecessary `unsafe` block
  |
  = note: `#[warn(unused_unsafe)]` on by default

I don't know if it would be possible to change unused_unsafe to have a machine-applicable suggestion to remove the unsafe keyword. Or maybe unsafe_op_in_unsafe_fn could incorporate those suggestions. I think it probably should not remove the brackets, since that would have a semantic change, and I think would be difficult to get right (though could actually help with some of the problems of the tail-drop-order changes).

Priority-wise, this is just an annoyance since the warnings do not inhibit migration. They just need to be cleaned up manually which for a large codebase could be a lot of work.

Meta

rustc --version --verbose:

rustc 1.84.0-nightly (59cec72a5 2024-11-08)
binary: rustc
commit-hash: 59cec72a57af178767a7b8e7f624b06cc50f1087
commit-date: 2024-11-08
host: aarch64-apple-darwin
release: 1.84.0-nightly
LLVM version: 19.1.3

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsA-edition-2024Area: The 2024 editionA-lintsArea: Lints (warnings about flaws in source code) such as unused_mut.A-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`D-editionDiagnostics: An error or lint that should account for edition differences.D-papercutDiagnostics: An error or lint that needs small tweaks.I-edition-triagedIssue: This issue has been reviewed and triaged by the Edition team.L-false-positiveLint: False positive (should not have fired).L-unsafe_op_in_unsafe_fnLint: unsafe_op_in_unsafe_fnT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions