mirror of
https://github.com/rust-lang/rust-clippy
synced 2025-02-25 11:57:25 +00:00
Fix transmute_undefined_repr
when converting between a pointer and a type containing a pointer
This commit is contained in:
parent
73367f8768
commit
c02dff7167
3 changed files with 39 additions and 4 deletions
|
@ -273,7 +273,8 @@ fn reduce_ty<'tcx>(cx: &LateContext<'tcx>, mut ty: Ty<'tcx>) -> ReducedTy<'tcx>
|
||||||
ReducedTy::UnorderedFields(ty)
|
ReducedTy::UnorderedFields(ty)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
ty::Ref(..) | ty::RawPtr(_) => ReducedTy::Ref(ty),
|
ty::Ref(_, ty, _) => ReducedTy::Ref(ty),
|
||||||
|
ty::RawPtr(ty) => ReducedTy::Ref(ty.ty),
|
||||||
_ => ReducedTy::Other(ty),
|
_ => ReducedTy::Other(ty),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,5 +44,19 @@ fn main() {
|
||||||
// issue #8417
|
// issue #8417
|
||||||
let _: Ty2C<Ty2<u32, i32>, ()> = core::mem::transmute(value::<Ty2<u32, i32>>()); // Ok, Ty2 types are the same
|
let _: Ty2C<Ty2<u32, i32>, ()> = core::mem::transmute(value::<Ty2<u32, i32>>()); // Ok, Ty2 types are the same
|
||||||
let _: Ty2<u32, i32> = core::mem::transmute(value::<Ty2C<Ty2<u32, i32>, ()>>()); // Ok, Ty2 types are the same
|
let _: Ty2<u32, i32> = core::mem::transmute(value::<Ty2C<Ty2<u32, i32>, ()>>()); // Ok, Ty2 types are the same
|
||||||
|
|
||||||
|
// Ty2 types are the same
|
||||||
|
let _: &'static mut Ty2<u32, u32> = core::mem::transmute(value::<Box<Ty2<u32, u32>>>()); // Ok
|
||||||
|
// Ty2 types are the same
|
||||||
|
let _: Box<Ty2<u32, u32>> = core::mem::transmute(value::<&'static mut Ty2<u32, u32>>()); // Ok
|
||||||
|
let _: *mut Ty2<u32, u32> = core::mem::transmute(value::<Box<Ty2<u32, u32>>>()); // Ok, Ty2 types are the same
|
||||||
|
let _: Box<Ty2<u32, u32>> = core::mem::transmute(value::<*mut Ty2<u32, u32>>()); // Ok, Ty2 types are the same
|
||||||
|
|
||||||
|
// Different Ty2 instances
|
||||||
|
let _: &'static mut Ty2<u32, f32> = core::mem::transmute(value::<Box<Ty2<u32, u32>>>()); // Lint
|
||||||
|
// Different Ty2 instances
|
||||||
|
let _: Box<Ty2<u32, u32>> = core::mem::transmute(value::<&'static mut Ty2<u32, f32>>()); // Lint
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,17 +28,37 @@ LL | let _: Ty<Ty2<u32, i32>> = core::mem::transmute(value::<Ty2<u32, f3
|
||||||
|
|
|
|
||||||
= note: two instances of the same generic type (`Ty2`) may have different layouts
|
= note: two instances of the same generic type (`Ty2`) may have different layouts
|
||||||
|
|
||||||
error: transmute to `&Ty2<u32, f32>` which has an undefined layout
|
error: transmute from `Ty<&Ty2<u32, i32>>` to `&Ty2<u32, f32>`, both of which have an undefined layout
|
||||||
--> $DIR/transmute_undefined_repr.rs:35:33
|
--> $DIR/transmute_undefined_repr.rs:35:33
|
||||||
|
|
|
|
||||||
LL | let _: &Ty2<u32, f32> = core::mem::transmute(value::<Ty<&Ty2<u32, i32>>>()); // Lint, different Ty2 instances
|
LL | let _: &Ty2<u32, f32> = core::mem::transmute(value::<Ty<&Ty2<u32, i32>>>()); // Lint, different Ty2 instances
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: two instances of the same generic type (`Ty2`) may have different layouts
|
||||||
|
|
||||||
error: transmute from `&Ty2<u32, f32>` which has an undefined layout
|
error: transmute from `&Ty2<u32, f32>` to `Ty<&Ty2<u32, i32>>`, both of which have an undefined layout
|
||||||
--> $DIR/transmute_undefined_repr.rs:36:37
|
--> $DIR/transmute_undefined_repr.rs:36:37
|
||||||
|
|
|
|
||||||
LL | let _: Ty<&Ty2<u32, i32>> = core::mem::transmute(value::<&Ty2<u32, f32>>()); // Lint, different Ty2 instances
|
LL | let _: Ty<&Ty2<u32, i32>> = core::mem::transmute(value::<&Ty2<u32, f32>>()); // Lint, different Ty2 instances
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: two instances of the same generic type (`Ty2`) may have different layouts
|
||||||
|
|
||||||
error: aborting due to 6 previous errors
|
error: transmute from `std::boxed::Box<Ty2<u32, u32>>` to `&mut Ty2<u32, f32>`, both of which have an undefined layout
|
||||||
|
--> $DIR/transmute_undefined_repr.rs:56:45
|
||||||
|
|
|
||||||
|
LL | let _: &'static mut Ty2<u32, f32> = core::mem::transmute(value::<Box<Ty2<u32, u32>>>()); // Lint
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: two instances of the same generic type (`Ty2`) may have different layouts
|
||||||
|
|
||||||
|
error: transmute from `&mut Ty2<u32, f32>` to `std::boxed::Box<Ty2<u32, u32>>`, both of which have an undefined layout
|
||||||
|
--> $DIR/transmute_undefined_repr.rs:58:37
|
||||||
|
|
|
||||||
|
LL | let _: Box<Ty2<u32, u32>> = core::mem::transmute(value::<&'static mut Ty2<u32, f32>>()); // Lint
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: two instances of the same generic type (`Ty2`) may have different layouts
|
||||||
|
|
||||||
|
error: aborting due to 8 previous errors
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue