Open
Description
cc #6372
Description
transmute_ptr_to_ptr
is too noisy for instance of between references even it is pedantic currently IMO.
This issue suggests avoid triggering if following conditions are met, because those do not trigger UBs:
- the call does not extends lifetime, nor change it to unrelated one.
- at least one of following conditions are met
- the
Src
is anenum
and it has#[repr(C)]
or#[repr($integer)]
or#[repr(transparent)]
, andDst
is corresponding type. - the
Src
is anstruct
and it has#[repr(transparent)]
, andDst
is reference to the inner type. - the
Src
is anstruct
which has single field and#[repr(C)]
, andDst
is reference to the field type.
- the
Purpose
The lint should not be warn on &'a E ~> &'a E::Repr
(where E
is any field-less enum), &'a Transparent ~> &'a Transparent::Inner
(where Transparent
is struct
with #[repr(transparent)]
). The former can be achieved by primitive cast, but latter is not:
#[repr(C)] // also applicable if layout is i*, u*, or transparent
enum ExpReprC {
Zero = 0,
}
#[repr(transparent)] // also applicable if layout is C
struct Transparent(u8);
fn main() {
let m: ExpReprC = ExpReprC::Zero;
let x: &u8 = unsafe { std::mem::transmute(&m) };
let m: Transparent = Transparent(42);
let x: &u8 = unsafe { std::mem::transmute(&m) };
}
Version
rustc 1.73.0-nightly (31395ec38 2023-07-24)
binary: rustc
commit-hash: 31395ec38250b60b380fd3c27e94756aba3557de
commit-date: 2023-07-24
host: x86_64-unknown-linux-gnu
release: 1.73.0-nightly
LLVM version: 16.0.5
Additional Labels
@rustbot label C-question