File tree 1 file changed +16
-1
lines changed
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>(
34
34
let old_info =
35
35
old_info. expect ( "unsized_info: missing old info for trait upcasting coercion" ) ;
36
36
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
+ ) ;
38
53
return old_info;
39
54
}
40
55
You can’t perform that action at this time.
0 commit comments