diff options
| author | Jason Newcomb <jsnewcomb@pm.me> | 2022-02-16 14:59:04 -0500 |
|---|---|---|
| committer | Jason Newcomb <jsnewcomb@pm.me> | 2022-02-18 15:02:28 -0500 |
| commit | d28d19d74cfc94921efa06dffb1d3752d507f9dd (patch) | |
| tree | 4cbd60e74ca3f54014ed4b849bbc85cd73d7f502 | |
| parent | 7c07022c987a9f90218f70defe48b2ddb0824a84 (diff) | |
| download | rust-d28d19d74cfc94921efa06dffb1d3752d507f9dd.tar.gz rust-d28d19d74cfc94921efa06dffb1d3752d507f9dd.zip | |
Fix `transmute_undefined_repr` when converting between a fat pointer and a type containing a fat pointer
| -rw-r--r-- | clippy_lints/src/transmute/transmute_undefined_repr.rs | 20 | ||||
| -rw-r--r-- | tests/ui/transmute_undefined_repr.rs | 3 |
2 files changed, 21 insertions, 2 deletions
diff --git a/clippy_lints/src/transmute/transmute_undefined_repr.rs b/clippy_lints/src/transmute/transmute_undefined_repr.rs index 2630bc4e9ab..b6cc1676b00 100644 --- a/clippy_lints/src/transmute/transmute_undefined_repr.rs +++ b/clippy_lints/src/transmute/transmute_undefined_repr.rs @@ -19,8 +19,16 @@ pub(super) fn check<'tcx>( while from_ty != to_ty { match reduce_refs(cx, e.span, from_ty, to_ty) { - ReducedTys::FromFatPtr { unsized_ty, to_ty } => match reduce_ty(cx, to_ty) { + ReducedTys::FromFatPtr { + unsized_ty, + to_ty: to_sub_ty, + } => match reduce_ty(cx, to_sub_ty) { ReducedTy::IntArray | ReducedTy::TypeErasure => break, + ReducedTy::Ref(to_sub_ty) => { + from_ty = unsized_ty; + to_ty = to_sub_ty; + continue; + }, _ => { span_lint_and_then( cx, @@ -36,8 +44,16 @@ pub(super) fn check<'tcx>( return true; }, }, - ReducedTys::ToFatPtr { unsized_ty, from_ty } => match reduce_ty(cx, from_ty) { + ReducedTys::ToFatPtr { + unsized_ty, + from_ty: from_sub_ty, + } => match reduce_ty(cx, from_sub_ty) { ReducedTy::IntArray | ReducedTy::TypeErasure => break, + ReducedTy::Ref(from_sub_ty) => { + from_ty = from_sub_ty; + to_ty = unsized_ty; + continue; + }, _ => { span_lint_and_then( cx, diff --git a/tests/ui/transmute_undefined_repr.rs b/tests/ui/transmute_undefined_repr.rs index 84dd1ada8c3..b163d605634 100644 --- a/tests/ui/transmute_undefined_repr.rs +++ b/tests/ui/transmute_undefined_repr.rs @@ -84,5 +84,8 @@ fn main() { let _: [usize; 2] = transmute(value::<&[u8]>()); // Ok, transmute to int array let _: &[u8] = transmute(value::<[usize; 2]>()); // Ok, transmute from int array + + let _: *const [u8] = transmute(value::<Box<[u8]>>()); // Ok + let _: Box<[u8]> = transmute(value::<*mut [u8]>()); // Ok } } |
