about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir/hair/pattern/mod.rs5
-rw-r--r--src/librustc_mir/interpret/eval_context.rs14
2 files changed, 10 insertions, 9 deletions
diff --git a/src/librustc_mir/hair/pattern/mod.rs b/src/librustc_mir/hair/pattern/mod.rs
index dda589fd20d..0bb0faf0848 100644
--- a/src/librustc_mir/hair/pattern/mod.rs
+++ b/src/librustc_mir/hair/pattern/mod.rs
@@ -1085,8 +1085,9 @@ pub fn compare_const_vals<'a, 'tcx>(
             },
             ty::TyInt(_) => {
                 let layout = tcx.layout_of(ty).ok()?;
-                let a = interpret::sign_extend(a, layout);
-                let b = interpret::sign_extend(b, layout);
+                assert!(layout.abi.is_signed());
+                let a = interpret::sign_extend(a, layout.size);
+                let b = interpret::sign_extend(b, layout.size);
                 Some((a as i128).cmp(&(b as i128)))
             },
             _ => Some(a.cmp(&b)),
diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs
index cede6d4b22b..2ccd04370c8 100644
--- a/src/librustc_mir/interpret/eval_context.rs
+++ b/src/librustc_mir/interpret/eval_context.rs
@@ -1020,11 +1020,12 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
     }
 
     pub fn sign_extend(&self, value: u128, ty: TyLayout<'_>) -> u128 {
-        super::sign_extend(value, ty)
+        assert!(ty.abi.is_signed());
+        super::sign_extend(value, ty.size)
     }
 
     pub fn truncate(&self, value: u128, ty: TyLayout<'_>) -> u128 {
-        super::truncate(value, ty)
+        super::truncate(value, ty.size)
     }
 
     fn dump_field_name(&self, s: &mut String, ty: Ty<'tcx>, i: usize, variant: usize) -> ::std::fmt::Result {
@@ -1095,9 +1096,8 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M
     }
 }
 
-pub fn sign_extend(value: u128, layout: TyLayout<'_>) -> u128 {
-    let size = layout.size.bits();
-    assert!(layout.abi.is_signed());
+pub fn sign_extend(value: u128, size: Size) -> u128 {
+    let size = size.bits();
     // sign extend
     let shift = 128 - size;
     // shift the unsigned value to the left
@@ -1105,8 +1105,8 @@ pub fn sign_extend(value: u128, layout: TyLayout<'_>) -> u128 {
     (((value << shift) as i128) >> shift) as u128
 }
 
-pub fn truncate(value: u128, layout: TyLayout<'_>) -> u128 {
-    let size = layout.size.bits();
+pub fn truncate(value: u128, size: Size) -> u128 {
+    let size = size.bits();
     let shift = 128 - size;
     // truncate (shift left to drop out leftover values, shift right to fill with zeroes)
     (value << shift) >> shift