diff options
| author | Tim <t.diekmann.3dv@gmail.com> | 2018-09-06 15:11:56 +0200 |
|---|---|---|
| committer | Tim <t.diekmann.3dv@gmail.com> | 2018-09-06 15:11:56 +0200 |
| commit | 43eb9259ec92561033969118d1cc071a91f86084 (patch) | |
| tree | 8c64581283414847a4c557ef2f1d58a5cbb2248f | |
| parent | 92dd526a4e8633b95754e2a8e2ef7169c30706f6 (diff) | |
| download | rust-43eb9259ec92561033969118d1cc071a91f86084.tar.gz rust-43eb9259ec92561033969118d1cc071a91f86084.zip | |
Use binary_op_val instead of doing the check manually.
| -rw-r--r-- | src/librustc_mir/interpret/intrinsics.rs | 19 |
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 |
