Open KisaragiEffective opened 1 year ago
All of these cases would be better served by &x.field
or &x as REPR_TYPE
, which does the same operation, but restricts the lifetime and ensures that the types are correct.
the call does not extends lifetime, nor change it to unrelated one.
transmute
returns an "unbound lifetime" so whether a lifetime change happens is very liable to change with small inference changes in the program.
It's perfectly fine that a pedantic
lint lints on possible sound but fragile code.
&(x as REPR_TYPE)
doesn't work as it creates a reference to a temporary. (&x as REPR_TYPE
is casting the reference)
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:
Src
is anenum
and it has#[repr(C)]
or#[repr($integer)]
or#[repr(transparent)]
, andDst
is corresponding type.Src
is anstruct
and it has#[repr(transparent)]
, andDst
is reference to the inner type.Src
is anstruct
which has single field and#[repr(C)]
, andDst
is reference to the field type.Purpose
The lint should not be warn on
&'a E ~> &'a E::Repr
(whereE
is any field-less enum),&'a Transparent ~> &'a Transparent::Inner
(whereTransparent
isstruct
with#[repr(transparent)]
). The former can be achieved by primitive cast, but latter is not:Version
Additional Labels
@rustbot label C-question