@@ -4,7 +4,7 @@ use rustc::hir::def_id::{DefId, CRATE_DEF_INDEX};
4
4
use rustc:: mir;
5
5
use rustc:: ty:: {
6
6
self ,
7
- layout:: { self , Align , Size , LayoutOf } ,
7
+ layout:: { self , Align , LayoutOf , Size } ,
8
8
} ;
9
9
10
10
use rand:: RngCore ;
@@ -315,11 +315,22 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
315
315
let allocation = this. memory_mut ( ) . get_mut ( ptr. alloc_id ) ?;
316
316
let mut offset = Size :: from_bytes ( 0 ) ;
317
317
318
- for ( value, size) in bits. iter ( ) . zip ( sizes) {
318
+ for ( & value, size) in bits. iter ( ) . zip ( sizes) {
319
+ // If `value` does not fit in `size` bits, we error instead of letting
320
+ // `Scalar::from_int` panic.
321
+ let truncated = truncate ( value as u128 , size) ;
322
+ if sign_extend ( truncated, size) as i128 != value {
323
+ throw_unsup_format ! (
324
+ "Signed value {:#x} does not fit in {} bits" ,
325
+ value,
326
+ size. bits( )
327
+ )
328
+ }
329
+
319
330
allocation. write_scalar (
320
331
tcx,
321
332
ptr. offset ( offset, tcx) ?,
322
- Scalar :: from_int ( * value, size) . into ( ) ,
333
+ Scalar :: from_int ( value, size) . into ( ) ,
323
334
size,
324
335
) ?;
325
336
offset += size;
0 commit comments