also accept fn-ptr-type-changing assignments

This commit is contained in:
Ralf Jung 2020-03-29 15:14:49 +02:00
parent f1ea273133
commit 100c809386

View File

@ -287,10 +287,15 @@ pub fn assert_mem_place(self) -> MPlaceTy<'tcx, Tag> {
fn mir_assign_valid_types<'tcx>(src: Ty<'tcx>, dest: Ty<'tcx>) -> bool {
src == dest
|| match (&src.kind, &dest.kind) {
// After MIR optimizations, there can be assignments that change reference mutability.
(ty::Ref(_, src_pointee, _), ty::Ref(_, dest_pointee, _)) => {
// After optimizations, there can be assignments that change reference mutability.
// This does not affect reference layout, so that is fine.
src_pointee == dest_pointee
}
(ty::FnPtr(_), ty::FnPtr(_)) => {
// All function pointers have equal layout, and thus can be assigned.
true
}
_ => false,
}
}
@ -882,7 +887,7 @@ fn copy_op_no_validate(
// actually "transmute" `&mut T` to `&T` in an assignment without a cast.
assert!(
mir_assign_valid_types(src.layout.ty, dest.layout.ty),
"type mismatch when copying!\nsrc: {:?}, dest: {:?}",
"type mismatch when copying!\nsrc: {:?},\ndest: {:?}",
src.layout.ty,
dest.layout.ty,
);