Skip to content

Commit 726373f

Browse files
committed
Auto merge of #1432 - RalfJung:int-size, r=RalfJung
use helper method to compute size of int type
2 parents a6c28f0 + 2c94ad0 commit 726373f

File tree

2 files changed

+10
-7
lines changed

2 files changed

+10
-7
lines changed

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#![allow(incomplete_features)]
1111
#![feature(const_generics)]
1212

13+
extern crate rustc_attr;
1314
extern crate rustc_apfloat;
1415
extern crate rustc_ast;
1516
#[macro_use] extern crate rustc_middle;

src/shims/intrinsics.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
use std::iter;
22
use std::convert::TryFrom;
33

4+
use rustc_attr as attr;
45
use rustc_ast::ast::FloatTy;
56
use rustc_middle::{mir, ty};
7+
use rustc_middle::ty::layout::IntegerExt;
68
use rustc_apfloat::{Float, Round};
7-
use rustc_target::abi::{Align, LayoutOf, Size};
9+
use rustc_target::abi::{Align, Integer, LayoutOf};
810

911
use crate::*;
1012
use helpers::check_arg_count;
@@ -563,11 +565,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
563565
Ok(match dest_ty.kind {
564566
// Unsigned
565567
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());
568570
if res.status.is_empty() {
569571
// 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)
571573
} else {
572574
// `f` was not representable in this integer type.
573575
throw_ub_format!(
@@ -578,11 +580,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
578580
}
579581
// Signed
580582
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());
583585
if res.status.is_empty() {
584586
// 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)
586588
} else {
587589
// `f` was not representable in this integer type.
588590
throw_ub_format!(

0 commit comments

Comments
 (0)