Skip to content

Commit 43eb925

Browse files
author
Tim
committed
Use binary_op_val instead of doing the check manually.
1 parent 92dd526 commit 43eb925

File tree

1 file changed

+9
-10
lines changed

1 file changed

+9
-10
lines changed

src/librustc_mir/interpret/intrinsics.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -126,23 +126,22 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
126126
}
127127
}
128128
"unchecked_shl" | "unchecked_shr" => {
129-
let bits = dest.layout.size.bytes() as u128 * 8;
130129
let l = self.read_value(args[0])?;
131130
let r = self.read_value(args[1])?;
132-
let r_ty = substs.type_at(0);
133-
let r_layout_of = self.layout_of(r_ty)?;
134-
let r_val = r.to_scalar()?.to_bits(r_layout_of.size)?;
135-
if r_val >= bits {
136-
return err!(Intrinsic(
137-
format!("Overflowing shift by {} in {}", r_val, intrinsic_name),
138-
));
139-
}
140131
let bin_op = match intrinsic_name {
141132
"unchecked_shl" => BinOp::Shl,
142133
"unchecked_shr" => BinOp::Shr,
143134
_ => bug!("Already checked for int ops")
144135
};
145-
self.binop_ignore_overflow(bin_op, l, r, dest)?;
136+
let (val, overflowed) = self.binary_op_val(bin_op, l, r)?;
137+
if overflowed {
138+
let layout = self.layout_of(substs.type_at(0))?;
139+
let r_val = r.to_scalar()?.to_bits(layout.size)?;
140+
return err!(Intrinsic(
141+
format!("Overflowing shift by {} in {}", r_val, intrinsic_name),
142+
));
143+
}
144+
self.write_scalar(val, dest)?;
146145
}
147146
"transmute" => {
148147
// Go through an allocation, to make sure the completely different layouts

0 commit comments

Comments
 (0)