@@ -284,15 +284,18 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
284
284
Abi :: Scalar ( s) if force => Some ( s. primitive ( ) ) ,
285
285
_ => None ,
286
286
} ;
287
- let number_may_have_provenance = !M :: enforce_number_no_provenance ( self ) ;
287
+ let read_provenance = |s : abi:: Primitive , size| {
288
+ // Should be just `s.is_ptr()`, but we support a Miri flag that accepts more
289
+ // questionable ptr-int transmutes.
290
+ let number_may_have_provenance = !M :: enforce_number_no_provenance ( self ) ;
291
+ s. is_ptr ( ) || ( number_may_have_provenance && size == self . pointer_size ( ) )
292
+ } ;
288
293
if let Some ( s) = scalar_layout {
289
294
//FIXME(#96185): let size = s.size(self);
290
295
//FIXME(#96185): assert_eq!(size, mplace.layout.size, "abi::Scalar size does not match layout size");
291
296
let size = mplace. layout . size ; //FIXME(#96185): remove this line
292
- let scalar = alloc. read_scalar (
293
- alloc_range ( Size :: ZERO , size) ,
294
- s. is_ptr ( ) || ( number_may_have_provenance && size == self . pointer_size ( ) ) ,
295
- ) ?;
297
+ let scalar =
298
+ alloc. read_scalar ( alloc_range ( Size :: ZERO , size) , read_provenance ( s, size) ) ?;
296
299
return Ok ( Some ( ImmTy { imm : scalar. into ( ) , layout : mplace. layout } ) ) ;
297
300
}
298
301
let scalar_pair_layout = match mplace. layout . abi {
@@ -310,14 +313,10 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
310
313
let ( a_size, b_size) = ( a. size ( self ) , b. size ( self ) ) ;
311
314
let b_offset = a_size. align_to ( b. align ( self ) . abi ) ;
312
315
assert ! ( b_offset. bytes( ) > 0 ) ; // in `operand_field` we use the offset to tell apart the fields
313
- let a_val = alloc. read_scalar (
314
- alloc_range ( Size :: ZERO , a_size) ,
315
- a. is_ptr ( ) || ( number_may_have_provenance && a_size == self . pointer_size ( ) ) ,
316
- ) ?;
317
- let b_val = alloc. read_scalar (
318
- alloc_range ( b_offset, b_size) ,
319
- b. is_ptr ( ) || ( number_may_have_provenance && b_size == self . pointer_size ( ) ) ,
320
- ) ?;
316
+ let a_val =
317
+ alloc. read_scalar ( alloc_range ( Size :: ZERO , a_size) , read_provenance ( a, a_size) ) ?;
318
+ let b_val =
319
+ alloc. read_scalar ( alloc_range ( b_offset, b_size) , read_provenance ( b, b_size) ) ?;
321
320
return Ok ( Some ( ImmTy {
322
321
imm : Immediate :: ScalarPair ( a_val, b_val) ,
323
322
layout : mplace. layout ,
0 commit comments