@@ -26,7 +26,8 @@ impl<const D: u64> EnumSizeOpt<D> {
26
26
ty:: Adt ( adt_def, _substs) if adt_def. is_enum ( ) => {
27
27
let p_e = tcx. param_env ( body_did) ;
28
28
// FIXME(jknodt) handle error better below
29
- let layout = tcx. layout_of ( p_e. and ( ty) ) . unwrap ( ) ;
29
+ let layout =
30
+ if let Ok ( layout) = tcx. layout_of ( p_e. and ( ty) ) { layout } else { return None } ;
30
31
let variants = & layout. variants ;
31
32
match variants {
32
33
Variants :: Single { .. } => None ,
@@ -84,7 +85,16 @@ impl<const D: u64> EnumSizeOpt<D> {
84
85
} else {
85
86
let mut data =
86
87
vec ! [ 0 ; std:: mem:: size_of:: <usize >( ) * num_variants as usize ] ;
87
- data. copy_from_slice ( unsafe { std:: mem:: transmute ( & sizes[ ..] ) } ) ;
88
+
89
+ let mut curr = 0 ;
90
+ for byte in sizes
91
+ . iter ( )
92
+ . flat_map ( |sz| sz. bytes ( ) . to_ne_bytes ( ) )
93
+ . take ( data. len ( ) )
94
+ {
95
+ data[ curr] = byte;
96
+ curr += 1 ;
97
+ }
88
98
let alloc = interpret:: Allocation :: from_bytes (
89
99
data,
90
100
tcx. data_layout . ptr_sized_integer ( ) . align ( & tcx. data_layout ) . abi ,
@@ -123,9 +133,9 @@ impl<const D: u64> EnumSizeOpt<D> {
123
133
kind : StatementKind :: Assign ( box ( place, rval) ) ,
124
134
} ;
125
135
126
- // FIXME(jknodt) do I need to add a storage live here for this place?
127
136
let discr_place = Place {
128
- local : patch. new_temp ( tcx. types . usize , span) ,
137
+ // How do I get the discriminant type?
138
+ local : patch. new_temp ( tcx. types . isize , span) ,
129
139
projection : List :: empty ( ) ,
130
140
} ;
131
141
@@ -155,9 +165,8 @@ impl<const D: u64> EnumSizeOpt<D> {
155
165
) ) ,
156
166
} ;
157
167
158
- // FIXME(jknodt) do I need to add a storage live here for this place?
159
168
let dst = Place {
160
- local : patch. new_temp ( tcx. mk_mut_ptr ( tcx . types . u8 ) , span) ,
169
+ local : patch. new_temp ( tcx. mk_mut_ptr ( ty ) , span) ,
161
170
projection : List :: empty ( ) ,
162
171
} ;
163
172
@@ -169,25 +178,52 @@ impl<const D: u64> EnumSizeOpt<D> {
169
178
) ) ,
170
179
} ;
171
180
172
- // FIXME(jknodt) do I need to add a storage live here for this place?
181
+ let dst_cast_ty = tcx. mk_mut_ptr ( tcx. types . u8 ) ;
182
+ let dst_cast_place = Place {
183
+ local : patch. new_temp ( dst_cast_ty, span) ,
184
+ projection : List :: empty ( ) ,
185
+ } ;
186
+
187
+ let dst_cast = Statement {
188
+ source_info,
189
+ kind : StatementKind :: Assign ( box (
190
+ dst_cast_place,
191
+ Rvalue :: Cast ( CastKind :: Misc , Operand :: Copy ( dst) , dst_cast_ty) ,
192
+ ) ) ,
193
+ } ;
194
+
173
195
let src = Place {
174
- local : patch. new_temp ( tcx. mk_imm_ptr ( tcx . types . u8 ) , span) ,
196
+ local : patch. new_temp ( tcx. mk_imm_ptr ( ty ) , span) ,
175
197
projection : List :: empty ( ) ,
176
198
} ;
177
199
178
200
let src_ptr = Statement {
179
201
source_info,
180
202
kind : StatementKind :: Assign ( box (
181
203
src,
182
- Rvalue :: AddressOf ( Mutability :: Mut , * rhs) ,
204
+ Rvalue :: AddressOf ( Mutability :: Not , * rhs) ,
205
+ ) ) ,
206
+ } ;
207
+
208
+ let src_cast_ty = tcx. mk_imm_ptr ( tcx. types . u8 ) ;
209
+ let src_cast_place = Place {
210
+ local : patch. new_temp ( src_cast_ty, span) ,
211
+ projection : List :: empty ( ) ,
212
+ } ;
213
+
214
+ let src_cast = Statement {
215
+ source_info,
216
+ kind : StatementKind :: Assign ( box (
217
+ src_cast_place,
218
+ Rvalue :: Cast ( CastKind :: Misc , Operand :: Copy ( src) , src_cast_ty) ,
183
219
) ) ,
184
220
} ;
185
221
186
222
let copy_bytes = Statement {
187
223
source_info,
188
224
kind : StatementKind :: CopyNonOverlapping ( box CopyNonOverlapping {
189
- src : Operand :: Copy ( src ) ,
190
- dst : Operand :: Copy ( src ) ,
225
+ src : Operand :: Copy ( src_cast_place ) ,
226
+ dst : Operand :: Copy ( dst_cast_place ) ,
191
227
count : Operand :: Constant (
192
228
box ( Constant {
193
229
span,
@@ -211,7 +247,9 @@ impl<const D: u64> EnumSizeOpt<D> {
211
247
store_discr,
212
248
store_size,
213
249
dst_ptr,
250
+ dst_cast,
214
251
src_ptr,
252
+ src_cast,
215
253
copy_bytes,
216
254
store_dead,
217
255
] ) ;
0 commit comments