File tree Expand file tree Collapse file tree 1 file changed +16
-1
lines changed Expand file tree Collapse file tree 1 file changed +16
-1
lines changed Original file line number Diff line number Diff line change @@ -34,7 +34,22 @@ pub(crate) fn unsized_info<'tcx>(
3434 let old_info =
3535 old_info. expect ( "unsized_info: missing old info for trait upcasting coercion" ) ;
3636 if data_a. principal_def_id ( ) == data_b. principal_def_id ( ) {
37- // A NOP cast that doesn't actually change anything, should be allowed even with invalid vtables.
37+ // Codegen takes advantage of the additional assumption, where if the
38+ // principal trait def id of what's being casted doesn't change,
39+ // then we don't need to adjust the vtable at all. This
40+ // corresponds to the fact that `dyn Tr<A>: Unsize<dyn Tr<B>>`
41+ // requires that `A = B`; we don't allow *upcasting* objects
42+ // between the same trait with different args. If we, for
43+ // some reason, were to relax the `Unsize` trait, it could become
44+ // unsound, so let's assert here that the trait refs are *equal*.
45+ //
46+ // We can use `assert_eq` because the binders should have been anonymized,
47+ // and because higher-ranked equality now requires the binders are equal.
48+ debug_assert_eq ! (
49+ data_a. principal( ) ,
50+ data_b. principal( ) ,
51+ "NOP unsize vtable changed principal trait ref: {data_a} -> {data_b}"
52+ ) ;
3853 return old_info;
3954 }
4055
You can’t perform that action at this time.
0 commit comments