dead_code lint wrongly warns about public repr(C) structs with private fields but no constructors #126169
Closed
Description
Code
#[repr(C)] // <--
pub struct Foo {
pub i: i16,
align: i16
}
Current output
warning: field `align` is never read
--> src/lib.rs:3:5
|
1 | pub struct Foo {
| --- field in this struct
2 | pub i: i16,
3 | align: i16
| ^^^^^
|
= note: `#[warn(dead_code)]` on by default
Desired output
No warnings, or perhaps a different warning.
Rationale and extra context
This warning is probably triggering because there's no constructor that allows a user to set the align
field on struct Foo
. However, there is still a valid way for a user to construct it: std::mem::zeroed()
. The libc crate contains many structs that must be initialized that way. libc could silence these warnings by #[allow(dead_code)]
, but that's too broad a brush. It would silence many much more serious warnings. Could we please either revert to the previous behavior, or else create a new lint for this that can be separately silenced?
Other cases
No response
Rust Version
rustc 1.80.0-nightly (804421dff 2024-06-07)
binary: rustc
commit-hash: 804421dff5542c9c7da5c60257b5dbc849719505
commit-date: 2024-06-07
host: x86_64-unknown-freebsd
release: 1.80.0-nightly
LLVM version: 18.1.7
Anything else?
This is a regression since rustc 1.80.0-nightly (f67a1acc0 2024-06-01)
. That version did not warn in such cases.
Downstream issue: rust-lang/libc#3740