@@ -44,28 +44,34 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M>
44
44
}
45
45
46
46
Misc => {
47
+ let src_layout = src. layout ;
47
48
let src = self . read_immediate ( src) ?;
48
49
49
- if self . type_is_fat_ptr ( src. layout . ty ) {
50
- match ( * src, self . type_is_fat_ptr ( dest. layout . ty ) ) {
50
+ // There are no casts to references
51
+ assert ! ( !dest. layout. ty. is_region_ptr( ) ) ;
52
+ // Hence we make all casts erase the tag
53
+ let src = src. erase_tag ( ) . with_default_tag ( ) ;
54
+
55
+ if self . type_is_fat_ptr ( src_layout. ty ) {
56
+ match ( src, self . type_is_fat_ptr ( dest. layout . ty ) ) {
51
57
// pointers to extern types
52
58
( Immediate :: Scalar ( _) , _) |
53
59
// slices and trait objects to other slices/trait objects
54
60
( Immediate :: ScalarPair ( ..) , true ) => {
55
61
// No change to immediate
56
- self . write_immediate ( * src, dest) ?;
62
+ self . write_immediate ( src, dest) ?;
57
63
}
58
64
// slices and trait objects to thin pointers (dropping the metadata)
59
65
( Immediate :: ScalarPair ( data, _) , false ) => {
60
66
self . write_scalar ( data, dest) ?;
61
67
}
62
68
}
63
69
} else {
64
- match src . layout . variants {
70
+ match src_layout . variants {
65
71
layout:: Variants :: Single { index } => {
66
- if let Some ( def) = src . layout . ty . ty_adt_def ( ) {
72
+ if let Some ( def) = src_layout . ty . ty_adt_def ( ) {
67
73
// Cast from a univariant enum
68
- assert ! ( src . layout . is_zst( ) ) ;
74
+ assert ! ( src_layout . is_zst( ) ) ;
69
75
let discr_val = def
70
76
. discriminant_for_variant ( * self . tcx , index)
71
77
. val ;
@@ -78,7 +84,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M>
78
84
layout:: Variants :: NicheFilling { .. } => { } ,
79
85
}
80
86
81
- let dest_val = self . cast_scalar ( src. to_scalar ( ) ?, src . layout , dest. layout ) ?;
87
+ let dest_val = self . cast_scalar ( src. to_scalar ( ) ?, src_layout , dest. layout ) ?;
82
88
self . write_scalar ( dest_val, dest) ?;
83
89
}
84
90
}
0 commit comments