From afc529dbe71622fc8fcea9389de35734788a11cd Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Mon, 15 Mar 2021 14:22:11 +0100 Subject: [PATCH] Fix assert_assignable adt checking --- src/value_and_place.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/value_and_place.rs b/src/value_and_place.rs index 1a6a301a45b..b97d3900984 100644 --- a/src/value_and_place.rs +++ b/src/value_and_place.rs @@ -705,6 +705,19 @@ pub(crate) fn assert_assignable<'tcx>( } // dyn for<'r> Trait<'r> -> dyn Trait<'_> is allowed } + (&ty::Adt(adt_def_a, substs_a), &ty::Adt(adt_def_b, substs_b)) + if adt_def_a.did == adt_def_b.did => + { + let mut types_a = substs_a.types(); + let mut types_b = substs_b.types(); + loop { + match (types_a.next(), types_b.next()) { + (Some(a), Some(b)) => assert_assignable(fx, a, b), + (None, None) => return, + (Some(_), None) | (None, Some(_)) => panic!("{:#?}/{:#?}", from_ty, to_ty), + } + } + } _ => { assert_eq!( from_ty, to_ty,