about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTim <t.diekmann.3dv@gmail.com>2018-09-06 15:11:56 +0200
committerTim <t.diekmann.3dv@gmail.com>2018-09-06 15:11:56 +0200
commit43eb9259ec92561033969118d1cc071a91f86084 (patch)
tree8c64581283414847a4c557ef2f1d58a5cbb2248f
parent92dd526a4e8633b95754e2a8e2ef7169c30706f6 (diff)
downloadrust-43eb9259ec92561033969118d1cc071a91f86084.tar.gz
rust-43eb9259ec92561033969118d1cc071a91f86084.zip
Use binary_op_val instead of doing the check manually.
-rw-r--r--src/librustc_mir/interpret/intrinsics.rs19
1 files changed, 9 insertions, 10 deletions
diff --git a/src/librustc_mir/interpret/intrinsics.rs b/src/librustc_mir/interpret/intrinsics.rs
index 8637903bd71..48085c21454 100644
--- a/src/librustc_mir/interpret/intrinsics.rs
+++ b/src/librustc_mir/interpret/intrinsics.rs
@@ -126,23 +126,22 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
                 }
             }
             "unchecked_shl" | "unchecked_shr" => {
-                let bits = dest.layout.size.bytes() as u128 * 8;
                 let l = self.read_value(args[0])?;
                 let r = self.read_value(args[1])?;
-                let r_ty = substs.type_at(0);
-                let r_layout_of = self.layout_of(r_ty)?;
-                let r_val =  r.to_scalar()?.to_bits(r_layout_of.size)?;
-                if r_val >= bits {
-                    return err!(Intrinsic(
-                        format!("Overflowing shift by {} in {}", r_val, intrinsic_name),
-                    ));
-                }
                 let bin_op = match intrinsic_name {
                     "unchecked_shl" => BinOp::Shl,
                     "unchecked_shr" => BinOp::Shr,
                     _ => bug!("Already checked for int ops")
                 };
-                self.binop_ignore_overflow(bin_op, l, r, dest)?;
+                let (val, overflowed) = self.binary_op_val(bin_op, l, r)?;
+                if overflowed {
+                    let layout = self.layout_of(substs.type_at(0))?;
+                    let r_val =  r.to_scalar()?.to_bits(layout.size)?;
+                    return err!(Intrinsic(
+                        format!("Overflowing shift by {} in {}", r_val, intrinsic_name),
+                    ));
+                }
+                self.write_scalar(val, dest)?;
             }
             "transmute" => {
                 // Go through an allocation, to make sure the completely different layouts