@@ -126,23 +126,22 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
126
126
}
127
127
}
128
128
"unchecked_shl" | "unchecked_shr" => {
129
- let bits = dest. layout . size . bytes ( ) as u128 * 8 ;
130
129
let l = self . read_value ( args[ 0 ] ) ?;
131
130
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
- }
140
131
let bin_op = match intrinsic_name {
141
132
"unchecked_shl" => BinOp :: Shl ,
142
133
"unchecked_shr" => BinOp :: Shr ,
143
134
_ => bug ! ( "Already checked for int ops" )
144
135
} ;
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) ?;
146
145
}
147
146
"transmute" => {
148
147
// Go through an allocation, to make sure the completely different layouts
0 commit comments