about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJason Newcomb <jsnewcomb@pm.me>2022-02-16 14:59:04 -0500
committerJason Newcomb <jsnewcomb@pm.me>2022-02-18 15:02:28 -0500
commitd28d19d74cfc94921efa06dffb1d3752d507f9dd (patch)
tree4cbd60e74ca3f54014ed4b849bbc85cd73d7f502
parent7c07022c987a9f90218f70defe48b2ddb0824a84 (diff)
downloadrust-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.rs20
-rw-r--r--tests/ui/transmute_undefined_repr.rs3
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
     }
 }