1
1
use std:: iter;
2
2
use std:: convert:: TryFrom ;
3
3
4
+ use rustc_attr as attr;
4
5
use rustc_ast:: ast:: FloatTy ;
5
6
use rustc_middle:: { mir, ty} ;
7
+ use rustc_middle:: ty:: layout:: IntegerExt ;
6
8
use rustc_apfloat:: { Float , Round } ;
7
- use rustc_target:: abi:: { Align , LayoutOf , Size } ;
9
+ use rustc_target:: abi:: { Align , Integer , LayoutOf } ;
8
10
9
11
use crate :: * ;
10
12
use helpers:: check_arg_count;
@@ -563,11 +565,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
563
565
Ok ( match dest_ty. kind {
564
566
// Unsigned
565
567
ty:: Uint ( t) => {
566
- let width = t . bit_width ( ) . unwrap_or_else ( || this. pointer_size ( ) . bits ( ) ) ;
567
- let res = f. to_u128 ( usize :: try_from ( width ) . unwrap ( ) ) ;
568
+ let size = Integer :: from_attr ( this, attr :: IntType :: UnsignedInt ( t ) ) . size ( ) ;
569
+ let res = f. to_u128 ( size . bits_usize ( ) ) ;
568
570
if res. status . is_empty ( ) {
569
571
// No status flags means there was no further rounding or other loss of precision.
570
- Scalar :: from_uint ( res. value , Size :: from_bits ( width ) )
572
+ Scalar :: from_uint ( res. value , size )
571
573
} else {
572
574
// `f` was not representable in this integer type.
573
575
throw_ub_format ! (
@@ -578,11 +580,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
578
580
}
579
581
// Signed
580
582
ty:: Int ( t) => {
581
- let width = t . bit_width ( ) . unwrap_or_else ( || this. pointer_size ( ) . bits ( ) ) ;
582
- let res = f. to_i128 ( usize :: try_from ( width ) . unwrap ( ) ) ;
583
+ let size = Integer :: from_attr ( this, attr :: IntType :: SignedInt ( t ) ) . size ( ) ;
584
+ let res = f. to_i128 ( size . bits_usize ( ) ) ;
583
585
if res. status . is_empty ( ) {
584
586
// No status flags means there was no further rounding or other loss of precision.
585
- Scalar :: from_int ( res. value , Size :: from_bits ( width ) )
587
+ Scalar :: from_int ( res. value , size )
586
588
} else {
587
589
// `f` was not representable in this integer type.
588
590
throw_ub_format ! (
0 commit comments