@@ -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