@@ -268,15 +268,15 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
268
268
use rustc:: mir:: BinOp :: * ;
269
269
use value:: PrimValKind :: * ;
270
270
271
- if left_kind != right_kind {
271
+ if left_kind != right_kind || ! ( left_kind . is_ptr ( ) || left_kind == PrimValKind :: from_uint_size ( self . memory . pointer_size ( ) ) ) {
272
272
let msg = format ! ( "unimplemented binary op {:?}: {:?} ({:?}), {:?} ({:?})" , bin_op, left, left_kind, right, right_kind) ;
273
273
return Err ( EvalError :: Unimplemented ( msg) ) ;
274
274
}
275
275
276
- let val = match ( bin_op, left_kind ) {
277
- ( Eq , k ) if k . is_ptr ( ) => PrimVal :: from_bool ( left == right) ,
278
- ( Ne , k ) if k . is_ptr ( ) => PrimVal :: from_bool ( left != right) ,
279
- ( Lt , k ) | ( Le , k ) | ( Gt , k ) | ( Ge , k ) if k . is_ptr ( ) => {
276
+ let val = match bin_op {
277
+ Eq => PrimVal :: from_bool ( left == right) ,
278
+ Ne => PrimVal :: from_bool ( left != right) ,
279
+ Lt | Le | Gt | Ge => {
280
280
if left. alloc_id == right. alloc_id {
281
281
PrimVal :: from_bool ( match bin_op {
282
282
Lt => left. offset < right. offset ,
@@ -289,9 +289,9 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
289
289
return Err ( EvalError :: InvalidPointerMath ) ;
290
290
}
291
291
}
292
- ( Sub , k ) if k == PrimValKind :: from_uint_size ( self . memory . pointer_size ( ) ) => {
292
+ Sub => {
293
293
if left. alloc_id == right. alloc_id {
294
- return int_arithmetic ! ( k , overflowing_sub, left. offset, right. offset) ;
294
+ return int_arithmetic ! ( left_kind , overflowing_sub, left. offset, right. offset) ;
295
295
} else {
296
296
return Err ( EvalError :: InvalidPointerMath ) ;
297
297
}
0 commit comments