]> git.lizzy.rs Git - rust.git/blobdiff - src/num.rs
Fix trans_ptr_binop for fn()
[rust.git] / src / num.rs
index 417b9b5f7172ddf37932e7372a1453187bec8856..49df9b3ac9c5e73c36e642ba1b2155a2aef14e17 100644 (file)
@@ -347,14 +347,11 @@ pub fn trans_ptr_binop<'tcx>(
     in_lhs: CValue<'tcx>,
     in_rhs: CValue<'tcx>,
 ) -> CValue<'tcx> {
-    let not_fat = match in_lhs.layout().ty.sty {
-        ty::RawPtr(TypeAndMut { ty, mutbl: _ }) => {
-            ty.is_sized(fx.tcx.at(DUMMY_SP), ParamEnv::reveal_all())
-        }
-        ty::FnPtr(..) => true,
-        _ => bug!("trans_ptr_binop on non ptr"),
-    };
-    if not_fat {
+    let is_thin_ptr = in_lhs.layout().ty.builtin_deref(true).map(|TypeAndMut { ty, mutbl: _}| {
+        !has_ptr_meta(fx.tcx, ty)
+    }).unwrap_or(true);
+
+    if is_thin_ptr {
         match bin_op {
             BinOp::Eq | BinOp::Lt | BinOp::Le | BinOp::Ne | BinOp::Ge | BinOp::Gt => {
                 let lhs = in_lhs.load_scalar(fx);
@@ -363,8 +360,8 @@ pub fn trans_ptr_binop<'tcx>(
                 return codegen_compare_bin_op(fx, bin_op, false, lhs, rhs);
             }
             BinOp::Offset => {
+                let pointee_ty = in_lhs.layout().ty.builtin_deref(true).unwrap().ty;
                 let (base, offset) = (in_lhs, in_rhs.load_scalar(fx));
-                let pointee_ty = base.layout().ty.builtin_deref(true).unwrap().ty;
                 let pointee_size = fx.layout_of(pointee_ty).size.bytes();
                 let ptr_diff = fx.bcx.ins().imul_imm(offset, pointee_size as i64);
                 let base_val = base.load_scalar(fx);