From 100c809386149ef2a9dcda3f79d1416bd07dbb59 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 29 Mar 2020 15:14:49 +0200 Subject: [PATCH] also accept fn-ptr-type-changing assignments --- src/librustc_mir/interpret/place.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/librustc_mir/interpret/place.rs b/src/librustc_mir/interpret/place.rs index b16c7ffbffd9..5d4976c09bbb 100644 --- a/src/librustc_mir/interpret/place.rs +++ b/src/librustc_mir/interpret/place.rs @@ -287,10 +287,15 @@ impl<'tcx, Tag: ::std::fmt::Debug> PlaceTy<'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 @@ where // 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, );