Skip to content

Commit 911e105

Browse files
committed
Don't lint transmute_undefined_repr on unions.
1 parent 7fd52b5 commit 911e105

File tree

2 files changed

+6
-1
lines changed

2 files changed

+6
-1
lines changed

clippy_lints/src/transmute/transmute_undefined_repr.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,8 @@ fn reduce_ty<'tcx>(cx: &LateContext<'tcx>, mut ty: Ty<'tcx>) -> ReducedTy<'tcx>
312312
ty::Adt(def, _) if def.is_enum() && (def.variants().is_empty() || is_c_void(cx, ty)) => {
313313
ReducedTy::TypeErasure
314314
},
315+
// TODO: Check if the conversion to or from at least one of a union's fields is valid.
316+
ty::Adt(def, _) if def.is_union() => ReducedTy::TypeErasure,
315317
ty::Foreign(_) => ReducedTy::TypeErasure,
316318
ty::Ref(_, ty, _) => ReducedTy::Ref(ty),
317319
ty::RawPtr(ty) => ReducedTy::Ref(ty.ty),

tests/ui/transmute_undefined_repr.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#![allow(clippy::unit_arg, clippy::transmute_ptr_to_ref)]
33

44
use core::ffi::c_void;
5-
use core::mem::{size_of, transmute};
5+
use core::mem::{size_of, transmute, MaybeUninit};
66

77
fn value<T>() -> T {
88
unimplemented!()
@@ -103,5 +103,8 @@ fn main() {
103103
trait Trait {}
104104
let _: (isize, isize) = transmute(value::<&dyn Trait>()); // Ok
105105
let _: &dyn Trait = transmute(value::<(isize, isize)>()); // Ok
106+
107+
let _: MaybeUninit<Ty2<u32, u32>> = transmute(value::<Ty2<u32, u32>>()); // Ok
108+
let _: Ty2<u32, u32> = transmute(value::<MaybeUninit<Ty2<u32, u32>>>()); // Ok
106109
}
107110
}

0 commit comments

Comments
 (0)